aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml2
-rw-r--r--.tx/config2
-rw-r--r--COPYING2
-rw-r--r--Makefile.am18
-rw-r--r--README.md6
-rw-r--r--build-aux/m4/bitcoin_qt.m41
-rw-r--r--configure.ac29
-rw-r--r--contrib/debian/copyright7
-rw-r--r--contrib/gitian-descriptors/gitian-linux.yml4
-rw-r--r--contrib/gitian-descriptors/gitian-osx-signer.yml11
-rw-r--r--contrib/gitian-descriptors/gitian-osx.yml6
-rw-r--r--contrib/gitian-descriptors/gitian-win-signer.yml39
-rw-r--r--contrib/gitian-descriptors/gitian-win.yml11
-rw-r--r--contrib/gitian-downloader/cdecker-key.pgpbin0 -> 2230 bytes
-rw-r--r--contrib/gitian-downloader/erkmos.pgpbin0 -> 10205 bytes
-rw-r--r--contrib/gitian-downloader/linux-download-config5
-rw-r--r--contrib/gitian-downloader/luke-jr-key.pgpbin7322 -> 6518 bytes
-rw-r--r--contrib/gitian-downloader/petertodd-key.pgp1901
-rw-r--r--contrib/gitian-downloader/prab-key.pgp29
-rw-r--r--contrib/gitian-downloader/win32-download-config5
-rw-r--r--contrib/init/bitcoind.openrc2
-rw-r--r--contrib/linearize/example-linearize.cfg10
-rwxr-xr-xcontrib/linearize/linearize-data.py6
-rw-r--r--contrib/macdeploy/Base.lproj/InfoPlist.strings1
-rw-r--r--contrib/macdeploy/DS_Storebin10244 -> 10244 bytes
-rw-r--r--contrib/macdeploy/README.md2
-rwxr-xr-xcontrib/macdeploy/detached-sig-apply.sh23
-rwxr-xr-xcontrib/macdeploy/detached-sig-create.sh27
-rwxr-xr-xcontrib/macdeploy/macdeployqtplus10
-rw-r--r--contrib/seeds/README.md2
-rwxr-xr-xcontrib/seeds/generate-seeds.py (renamed from share/seeds/generate-seeds.py)5
-rwxr-xr-xcontrib/seeds/makeseeds.py83
-rw-r--r--contrib/seeds/nodes_main.txt879
-rw-r--r--contrib/seeds/nodes_test.txt11
-rw-r--r--depends/.gitignore4
-rw-r--r--depends/Makefile40
-rw-r--r--depends/README.md56
-rw-r--r--depends/README.usage34
-rwxr-xr-xdepends/config.guess27
-rwxr-xr-xdepends/config.sub13
-rw-r--r--depends/description.md (renamed from depends/README)18
-rw-r--r--depends/funcs.mk13
-rw-r--r--depends/packages.md (renamed from depends/README.packages)129
-rw-r--r--depends/packages/boost.mk3
-rw-r--r--depends/packages/native_cctools.mk2
-rw-r--r--depends/packages/native_comparisontool.mk6
-rw-r--r--depends/patches/boost/gcc_5_no_cxx11.patch37
-rw-r--r--doc/Doxyfile2
-rw-r--r--doc/README.md7
-rw-r--r--doc/README_osx.txt6
-rw-r--r--doc/README_windows.txt2
-rw-r--r--doc/REST-interface.md53
-rw-r--r--doc/assets-attribution.md1
-rw-r--r--doc/bips.md2
-rw-r--r--doc/build-osx.md27
-rw-r--r--doc/build-unix.md6
-rw-r--r--doc/developer-notes.md8
-rw-r--r--doc/dnsseed-policy.md21
-rw-r--r--doc/gitian-building.md14
-rw-r--r--doc/img/bootstrap1.pngbin55028 -> 0 bytes
-rw-r--r--doc/img/bootstrap2.pngbin35195 -> 0 bytes
-rw-r--r--doc/img/bootstrap4.pngbin110060 -> 0 bytes
-rw-r--r--doc/img/bootstrap5.pngbin20825 -> 0 bytes
-rw-r--r--doc/init.md2
-rw-r--r--doc/release-notes.md36
-rw-r--r--doc/release-notes/release-notes-0.10.1.md143
-rw-r--r--doc/release-notes/release-notes-0.10.2.md86
-rw-r--r--doc/release-notes/release-notes-0.9.4.md95
-rw-r--r--doc/release-notes/release-notes-0.9.5.md60
-rw-r--r--doc/release-process.md51
-rw-r--r--doc/translation_process.md4
-rw-r--r--doc/translation_strings_policy.md110
-rwxr-xr-xqa/pull-tester/rpc-tests.sh43
-rw-r--r--qa/rpc-tests/README.md30
-rwxr-xr-xqa/rpc-tests/bipdersig-p2p.py183
-rwxr-xr-xqa/rpc-tests/bipdersig.py5
-rwxr-xr-xqa/rpc-tests/conflictedbalance.sh2
-rwxr-xr-xqa/rpc-tests/decodescript.py116
-rwxr-xr-xqa/rpc-tests/forknotify.py5
-rwxr-xr-xqa/rpc-tests/fundrawtransaction.py556
-rwxr-xr-xqa/rpc-tests/getblocktemplate_longpoll.py5
-rwxr-xr-xqa/rpc-tests/getblocktemplate_proposals.py5
-rwxr-xr-xqa/rpc-tests/getchaintips.py4
-rwxr-xr-xqa/rpc-tests/httpbasics.py38
-rwxr-xr-xqa/rpc-tests/invalidateblock.py5
-rwxr-xr-xqa/rpc-tests/invalidblockrequest.py115
-rwxr-xr-xqa/rpc-tests/keypool.py4
-rwxr-xr-xqa/rpc-tests/listtransactions.py5
-rwxr-xr-xqa/rpc-tests/maxblocksinflight.py101
-rwxr-xr-xqa/rpc-tests/mempool_coinbase_spends.py5
-rwxr-xr-xqa/rpc-tests/mempool_resurrect_test.py6
-rwxr-xr-xqa/rpc-tests/mempool_spendcoinbase.py5
-rwxr-xr-xqa/rpc-tests/merkle_blocks.py89
-rwxr-xr-xqa/rpc-tests/nodehandling.py69
-rwxr-xr-xqa/rpc-tests/p2p-acceptblock.py226
-rwxr-xr-xqa/rpc-tests/proxy_test.py180
-rwxr-xr-xqa/rpc-tests/pruning.py356
-rw-r--r--qa/rpc-tests/python-bitcoinrpc/bitcoinrpc/.gitignore1
-rw-r--r--qa/rpc-tests/python-bitcoinrpc/setup.py15
-rwxr-xr-xqa/rpc-tests/rawtransactions.py144
-rwxr-xr-xqa/rpc-tests/receivedby.py5
-rwxr-xr-xqa/rpc-tests/reindex.py33
-rwxr-xr-xqa/rpc-tests/rest.py193
-rwxr-xr-xqa/rpc-tests/rpcbind_test.py6
-rwxr-xr-xqa/rpc-tests/script_test.py253
-rwxr-xr-xqa/rpc-tests/signrawtransactions.py109
-rwxr-xr-xqa/rpc-tests/smartfees.py286
-rw-r--r--qa/rpc-tests/test_framework/__init__.py (renamed from qa/rpc-tests/python-bitcoinrpc/bitcoinrpc/__init__.py)0
-rw-r--r--qa/rpc-tests/test_framework/authproxy.py (renamed from qa/rpc-tests/python-bitcoinrpc/bitcoinrpc/authproxy.py)0
-rw-r--r--qa/rpc-tests/test_framework/bignum.py102
-rw-r--r--qa/rpc-tests/test_framework/blockstore.py127
-rw-r--r--qa/rpc-tests/test_framework/blocktools.py65
-rwxr-xr-xqa/rpc-tests/test_framework/comptool.py341
-rwxr-xr-xqa/rpc-tests/test_framework/mininode.py1256
-rw-r--r--qa/rpc-tests/test_framework/netutil.py (renamed from qa/rpc-tests/netutil.py)0
-rw-r--r--qa/rpc-tests/test_framework/script.py896
-rw-r--r--qa/rpc-tests/test_framework/socks5.py160
-rwxr-xr-xqa/rpc-tests/test_framework/test_framework.py (renamed from qa/rpc-tests/test_framework.py)47
-rw-r--r--qa/rpc-tests/test_framework/util.py (renamed from qa/rpc-tests/util.py)37
-rwxr-xr-xqa/rpc-tests/txn_doublespend.py5
-rwxr-xr-xqa/rpc-tests/wallet.py34
-rwxr-xr-xqa/rpc-tests/walletbackup.py4
-rwxr-xr-xqa/rpc-tests/zapwallettxes.py4
-rwxr-xr-xshare/genbuild.sh2
-rw-r--r--share/qt/Info.plist.in8
-rw-r--r--share/seeds/nodes_main.txt540
-rw-r--r--share/seeds/nodes_test.txt5
-rw-r--r--src/Makefile.am74
-rw-r--r--src/Makefile.qt.include1
-rw-r--r--src/Makefile.test.include3
-rw-r--r--src/addrman.cpp15
-rw-r--r--src/addrman.h31
-rw-r--r--src/alert.cpp4
-rw-r--r--src/alert.h2
-rw-r--r--src/amount.h10
-rw-r--r--src/arith_uint256.h2
-rw-r--r--src/base58.h6
-rw-r--r--src/bitcoin-cli-res.rc4
-rw-r--r--src/bitcoin-cli.cpp32
-rw-r--r--src/bitcoin-tx-res.rc35
-rw-r--r--src/bitcoin-tx.cpp27
-rw-r--r--src/bitcoind-res.rc4
-rw-r--r--src/bitcoind.cpp7
-rw-r--r--src/bloom.cpp83
-rw-r--r--src/bloom.h36
-rw-r--r--src/chain.cpp7
-rw-r--r--src/chain.h2
-rw-r--r--src/chainparams.cpp151
-rw-r--r--src/chainparams.h33
-rw-r--r--src/chainparamsbase.h4
-rw-r--r--src/chainparamsseeds.h1273
-rw-r--r--src/checkpoints.cpp40
-rw-r--r--src/checkpoints.h15
-rw-r--r--src/checkqueue.h6
-rw-r--r--src/clientversion.h2
-rw-r--r--src/coincontrol.h5
-rw-r--r--src/coins.cpp24
-rw-r--r--src/coins.h20
-rw-r--r--src/compat/endian.h2
-rw-r--r--src/consensus/consensus.h16
-rw-r--r--src/consensus/params.h9
-rw-r--r--src/consensus/validation.h80
-rw-r--r--src/core_io.h2
-rw-r--r--src/core_read.cpp2
-rw-r--r--src/hash.cpp8
-rw-r--r--src/hash.h4
-rw-r--r--src/init.cpp351
-rw-r--r--src/init.h3
-rw-r--r--src/json/LICENSE.txt24
-rw-r--r--src/json/json_spirit.h18
-rw-r--r--src/json/json_spirit_error_position.h54
-rw-r--r--src/json/json_spirit_reader.cpp137
-rw-r--r--src/json/json_spirit_reader.h62
-rw-r--r--src/json/json_spirit_reader_template.h612
-rw-r--r--src/json/json_spirit_stream_reader.h70
-rw-r--r--src/json/json_spirit_utils.h61
-rw-r--r--src/json/json_spirit_value.cpp8
-rw-r--r--src/json/json_spirit_value.h534
-rw-r--r--src/json/json_spirit_writer.cpp95
-rw-r--r--src/json/json_spirit_writer.h50
-rw-r--r--src/json/json_spirit_writer_template.h249
-rw-r--r--src/key.cpp73
-rw-r--r--src/key.h18
-rw-r--r--src/main.cpp883
-rw-r--r--src/main.h178
-rw-r--r--src/memusage.h111
-rw-r--r--src/merkleblock.cpp29
-rw-r--r--src/merkleblock.h7
-rw-r--r--src/miner.cpp95
-rw-r--r--src/miner.h7
-rw-r--r--src/mruset.h36
-rw-r--r--src/net.cpp135
-rw-r--r--src/net.h28
-rw-r--r--src/netbase.cpp201
-rw-r--r--src/netbase.h19
-rw-r--r--src/policy/fees.cpp529
-rw-r--r--src/policy/fees.h276
-rw-r--r--src/pow.cpp26
-rw-r--r--src/pow.h3
-rw-r--r--src/primitives/block.h3
-rw-r--r--src/protocol.cpp1
-rw-r--r--src/protocol.h3
-rw-r--r--src/pubkey.cpp10
-rw-r--r--src/pubkey.h10
-rw-r--r--src/qt/askpassphrasedialog.cpp2
-rw-r--r--src/qt/bitcoin.cpp7
-rw-r--r--src/qt/bitcoin.qrc1
-rw-r--r--src/qt/bitcoingui.cpp5
-rw-r--r--src/qt/bitcoinstrings.cpp98
-rw-r--r--src/qt/clientmodel.cpp2
-rw-r--r--src/qt/coincontroldialog.cpp22
-rw-r--r--src/qt/forms/overviewpage.ui64
-rw-r--r--src/qt/forms/rpcconsole.ui122
-rw-r--r--src/qt/forms/sendcoinsentry.ui41
-rw-r--r--src/qt/guiutil.cpp23
-rw-r--r--src/qt/guiutil.h10
-rw-r--r--src/qt/locale/bitcoin_ach.ts2
-rw-r--r--src/qt/locale/bitcoin_af_ZA.ts18
-rw-r--r--src/qt/locale/bitcoin_ar.ts108
-rw-r--r--src/qt/locale/bitcoin_be_BY.ts650
-rw-r--r--src/qt/locale/bitcoin_bg.ts1230
-rw-r--r--src/qt/locale/bitcoin_bs.ts2
-rw-r--r--src/qt/locale/bitcoin_ca.ts610
-rw-r--r--src/qt/locale/bitcoin_ca@valencia.ts257
-rw-r--r--src/qt/locale/bitcoin_ca_ES.ts610
-rw-r--r--src/qt/locale/bitcoin_cmn.ts2
-rw-r--r--src/qt/locale/bitcoin_cs.ts572
-rw-r--r--src/qt/locale/bitcoin_cy.ts18
-rw-r--r--src/qt/locale/bitcoin_da.ts524
-rw-r--r--src/qt/locale/bitcoin_de.ts513
-rw-r--r--src/qt/locale/bitcoin_el_GR.ts492
-rw-r--r--src/qt/locale/bitcoin_en.ts1037
-rw-r--r--src/qt/locale/bitcoin_eo.ts244
-rw-r--r--src/qt/locale/bitcoin_es.ts460
-rw-r--r--src/qt/locale/bitcoin_es_CL.ts205
-rw-r--r--src/qt/locale/bitcoin_es_DO.ts216
-rw-r--r--src/qt/locale/bitcoin_es_MX.ts98
-rw-r--r--src/qt/locale/bitcoin_es_UY.ts22
-rw-r--r--src/qt/locale/bitcoin_et.ts497
-rw-r--r--src/qt/locale/bitcoin_eu_ES.ts22
-rw-r--r--src/qt/locale/bitcoin_fa.ts220
-rw-r--r--src/qt/locale/bitcoin_fa_IR.ts61
-rw-r--r--src/qt/locale/bitcoin_fi.ts543
-rw-r--r--src/qt/locale/bitcoin_fr.ts516
-rw-r--r--src/qt/locale/bitcoin_fr_CA.ts10
-rw-r--r--src/qt/locale/bitcoin_gl.ts210
-rw-r--r--src/qt/locale/bitcoin_gu_IN.ts2
-rw-r--r--src/qt/locale/bitcoin_he.ts261
-rw-r--r--src/qt/locale/bitcoin_hi_IN.ts55
-rw-r--r--src/qt/locale/bitcoin_hr.ts96
-rw-r--r--src/qt/locale/bitcoin_hu.ts276
-rw-r--r--src/qt/locale/bitcoin_id_ID.ts158
-rw-r--r--src/qt/locale/bitcoin_it.ts1120
-rw-r--r--src/qt/locale/bitcoin_ja.ts1446
-rw-r--r--src/qt/locale/bitcoin_ka.ts204
-rw-r--r--src/qt/locale/bitcoin_kk_KZ.ts10
-rw-r--r--src/qt/locale/bitcoin_ko_KR.ts190
-rw-r--r--src/qt/locale/bitcoin_ky.ts12
-rw-r--r--src/qt/locale/bitcoin_la.ts204
-rw-r--r--src/qt/locale/bitcoin_lt.ts125
-rw-r--r--src/qt/locale/bitcoin_lv_LV.ts166
-rw-r--r--src/qt/locale/bitcoin_mn.ts69
-rw-r--r--src/qt/locale/bitcoin_ms_MY.ts10
-rw-r--r--src/qt/locale/bitcoin_nb.ts539
-rw-r--r--src/qt/locale/bitcoin_nl.ts557
-rw-r--r--src/qt/locale/bitcoin_pam.ts132
-rw-r--r--src/qt/locale/bitcoin_pl.ts917
-rw-r--r--src/qt/locale/bitcoin_pt_BR.ts711
-rw-r--r--src/qt/locale/bitcoin_pt_PT.ts653
-rw-r--r--src/qt/locale/bitcoin_ro_RO.ts1629
-rw-r--r--src/qt/locale/bitcoin_ru.ts378
-rw-r--r--src/qt/locale/bitcoin_sah.ts6
-rw-r--r--src/qt/locale/bitcoin_sk.ts513
-rw-r--r--src/qt/locale/bitcoin_sl_SI.ts174
-rw-r--r--src/qt/locale/bitcoin_sq.ts198
-rw-r--r--src/qt/locale/bitcoin_sr.ts38
-rw-r--r--src/qt/locale/bitcoin_sv.ts518
-rw-r--r--src/qt/locale/bitcoin_th_TH.ts14
-rw-r--r--src/qt/locale/bitcoin_tr.ts520
-rw-r--r--src/qt/locale/bitcoin_uk.ts322
-rw-r--r--src/qt/locale/bitcoin_ur_PK.ts14
-rw-r--r--src/qt/locale/bitcoin_uz@Cyrl.ts134
-rw-r--r--src/qt/locale/bitcoin_vi.ts10
-rw-r--r--src/qt/locale/bitcoin_vi_VN.ts630
-rw-r--r--src/qt/locale/bitcoin_zh_CN.ts946
-rw-r--r--src/qt/locale/bitcoin_zh_HK.ts2
-rw-r--r--src/qt/locale/bitcoin_zh_TW.ts376
-rw-r--r--src/qt/optionsdialog.cpp2
-rw-r--r--src/qt/optionsmodel.cpp4
-rw-r--r--src/qt/overviewpage.cpp14
-rw-r--r--src/qt/paymentrequestplus.cpp13
-rw-r--r--src/qt/paymentrequestplus.h1
-rw-r--r--src/qt/paymentserver.cpp36
-rw-r--r--src/qt/paymentserver.h2
-rw-r--r--src/qt/peertablemodel.cpp5
-rw-r--r--src/qt/recentrequeststablemodel.cpp3
-rw-r--r--src/qt/res/bitcoin-qt-res.rc2
-rw-r--r--src/qt/res/icons/warning.pngbin0 -> 3810 bytes
-rw-r--r--src/qt/rpcconsole.cpp98
-rw-r--r--src/qt/rpcconsole.h8
-rw-r--r--src/qt/scicon.cpp16
-rw-r--r--src/qt/sendcoinsdialog.cpp16
-rw-r--r--src/qt/sendcoinsdialog.h2
-rw-r--r--src/qt/sendcoinsentry.cpp14
-rw-r--r--src/qt/splashscreen.cpp5
-rw-r--r--src/qt/transactiondesc.cpp6
-rw-r--r--src/qt/transactionrecord.cpp3
-rw-r--r--src/qt/walletmodel.cpp1
-rw-r--r--src/rest.cpp289
-rw-r--r--src/rpcblockchain.cpp234
-rw-r--r--src/rpcclient.cpp39
-rw-r--r--src/rpcclient.h10
-rw-r--r--src/rpcmining.cpp144
-rw-r--r--src/rpcmisc.cpp77
-rw-r--r--src/rpcnet.cpp207
-rw-r--r--src/rpcprotocol.cpp29
-rw-r--r--src/rpcprotocol.h14
-rw-r--r--src/rpcrawtransaction.cpp350
-rw-r--r--src/rpcserver.cpp346
-rw-r--r--src/rpcserver.h237
-rw-r--r--src/scheduler.cpp128
-rw-r--r--src/scheduler.h83
-rw-r--r--src/script/interpreter.cpp83
-rw-r--r--src/script/interpreter.h11
-rw-r--r--src/script/script.h24
-rw-r--r--src/script/script_error.cpp4
-rw-r--r--src/script/script_error.h4
-rw-r--r--src/script/sign.cpp36
-rw-r--r--src/script/sign.h8
-rw-r--r--src/script/standard.h3
-rw-r--r--src/secp256k1/.gitignore1
-rw-r--r--src/secp256k1/.travis.yml41
-rw-r--r--src/secp256k1/include/secp256k1.h150
-rw-r--r--src/secp256k1/src/bench.h2
-rw-r--r--src/secp256k1/src/bench_recover.c8
-rw-r--r--src/secp256k1/src/bench_sign.c8
-rw-r--r--src/secp256k1/src/bench_verify.c11
-rw-r--r--src/secp256k1/src/ecdsa.h7
-rw-r--r--src/secp256k1/src/ecdsa_impl.h84
-rw-r--r--src/secp256k1/src/eckey.h8
-rw-r--r--src/secp256k1/src/eckey_impl.h48
-rw-r--r--src/secp256k1/src/ecmult.h18
-rw-r--r--src/secp256k1/src/ecmult_gen.h30
-rw-r--r--src/secp256k1/src/ecmult_gen_impl.h134
-rw-r--r--src/secp256k1/src/ecmult_impl.h113
-rw-r--r--src/secp256k1/src/field.h3
-rw-r--r--src/secp256k1/src/field_10x26_impl.h31
-rw-r--r--src/secp256k1/src/field_5x52_impl.h26
-rw-r--r--src/secp256k1/src/field_impl.h99
-rw-r--r--src/secp256k1/src/group.h3
-rw-r--r--src/secp256k1/src/group_impl.h41
-rw-r--r--src/secp256k1/src/hash_impl.h15
-rw-r--r--src/secp256k1/src/num_gmp_impl.h49
-rw-r--r--src/secp256k1/src/scalar_impl.h114
-rw-r--r--src/secp256k1/src/secp256k1.c125
-rw-r--r--src/secp256k1/src/tests.c453
-rw-r--r--src/serialize.h4
-rw-r--r--src/support/allocators/secure.h6
-rw-r--r--src/support/allocators/zeroafterfree.h6
-rw-r--r--src/support/pagelocker.h7
-rw-r--r--src/sync.cpp5
-rw-r--r--src/sync.h23
-rw-r--r--src/test/Checkpoints_tests.cpp20
-rw-r--r--src/test/alert_tests.cpp63
-rw-r--r--src/test/base58_tests.cpp58
-rw-r--r--src/test/bip32_tests.cpp1
-rw-r--r--src/test/bloom_tests.cpp78
-rw-r--r--src/test/checkblock_tests.cpp9
-rw-r--r--src/test/coins_tests.cpp27
-rw-r--r--src/test/data/script_invalid.json20
-rw-r--r--src/test/data/script_valid.json3
-rw-r--r--src/test/data/tx_invalid.json70
-rw-r--r--src/test/data/tx_valid.json42
-rw-r--r--src/test/main_tests.cpp39
-rw-r--r--src/test/miner_tests.cpp18
-rw-r--r--src/test/mruset_tests.cpp126
-rw-r--r--src/test/netbase_tests.cpp5
-rw-r--r--src/test/policyestimator_tests.cpp186
-rw-r--r--src/test/pow_tests.cpp24
-rw-r--r--src/test/rpc_tests.cpp147
-rw-r--r--src/test/rpc_wallet_tests.cpp21
-rw-r--r--src/test/scheduler_tests.cpp119
-rw-r--r--src/test/script_tests.cpp56
-rw-r--r--src/test/scriptnum_tests.cpp2
-rw-r--r--src/test/sighash_tests.cpp24
-rw-r--r--src/test/test_bitcoin.cpp5
-rw-r--r--src/test/transaction_tests.cpp59
-rw-r--r--src/test/univalue_tests.cpp72
-rw-r--r--src/test/util_tests.cpp109
-rw-r--r--src/txdb.cpp5
-rw-r--r--src/txdb.h2
-rw-r--r--src/txmempool.cpp386
-rw-r--r--src/txmempool.h20
-rw-r--r--src/ui_interface.h13
-rw-r--r--src/univalue/gen.cpp1
-rw-r--r--src/univalue/univalue.cpp107
-rw-r--r--src/univalue/univalue.h102
-rw-r--r--src/univalue/univalue_escapes.h2
-rw-r--r--src/univalue/univalue_read.cpp15
-rw-r--r--src/univalue/univalue_write.cpp9
-rw-r--r--src/util.cpp22
-rw-r--r--src/util.h59
-rw-r--r--src/utilmoneystr.cpp4
-rw-r--r--src/utilmoneystr.h2
-rw-r--r--src/utilstrencodings.cpp45
-rw-r--r--src/utilstrencodings.h18
-rw-r--r--src/utiltime.cpp4
-rw-r--r--src/validationinterface.cpp9
-rw-r--r--src/validationinterface.h23
-rw-r--r--src/wallet/crypter.h6
-rw-r--r--src/wallet/db.cpp12
-rw-r--r--src/wallet/db.h16
-rw-r--r--src/wallet/rpcdump.cpp50
-rw-r--r--src/wallet/rpcwallet.cpp515
-rw-r--r--src/wallet/wallet.cpp208
-rw-r--r--src/wallet/wallet.h32
-rw-r--r--src/wallet/wallet_ismine.h6
-rw-r--r--src/wallet/walletdb.cpp4
-rw-r--r--src/wallet/walletdb.h7
419 files changed, 33640 insertions, 16635 deletions
diff --git a/.travis.yml b/.travis.yml
index 44ea7b62d7..1f6eb15c27 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -16,6 +16,8 @@ env:
- CCACHE_COMPRESS=1
- BASE_OUTDIR=$TRAVIS_BUILD_DIR/out
- SDK_URL=https://bitcoincore.org/depends-sources/sdks
+ - PYTHON_DEBUG=1
+ - WINEDEBUG=fixme-all
cache:
apt: true
directories:
diff --git a/.tx/config b/.tx/config
index 472d27b46f..6c534f06e4 100644
--- a/.tx/config
+++ b/.tx/config
@@ -1,7 +1,7 @@
[main]
host = https://www.transifex.com
-[bitcoin.qt-translation-010x]
+[bitcoin.qt-translation-011x]
file_filter = src/qt/locale/bitcoin_<lang>.ts
source_file = src/qt/locale/bitcoin_en.ts
source_lang = en
diff --git a/COPYING b/COPYING
index 9fd3266622..cae0f5b6f4 100644
--- a/COPYING
+++ b/COPYING
@@ -1,4 +1,4 @@
-Copyright (c) 2009-2015 Bitcoin Developers
+Copyright (c) 2009-2015 The Bitcoin Core developers
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/Makefile.am b/Makefile.am
index c59648fd02..2f478e4b41 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -15,10 +15,11 @@ BITCOIN_CLI_BIN=$(top_builddir)/src/bitcoin-cli$(EXEEXT)
BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT)
OSX_APP=Bitcoin-Qt.app
-OSX_DMG=Bitcoin-Qt.dmg
+OSX_DMG=Bitcoin-Core.dmg
OSX_BACKGROUND_IMAGE=background.tiff
OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus
OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist
+OSX_BASE_LPROJ_DIR=$(top_srcdir)/contrib/macdeploy/Base.lproj/InfoPlist.strings
OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns
OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed
OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW
@@ -30,7 +31,7 @@ WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \
$(top_srcdir)/share/pixmaps/nsis-wizard.bmp \
$(top_srcdir)/doc/README_windows.txt
-OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) \
+OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) $(OSX_BASE_LPROJ_DIR) \
$(top_srcdir)/contrib/macdeploy/$(OSX_BACKGROUND_IMAGE) \
$(top_srcdir)/contrib/macdeploy/DS_Store \
$(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \
@@ -59,8 +60,9 @@ $(BITCOIN_WIN_INSTALLER): all-recursive
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIND_BIN) $(top_builddir)/release
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIN_QT_BIN) $(top_builddir)/release
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIN_CLI_BIN) $(top_builddir)/release
- @test -f $(MAKENSIS) && $(MAKENSIS) $(top_builddir)/share/setup.nsi || \
+ @test -f $(MAKENSIS) && $(MAKENSIS) -V2 $(top_builddir)/share/setup.nsi || \
echo error: could not build $@
+ @echo built $@
$(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE
$(MAKE) -C src $(patsubst src/%,%,$@)
@@ -71,7 +73,7 @@ $(OSX_APP)/Contents/PkgInfo:
$(OSX_APP)/Contents/Resources/empty.lproj:
$(MKDIR_P) $(@D)
- @touch $@
+ @touch $@
$(OSX_APP)/Contents/Info.plist: $(OSX_PLIST)
$(MKDIR_P) $(@D)
@@ -85,9 +87,13 @@ $(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(BITCOIN_QT_BIN)
$(MKDIR_P) $(@D)
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@
+$(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings: $(OSX_BASE_LPROJ_DIR)
+ $(MKDIR_P) $(@D)
+ $(INSTALL_DATA) $< $@
+
OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \
$(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \
- $(OSX_APP)/Contents/MacOS/Bitcoin-Qt
+ $(OSX_APP)/Contents/MacOS/Bitcoin-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings
if BUILD_DARWIN
$(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING)
@@ -105,7 +111,7 @@ $(APP_DIST_DIR)/Applications:
$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt
$(OSX_DMG): $(APP_DIST_EXTRAS)
- $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "Bitcoin-Qt" -no-pad -r -apple -o $@ dist
+ $(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "Bitcoin-Core" -no-pad -r -apple -o $@ dist
$(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): contrib/macdeploy/$(OSX_BACKGROUND_IMAGE)
$(MKDIR_P) $(@D)
diff --git a/README.md b/README.md
index 67c5ed5b41..594d98c39f 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,7 @@ development team members simply pulls it.
If it is a *more complicated or potentially controversial* change, then the patch
submitter will be asked to start a discussion (if they haven't already) on the
-[mailing list](http://sourceforge.net/mailarchive/forum.php?forum_name=bitcoin-development).
+[mailing list](https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev)
The patch will be accepted if there is broad consensus that it is a good thing.
Developers should expect to rework and resubmit patches if the code doesn't
@@ -58,6 +58,10 @@ lots of money.
Developers are strongly encouraged to write unit tests for new code, and to
submit new unit tests for old code. Unit tests can be compiled and run (assuming they weren't disabled in configure) with: `make check`
+There are also regression and integration tests of the RPC interface, written
+in Python, that are run automatically on the build server.
+These tests can be run with: `qa/pull-tester/rpc-tests.sh`
+
Every pull request is built for both Windows and Linux on a dedicated server,
and unit and sanity tests are automatically run. The binaries produced may be
used for manual QA testing — a link to them will appear in a comment on the
diff --git a/build-aux/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4
index 2a72262653..570ccb8b6f 100644
--- a/build-aux/m4/bitcoin_qt.m4
+++ b/build-aux/m4/bitcoin_qt.m4
@@ -6,6 +6,7 @@ AC_DEFUN([BITCOIN_QT_FAIL],[
AC_MSG_WARN([$1; bitcoin-qt frontend will not be built])
fi
bitcoin_enable_qt=no
+ bitcoin_enable_qt_test=no
else
AC_MSG_ERROR([$1])
fi
diff --git a/configure.ac b/configure.ac
index 2c918218bb..8a54c2f76e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,12 +1,12 @@
dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N)
AC_PREREQ([2.60])
define(_CLIENT_VERSION_MAJOR, 0)
-define(_CLIENT_VERSION_MINOR, 10)
+define(_CLIENT_VERSION_MINOR, 11)
define(_CLIENT_VERSION_REVISION, 99)
define(_CLIENT_VERSION_BUILD, 0)
define(_CLIENT_VERSION_IS_RELEASE, false)
define(_COPYRIGHT_YEAR, 2015)
-AC_INIT([Bitcoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@bitcoin.org],[bitcoin])
+AC_INIT([Bitcoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/bitcoin/bitcoin/issues],[bitcoin])
AC_CONFIG_SRCDIR([src/main.cpp])
AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
AC_CONFIG_AUX_DIR([build-aux])
@@ -162,7 +162,7 @@ fi
if test "x$CXXFLAGS_overridden" = "xno"; then
CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter"
fi
-CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS"
+CPPFLAGS="$CPPFLAGS -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS"
AC_ARG_WITH([utils],
[AS_HELP_STRING([--with-utils],
@@ -438,7 +438,7 @@ if test x$TARGET_OS = xdarwin; then
AX_CHECK_LINK_FLAG([[-Wl,-dead_strip]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip"])
fi
-AC_CHECK_HEADERS([endian.h byteswap.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h sys/prctl.h])
+AC_CHECK_HEADERS([endian.h sys/endian.h byteswap.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h sys/prctl.h])
AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])])
AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])])
@@ -447,6 +447,8 @@ AC_CHECK_DECLS([strnlen])
AC_CHECK_DECLS([le16toh, le32toh, le64toh, htole16, htole32, htole64, be16toh, be32toh, be64toh, htobe16, htobe32, htobe64],,,
[#if HAVE_ENDIAN_H
#include <endian.h>
+ #elif HAVE_SYS_ENDIAN_H
+ #include <sys/endian.h>
#endif])
AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64],,,
@@ -590,17 +592,15 @@ fi
if test x$use_boost = xyes; then
-BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB"
+BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB $BOOST_CHRONO_LIB"
dnl Boost >= 1.50 uses sleep_for rather than the now-deprecated sleep, however
dnl it was broken from 1.50 to 1.52 when backed by nanosleep. Use sleep_for if
dnl a working version is available, else fall back to sleep. sleep was removed
dnl after 1.56.
dnl If neither is available, abort.
-dnl If sleep_for is used, boost_chrono becomes a requirement.
-if test x$ax_cv_boost_chrono = xyes; then
TEMP_LIBS="$LIBS"
-LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB $LIBS"
+LIBS="$BOOST_LIBS $LIBS"
TEMP_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
@@ -613,12 +613,11 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
choke me
#endif
]])],
- [boost_sleep=yes; BOOST_LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB";
+ [boost_sleep=yes;
AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])],
[boost_sleep=no])
LIBS="$TEMP_LIBS"
CPPFLAGS="$TEMP_CPPFLAGS"
-fi
if test x$boost_sleep != xyes; then
TEMP_LIBS="$LIBS"
@@ -680,6 +679,14 @@ else
fi
fi
+AC_CHECK_LIB([crypto],[RAND_egd],[],[
+ AC_ARG_WITH([libressl],
+ [AS_HELP_STRING([--with-libressl],[Build with system LibreSSL (default is no; DANGEROUS; NOT SUPPORTED)])],
+ [AC_MSG_WARN([Detected LibreSSL: This is NOT supported, and may break consensus compatibility!])],
+ [AC_MSG_ERROR([Detected LibreSSL: This is NOT supported, and may break consensus compatibility!])]
+ )
+])
+
CFLAGS_TEMP="$CFLAGS"
LIBS_TEMP="$LIBS"
CFLAGS="$CFLAGS $SSL_CFLAGS $CRYPTO_CFLAGS"
@@ -888,7 +895,7 @@ PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR"
unset PKG_CONFIG_LIBDIR
PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP"
-ac_configure_args="${ac_configure_args} --disable-shared --with-pic"
+ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no"
AC_CONFIG_SUBDIRS([src/secp256k1])
AC_OUTPUT
diff --git a/contrib/debian/copyright b/contrib/debian/copyright
index a6ee201991..55ebcaab42 100644
--- a/contrib/debian/copyright
+++ b/contrib/debian/copyright
@@ -2,8 +2,7 @@ Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?rev=174
Upstream-Name: Bitcoin
Upstream-Contact: Satoshi Nakamoto <satoshin@gmx.com>
irc://#bitcoin@freenode.net
-Source: http://sourceforge.net/projects/bitcoin/files/
- https://github.com/bitcoin/bitcoin
+Source: https://github.com/bitcoin/bitcoin
Files: *
Copyright: 2009-2012, Bitcoin Core Developers
@@ -15,10 +14,6 @@ Files: src/json/*
Copyright: 2007-2009, John W. Wilkinson
License: Expat
-Files: src/strlcpy.h
-Copyright: 1998, Todd C. Miller <Todd.Miller@courtesan.com>
-License: ISC
-
Files: debian/*
Copyright: 2010-2011, Jonas Smedegaard <dr@jones.dk>
2011, Matt Corallo <matt@bluematt.me>
diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml
index dde4af3491..440d95a355 100644
--- a/contrib/gitian-descriptors/gitian-linux.yml
+++ b/contrib/gitian-descriptors/gitian-linux.yml
@@ -1,5 +1,5 @@
---
-name: "bitcoin-linux-0.10"
+name: "bitcoin-linux-0.12"
enable_cache: true
suites:
- "precise"
@@ -16,7 +16,7 @@ packages:
- "bsdmainutils"
- "binutils-gold"
- "libstdc++6-4.6-pic"
-reference_datetime: "2013-06-01 00:00:00"
+reference_datetime: "2015-06-01 00:00:00"
remotes:
- "url": "https://github.com/bitcoin/bitcoin.git"
"dir": "bitcoin"
diff --git a/contrib/gitian-descriptors/gitian-osx-signer.yml b/contrib/gitian-descriptors/gitian-osx-signer.yml
index 1792f9de3f..36d7b01264 100644
--- a/contrib/gitian-descriptors/gitian-osx-signer.yml
+++ b/contrib/gitian-descriptors/gitian-osx-signer.yml
@@ -7,11 +7,12 @@ architectures:
packages:
- "libc6:i386"
- "faketime"
-reference_datetime: "2013-06-01 00:00:00"
-remotes: []
+reference_datetime: "2015-06-01 00:00:00"
+remotes:
+- "url": "https://github.com/bitcoin/bitcoin-detached-sigs.git"
+ "dir": "signature"
files:
- "bitcoin-osx-unsigned.tar.gz"
-- "signature.tar.gz"
script: |
WRAP_DIR=$HOME/wrapped
mkdir -p ${WRAP_DIR}
@@ -32,6 +33,6 @@ script: |
SIGNED=bitcoin-osx-signed.dmg
tar -xf ${UNSIGNED}
- ./detached-sig-apply.sh ${UNSIGNED} signature.tar.gz
- ${WRAP_DIR}/genisoimage -no-cache-inodes -D -l -probe -V "Bitcoin-Qt" -no-pad -r -apple -o uncompressed.dmg signed-app
+ ./detached-sig-apply.sh ${UNSIGNED} signature/osx
+ ${WRAP_DIR}/genisoimage -no-cache-inodes -D -l -probe -V "Bitcoin-Core" -no-pad -r -apple -o uncompressed.dmg signed-app
${WRAP_DIR}/dmg dmg uncompressed.dmg ${OUTDIR}/${SIGNED}
diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml
index b401482c70..bad9a0e768 100644
--- a/contrib/gitian-descriptors/gitian-osx.yml
+++ b/contrib/gitian-descriptors/gitian-osx.yml
@@ -1,5 +1,5 @@
---
-name: "bitcoin-osx-0.10"
+name: "bitcoin-osx-0.12"
enable_cache: true
suites:
- "precise"
@@ -18,7 +18,7 @@ packages:
- "libcap-dev"
- "libz-dev"
- "libbz2-dev"
-reference_datetime: "2013-06-01 00:00:00"
+reference_datetime: "2015-06-01 00:00:00"
remotes:
- "url": "https://github.com/bitcoin/bitcoin.git"
"dir": "bitcoin"
@@ -120,7 +120,7 @@ script: |
popd
make deploy
- ${WRAP_DIR}/dmg dmg Bitcoin-Qt.dmg ${OUTDIR}/${DISTNAME}-osx-unsigned.dmg
+ ${WRAP_DIR}/dmg dmg Bitcoin-Core.dmg ${OUTDIR}/${DISTNAME}-osx-unsigned.dmg
cd installed
find . -name "lib*.la" -delete
diff --git a/contrib/gitian-descriptors/gitian-win-signer.yml b/contrib/gitian-descriptors/gitian-win-signer.yml
new file mode 100644
index 0000000000..2a73050e0e
--- /dev/null
+++ b/contrib/gitian-descriptors/gitian-win-signer.yml
@@ -0,0 +1,39 @@
+---
+name: "bitcoin-win-signer"
+suites:
+- "precise"
+architectures:
+- "amd64"
+packages:
+- "libssl-dev"
+- "autoconf"
+reference_datetime: "2015-06-01 00:00:00"
+remotes:
+- "url": "https://github.com/bitcoin/bitcoin-detached-sigs.git"
+ "dir": "signature"
+files:
+- "osslsigncode-1.7.1.tar.gz"
+- "osslsigncode-Backports-to-1.7.1.patch"
+- "bitcoin-win-unsigned.tar.gz"
+script: |
+ BUILD_DIR=`pwd`
+ SIGDIR=${BUILD_DIR}/signature/win
+ UNSIGNED_DIR=${BUILD_DIR}/unsigned
+
+ echo "f9a8cdb38b9c309326764ebc937cba1523a3a751a7ab05df3ecc99d18ae466c9 osslsigncode-1.7.1.tar.gz" | sha256sum -c
+ echo "a8c4e9cafba922f89de0df1f2152e7be286aba73f78505169bc351a7938dd911 osslsigncode-Backports-to-1.7.1.patch" | sha256sum -c
+
+ mkdir -p ${UNSIGNED_DIR}
+ tar -C ${UNSIGNED_DIR} -xf bitcoin-win-unsigned.tar.gz
+
+ tar xf osslsigncode-1.7.1.tar.gz
+ cd osslsigncode-1.7.1
+ patch -p1 < ${BUILD_DIR}/osslsigncode-Backports-to-1.7.1.patch
+
+ ./configure --without-gsf --without-curl --disable-dependency-tracking
+ make
+ find ${UNSIGNED_DIR} -name "*-unsigned.exe" | while read i; do
+ INFILE="`basename "${i}"`"
+ OUTFILE="`echo "${INFILE}" | sed s/-unsigned//`"
+ ./osslsigncode attach-signature -in "${i}" -out "${OUTDIR}/${OUTFILE}" -sigin "${SIGDIR}/${INFILE}.pem"
+ done
diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml
index 2d72f7b6e5..966820ec51 100644
--- a/contrib/gitian-descriptors/gitian-win.yml
+++ b/contrib/gitian-descriptors/gitian-win.yml
@@ -1,5 +1,5 @@
---
-name: "bitcoin-win-0.10"
+name: "bitcoin-win-0.12"
enable_cache: true
suites:
- "precise"
@@ -18,7 +18,7 @@ packages:
- "g++-mingw-w64"
- "nsis"
- "zip"
-reference_datetime: "2013-06-01 00:00:00"
+reference_datetime: "2015-06-01 00:00:00"
remotes:
- "url": "https://github.com/bitcoin/bitcoin.git"
"dir": "bitcoin"
@@ -84,6 +84,8 @@ script: |
pushd temp
tar xf ../$SOURCEDIST
find bitcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST
+ mkdir -p $OUTDIR/src
+ cp ../$SOURCEDIST $OUTDIR/src
popd
ORIGPATH="$PATH"
@@ -109,7 +111,8 @@ script: |
find ${DISTNAME} -type f | sort | zip -X@ ${OUTDIR}/${DISTNAME}-${i}.zip
cd ../..
done
- mkdir -p $OUTDIR/src
- mv $SOURCEDIST $OUTDIR/src
+ cd $OUTDIR
+ rename 's/-setup\.exe$/-setup-unsigned.exe/' *-setup.exe
+ find . -name "*-setup-unsigned.exe" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-win-unsigned.tar.gz
mv ${OUTDIR}/${DISTNAME}-x86_64-*.zip ${OUTDIR}/${DISTNAME}-win64.zip
mv ${OUTDIR}/${DISTNAME}-i686-*.zip ${OUTDIR}/${DISTNAME}-win32.zip
diff --git a/contrib/gitian-downloader/cdecker-key.pgp b/contrib/gitian-downloader/cdecker-key.pgp
new file mode 100644
index 0000000000..928a74b315
--- /dev/null
+++ b/contrib/gitian-downloader/cdecker-key.pgp
Binary files differ
diff --git a/contrib/gitian-downloader/erkmos.pgp b/contrib/gitian-downloader/erkmos.pgp
new file mode 100644
index 0000000000..9d3f060627
--- /dev/null
+++ b/contrib/gitian-downloader/erkmos.pgp
Binary files differ
diff --git a/contrib/gitian-downloader/linux-download-config b/contrib/gitian-downloader/linux-download-config
index f5e6382b84..c0048d336e 100644
--- a/contrib/gitian-downloader/linux-download-config
+++ b/contrib/gitian-downloader/linux-download-config
@@ -3,7 +3,7 @@ name: bitcoin
urls:
- http://bitcoin.org/bitcoin-latest-linux-gitian.zip
rss:
-- url: http://sourceforge.net/api/file/index/project-id/244765/mtime/desc/limit/100/rss
+- url:
xpath: //item/link/text()
pattern: bitcoin-\d+.\d+.\d+-linux-gitian.zip
signers:
@@ -40,3 +40,6 @@ signers:
C060A6635913D98A3587D7DB1C2491FFEB0EF770:
name: "Cory Fields"
key: "cfields"
+ 37EC7D7B0A217CDB4B4E007E7FAB114267E4FA04:
+ name: "Peter Todd"
+ key: "petertodd"
diff --git a/contrib/gitian-downloader/luke-jr-key.pgp b/contrib/gitian-downloader/luke-jr-key.pgp
index 275b041d20..4406e6d5be 100644
--- a/contrib/gitian-downloader/luke-jr-key.pgp
+++ b/contrib/gitian-downloader/luke-jr-key.pgp
Binary files differ
diff --git a/contrib/gitian-downloader/petertodd-key.pgp b/contrib/gitian-downloader/petertodd-key.pgp
new file mode 100644
index 0000000000..5ee82a6f7e
--- /dev/null
+++ b/contrib/gitian-downloader/petertodd-key.pgp
@@ -0,0 +1,1901 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQENBE+Xo6MBCACpPhm2zLk6G65vB8OfG04VyBus9Ht9jHhI0rMQ6Orai9luo0Fb
+CPZGljnpi9GSrm6nG15aDtG84cjTVatJ3wmoAPDmcq/QPTaeEAY28us9QN4Fsqw0
+emJqiaQez9pd/5BYtOSG8vLZpAxXfnOgDH/YK6u9WdoX7/RgTAltcoGazmyJHZHj
+VzB5OoZzakuWDALdHAw40i3RO5KpjS+BetQPRH0nV8dW/56aZWFk8scIhhMWTEFM
+5GZ2d0qz4lyfxqoGdpsDYqh9iakWz8ppFy19BC/XYxQhAaGb4abdQlw/CZ0ShWzW
+1RnlLJpAp7cC31mR541x+EJjPW9o9+JrUBlVABEBAAG0H1BldGVyIFRvZGQgPHBl
+dGVAcGV0ZXJ0b2RkLm9yZz6IRgQQEQIABgUCT5etZgAKCRDdsyENsj3FZKT0AJ0U
+/S+g910beeD9CPR1RtF2ILYwPwCeNJcpAqVCsevAc1GH1ApTPAYbJ3+JASIEEAEC
+AAwFAk+YK8YFAwASdQAACgkQlxC4m8pXrXwQhAf6AtJs0lYO6QJsiJEP8Q6KIibI
+Ca67s4Qp8IztYGCqbivWCgairYOu70ZMcxDqrsF2c6mzgGC1GsszW3u8FxxtHFuA
+c+FmBgAAZ4cE1T0z7w0dhCT+Rg7Jxk95x5WExyh4yN3SBXxZd+MTctXjwBB4bo4U
+oxeeU4PK4mZI4Jx86YYO6FVaL2C125LNj7oqiNJYx86Msuorx9B543ymYlcNZO5A
+YlfHkOszb/jP7rs0JxrUCvwl6050gnj38hOFk7qT4XMxf5wPtRBzZWjbtLbmlXRq
+6x9mLyxA199NAj1Sfv89hL2n4QouCMh72fmKU0B7pZu0gV1PfGTXzlVC+wX/mokB
+IgQQAQIADAUCT6lvSQUDABJ1AAAKCRCXELibyletfKV+CAC61PnPtnEBFFa5Ms1D
+Jk/v/k2zN5VeW2i5lVCiFxp43NQySAanZSLfpm69YvhX5PEkq5h3+9AmvRJlhbZ7
+b5G/E1tQV8cxhaSW5dYAssnBPJ8LLEGm+Yi+ND2DwQzHlWsneP+YduAexLB65EHR
+0LYYVdJXYG8gCV71bFWZ9EPtpYDdisllrgcLoBndkTmUOvWKvlTQkbNZa44V/jwh
+ZxfVSgl39vXnHrKX8PjwG0SdCV3cCE0NtiYVAtBQu6bNb+hJzQx0eZalY0uvCSOx
+A9jSksnzXuDUsKqqpwN1PVn1xqRndwbeoXIjGJYr9vqve7ZUwABrsOtvku2DlaLD
+7MFNiQEiBBABAgAMBQJPupL3BQMAEnUAAAoJEJcQuJvKV618VUUH/RkCcZIytqnj
++3VIYiHDwbK0SR/k6es1S885Am0oLfTV0iQN9XGsHTe1PTdGjYPM/Xunm9WhJc0/
+UNzJ6vN9M2qExcAQDM781F5TBeJtjToGvl7udlTtTQtQWVnYL6pPq5SZUJlwAG/Y
+RKerl94RlxjA3K2EmCn0uf0AGuydctU8Ep3RG0Io0CymlNMYWS8ylx5367okjDFB
+qIi8rbKkATi8holdnro+aDvO/z5d3bDzipWxO7TD2Nz4o3xLXv1aBLjXv1sq9G1s
+Qm2dNFK3mjPQOp/dRSXIcXHLyKLo0FBRSxOoR9ivr36JTy1+A3f/YYXge1eXs8Is
+GLiy22ZTrEeJASIEEAECAAwFAk/Lt1cFAwASdQAACgkQlxC4m8pXrXyRWggAt6Cv
+RDD1jZAPCzaw9iuaAWc4Pxnl9ZuyhnYl5Se325lHcD1Pa3Rva8kVCbM+iCxIHk0x
+48CaxOs+wEbscmiReqHRgxV3EdKFuIO4+ZCnXc7ff3tvUZ1AIpuYUa6mva3NClqI
+D0EBN7M924yyEywmKxblY0tnzWp4VFOVwPEzimh7vZp6t3+bIutvzuuPlmlim7Ba
+tmpvi/v74ilonQYSA48u7tBQCqJHtj49rqCEPEUI2vbjgFzz/jUIdYEDbFgHjP6R
+dnnGjPOce2m0/v+/76a7MXBPzWQEgPaPWlFiqdDIWkv5Lo8hmTCsl5KXINqnilHp
+TIYG7c2AyYsPdcP3M4kBIgQQAQIADAUCT92BigUDABJ1AAAKCRCXELibyletfLd6
+CACMN975+GuqVz2rA/mKrMc3TjoMAz+7da71Qi+RlOyhmQDw35i8HStlTGyxrZeA
+Cjs3kdIEHG1qPbK2ZeKnQNKh4yBZario0czPaSYUavRLXeW/6LgIt98HUp+AAhB1
+fEdKZ9d2aDRNubpGiLzksuM6rOzdmhw1DLeeFHjTJElcPdX5/rF8dMHI/kVOHt82
+chmdMknEN6nXKtKypaSI8ykOWgVLgKt0TBcrVXLEVjrbjrkaAIYQRIVFmD0d+aMm
+Ar5ntbb1e7YYWS33NhNbctxw1OSZOX9jHctFZ+/DO1sfzll/xHOmQou4pbyOoL4p
+QjuDhfR+nObm3T92PibLqDHziQEiBBABAgAMBQJP705IBQMAEnUAAAoJEJcQuJvK
+V618FP0IAK06KhxMFZkqJVJUu7BHJCqACSbOZACxudGm4DiJyGeV5kmko+6UnvaM
+Wa4KRL8uCkLJM/ooWCKvUCrOW5TZ9bRUzxdy9KtPpqFOfDJjieBSDJyL/+3YDEQ4
+aueS8uC9lCDOJzg/JcC2WlCU5GTRYoFJz2DKq98eUeHTRYUWRvE4NIiXxu86gsgw
+Qaa5oLmoGinz1onog1y/aptWb/qSDsbUuTZHCvwYWZcKl2VkPeQJEwSDFnLrDHww
+z13dx7avkaJd7TTOn3u2WKVT3gSx6yZglVY8kBoFsZx1AnHfEd1CDe/GwA3vjnNR
+47HqHjkz94z5cDIW9L2IuVo9i8LtO4qJASIEEAECAAwFAlABGg4FAwASdQAACgkQ
+lxC4m8pXrXwEDgf/YAYELlvcJ0AEmKZW1mTfVQAjUVrgkOK/ZHjtxlsJTpEiSPhN
+DS8rKaxhP6naYfkNvIECQEH4mV7WvjyDAPwgYGV/GbfaUzIl4XLXMB4ZcusW9u1U
+s+4DigeN0UWmit9VFfL4VGYvMYa3XioewZC4ZOQ/+IPhoSW8myDS4FqnwRDR28cM
+wi5aBNUwLsGENhhhJ8iO/8GZ2gYvfKxyIQed2UbelyXVEZgswVAvjXsV4RS0sP6g
+LcOQZo2OJqaAoUQARZlvqIcROV+bD8zIKgniSQP1bUaJR+jZ6EEkMS8ECdLMtWOu
+V7IwrJA1NILyUHu8H0RKV/fFbTgD8+5MqB5CcIkBIgQQAQIADAUCUBI+JAUDABJ1
+AAAKCRCXELibyletfEDkB/4vdrwZ0dewV/gWPdQtQLXD1xTfOyli0ywKfuIfTEJs
+woqRbJdFHZWq9qs6lo4HSMySakcl3bUHMvcdCZ40tTB0VKGj8a560gwKPthblXa3
+skc+sW5p5/3y0oxY5HJmTc29trVCD4rRRSma0/Ue89dtOUU48K8CRo5+2Rcp0gHW
+Hj7yauQsD7DJGZ8pAuueodJlfQYNL110rp0JsduVO0mfuVPxyVMO7ISb1DtjiK4y
+Arjh5L7mibwBxZoQo0SDu+5E1nn7Ucjv6Yw+YtDrIa8CEF4Q+hekMPuBUEHqIXY+
+WGH1KzYrEoRCLrv+INfoiz9b1hIRqw2Fag9Jg/wNvwwCiQEiBBABAgAMBQJQh2yB
+BQMAEnUAAAoJEJcQuJvKV618rRsH/R6OQ/TSkr4F/S/oaDXOFS5okSz1QYlZ72NG
+jr6H4OIXwjEommaT9ZUmI66HGbryCAyU/6GO5wu3REuzsmGvNbjYWe7ANk5EpVdJ
+84lqwdoH1XX+OV4Z26InIKY7gegF4gUQJaiGae+kYotvAaqUVS9xxYVM3I/si0FP
+rkfJExCw28JbLP08g+pDgI8pQd3xh26FzBdNPkp+puimo9m4JxuJFRLrjCgcjnKX
+S/GqNoz3NGU2hcPYyq85RP6+1ZEi2BK9Z5iMUyyJ8KUqtM3/pSzuS861Z/p6TXCr
+NA+amkchTulfXIzDb4HNlmZK2iUGUY3aNMIvOwy4nuML871h1XCJATgEEwECACIC
+GwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheABQJPl7LDAAoJEH+rEUJn5PoE9MoH
+/RRd6sRBGr4a70YoLXrpemZmJOSWNsSDAz3BLSDulbtDsHKeUfImPBbVh8UmLeKi
+ErxJLbuEuYn60A5oqchu7MP3LqAQBsGc8xpEKOC/d6fGVnhYGku1jL2dm4TH+yUg
++z+MxxkbDbX8rwCJttGWMvZ4rIoag8LB6KcgcBFo/HVB4uArKdxYDc2jQQypUDGn
+j1s4wLqmcdCmrWWzhtk1cwtSdZi/PJLbPvV8BJE+Gn/rinVC0HmwjB7pSCnr8y4N
+RxJuB7M6cgcxihPWPc4MGH6XGUE/NQFNS/LJYsx5zqD3YmSQKiVz9W3ywSyi/VNk
+rE4FAFy9xgDXkzODf188z16JATgEEwECACICGwMGCwkIBwMCBhUIAgkKCwQWAgMB
+Ah4BAheABQJPl7NrAAoJEH+rEUJn5PoEoPcIAJ3559VgDldVQfpDQOaWKY4qvpcD
+8ERvUVuRm0hIqP8CR+hptz2POWoGH6FtkvS3T9/QajEhAlTBv41fqndw6jAedi+K
+exuUci39usIykjudXMr5B3XfWlqHjQFKtT3gXJNpzLK+EMUlF0EdR6Se9biH4W5K
+tMlwueSaY7Vr7qBAYQ4CamX4yy7nzrVMXVeD6bIfAtBRko9A2tPjhfBvb/Hol2YJ
+U71CxCF2iWJws0rRevynil/J39BwxGNPkmhlcHgBCNmk4eKAmF3Jt739RDoiZahY
+YGpxqs2pvKMkWT9O9Iw+v8MR4PjpcWvwzIybjUDlnMijFBigKBfIwv6Ds8CJAT4E
+EwECACgFAk+Xo6MCGwMFCRLMAwAGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJ
+EH+rEUJn5PoEhAUH/12r7KmApbZJTFq8vbkaTX/6IH5Dzj8IM7ShMa16yvyqGzFg
+Fbi7JcxggETqSAmI5ER70sLNyNhmwKwotGPKCS8fyTJssPaM1yEu6XxJPDS42WDU
+X5MRFANMxmgF4tCkuX320SZkgF6qe2Bgze98HFgWkIdFouNeV/iAyAIv2U3WClNR
+ThPoW111NL0c/VMKMqkxmy5Wm1YACILv2e7imcN3ApxHLaUFiyclRbAkAMUJ4BHH
+p9M9PEQ8lfqst/XFWlBgyD6z5oSR/xiERaKfF6JupAVO2Ou0ebgl3JLwWMd/xbcU
+8J/GH3BDGkwuwOYAV4sCnwQoL2yxCndT9BQNbIuJAhwEEAECAAYFAlFKdFQACgkQ
+DuQHzesmWwa8RRAAnZGnmCCzBhRaDoamlJJWprZYnilvqi3IRoQTOMZ8mCgUBWoF
+kdb5rgLLPfy3N8hA0SAIQYzFeG6VxmxHO/iM/6EptIrivkedQXpTDEusz6l8/YSk
+TQ3Y2JaEf1mnvyo8psAJesSR66QyovyqRe61RJH7jABcso8A3EJ/lRqbKu5dU6I2
+/6wiUW9h3lhxZ5SDv4nrVbfRChrjnE4ggFfLSFo/ZyWEgOr3vk+KsOrqya6mipI6
+WJAcoii5egN96Z5wHbqB4rPh3u7Py4TDGBTQmZZSkNmwpV1qX/pvrYqaJ9z1c3RO
+dqNxYbTxm4fGMrCvWTYVt5v6o/yAkAkxXQiEl0rlyhpNBWiC/WQChaNsaMpY5ir4
+8t7AkXagLt7gZYONe6PTMEscr6q48alNbi9W5s/E8jnLTuXYwlkuCFKOWgSCJC5k
+RARgyAU9XwMgE0nqmHMrgoYNIQOOSquW2M4SQTbcyYa2TPDTQAsr3soPG/qxeKNY
+WE1rF0j7EYFSL7dv6iniyYGZ+kD6r5Mr9W1sELkl4S11Oct59GlOIapOb81VhN8F
+HBl0GW9aPk5XVcsbyEaEuUpISJ2Gb0vhQfXQIbmrVDwo8IGksInSP+Lu932fcsmU
+YWqMDOCiaqfsNIeHHaqDEIRQ2pVRzoCVQ4CFixHPY+C6IOnKheTWTIaJh4aJAhwE
+EgECAAYFAlFm1W0ACgkQA3Ye/+KdJEwxqxAA0ZCB4xFvte0qPURfDYtNzBOu/w6o
+KGAqZ4MG79zwozoFdO4SpaDADW0hQtXeeVKeb3VyYmhNEfXLsEhRBRPp/PToRqZa
+XXE1fJv/hwjzNSxm9VFIGLwosgFMRTFYzSt29wYnyqyklLB49FoN44b1wxfY2hih
+L8O2yCiKZBLvyH2PF1/FB4Dmjm7Ku4ZaTVj5QGcFc6kJEYnn1RPT6EMNS0J0IsAV
+vJouSb3WmojW253yzHvgl+cvBNxp46Mvwd8VH4IdHNSSojVPNbH2EQ0rEkTpQPcG
+zYoJXBp6E6xoHbJcDmHjo3oe6Kw6IBbYXolk3FPyV9olYFuYlQP+8x97/yu4c/aD
+cUo2GuyX6zGspr67I7P/Z3+3OHBHnFbxw4ugWNuAMJXlk/c36ny5Hlztvw44R52+
++YO0QoIGFJIOFFy+gIunoLH9N7iGOnjJ/X5mz1a1hQMozNRFDHpGRpoBMW6zEYRA
+8oFWJKX8K4TeZZer/CsegoH7nh6hcH+YgoZVGxs3OSL/xCYwmsPDA5wgashOSFn5
+e9XtpZaeyuTVM1QfGIeSJqQzfrcQzs2nWlyYl+oBsCmsjeRbvft+3KjuBOtuj+Au
+acs33/hRPrBWIopI1DMAWwt6nI+SD4OGBc5LE/tUTKAiG3Zy7icnrMVnsoQEzjOt
+/Si2YAgw/oP6LkSJARwEEAECAAYFAlF6hPIACgkQRYKxTiY2GI+lyAgAp2Wsu/6t
+Rdv6quPBe7xwJvHwJpnezIzGg0c/bo4G4A8S0OlSlw+8l2hNyhUbwcP6UlH6atZz
+3UMtfnINqhEPaun2nF1c+1A1/YyHvAFBd5+zXnWGIoU861jiom3ZY+Vps7Ryeh7h
+QHvcTY09YbWQFlP9MGv+ehZPhnQJZthYGy2x6WmqW/wVfkch4+0CRyGSaW7RPMt6
+vPwELGpuw4AR6zn7PTbLPinxtRl8eIrbJNT3/ArdLrs+1dwzFMCRP0/+qTUF5VdZ
+ylcWgXM+2pNRNmAkyNZWAO/f/rdPS4QOj0J0i74W2zoUn0Vr+Lj/rgfePnppHIBZ
+9+Oa5twhvFlIIYkBIgQQAQIADAUCUXgvfwUDABJ1AAAKCRCXELibyletfEW8B/4g
+WjwjazRBV7k0/6i1fpLdSufM/+B1dV+GXIQnMydWdYaYbHeHb7vGuYc/Zq9zwm2R
++pgLKliyVuJOOZTHLzJr8XDaFEQJ1fF6He9MUZ98aqa/jbxlPGRWeUUMlol/vHIu
+vSs0LnH0skJy44JXTE0PJr6PQUByiemTIStCOEs0SNGpjBXf8oU1UUcSQP4q7CAm
+BDbK8vPmsrCX+uQRJWauNdB1zx51/LYclNvuEWx+nJ5mHJthcehI3f+BpMNEvELF
+p50LlfBZj1uCo4c+JpHtICNpidx9X13xBC9I/m8AdurIQOkKvbnBUWDV80DwLx05
+e6KCbunuzSy31iZwi4EmiEYEEBECAAYFAlGV1rUACgkQrIWTYrBBO/r23gCghaV6
+xS+6mgOqV9w/Exho3S4Xv/UAoIevuGMmyLxBZpbyYK2HMpIhz948iEYEEBECAAYF
+AlGWYBEACgkQQ493Dsj6Uli5egCfY/8pnDZYh5ihMaOQh/Qnd68EprIAn18Uhp0g
+XaUqd0WvTEIj2Ivc0iBmiQQcBBIBAgAGBQJRldWHAAoJEL0ClCQh9IifGssf/ieh
+Cr/EbGuf6R68FlWL81epld3gaZNMwA8gIXOeRfqpSzB29tr8Sg9PUyaPyqM0ZPvH
+GzXRb9T2O0ETOCouC6S75FAh2BVavWGoJoa/g+Nxf2PkzeppxDb4sYl4vMBSJ/b8
+56wdqgU4Mr52RslAGHO7fp3RvYd9FwLdGD7+OHh0Ih1MIpgFT9xaF4B/mHx/o2cM
+R4BadO0o+kK9NZwBQJK4UeoMf8P2LOih0QbUKsOKNWCC6wD4++bj3Q1yOa7QyJ32
+iXMpf9aN0KpyU5+DM0mkUIpPBnrqqsoFYwXYqXdg/8b+Mb2E7TsHhlynP7Vs7Iq3
+DVv1V45khUrcY2kZsqCYC2FOLngT/f4S+XbzvirQGvJjJECmIdfLxAW4uL3on04r
+st5NE3LOtlT45VE/Cd/cjAusDtrF5BAzk9nccL1B6pPT8CaL3pvSx2tCtydWTvNg
+M889sPO3jOj5NyWtZHmRz21gEE+qd2LxxzSa/tYVH4iDh2B7T+/sd06/2ElZdrZO
+oDfJN2bq49Q0qo7DcPYca1oQxGjNVI+5P9zL3enoIE2J3jZyfzu8MCcG8pNRXdJE
+vlCPQ4zZeWAAayCD7Uk5zml5YZN4JMhPZJBvifYArevN150bL+fe9R6iWAQNDouj
+wOkG8GFONGKG0ZGXQ0loqmc3ycCz3V8U9YjtkR+GfH40gpqih5yf2ifjT5wDmvDk
+QmrVMGd343V7S6CVufFgbQvPym4fhUyL+WS4EcHd4k1TGWI4WAm/TADthTV7IRHw
+BSGsRbgvDNIR6RczbQ3j53l5j7ReYKP1yLnPwiNC3noPewqGephy6gH3BjYCtYZt
+Vq4+OeNgCLi5fhy1xNCeqto6qQlbms7hw5YKB/x12QnsdgxGV9guuKYiJEOG37A0
+qdmYOBkHt3TfZWlLCDVRaHvb30eGSKS01aHmK4pJLAFYVgLw/ggBjegj6AxdnpT5
+NQM9uWCfwZ2qa3vBPaw7FYhjcB/nSvpZ9I4dC1F3lffLucgpg73p6OO5aU6w952M
+hGDMKBGovbG2hvIaqs1RwaKZNtZZcBCXfIsQnGU11LYs/3w8cSyxWE/35HlveXW6
++YBXHIaY8nrJCQHwLlmRj7w1RXVODBy75iUd6mYURPZyadpVfTKIpFkddIFPLKPl
+6QkByMAno4dWS/p/2/xek9zBnhUhBjiQ+F9+rbF0K5LswiMK/BwzB8UXOXeueZXH
+H1vDCDOBzrDit8bgxJy8j2YGT2Vq7ThMnhSLLC3hRcWJAz+0rSJ51OxWLS3CQGgQ
+lmMOc2Wmz+K7JKvat3eZesBTQEZre6MpxXiebna53RnK/jFlEiqeZqPDWfry81ew
+qzDnWaQ/m43L0V8QVVeJBLEEEgECAJsFAlGVbM6UGmh0dHA6Ly93d3cuamVuc2Vy
+YXQuZGUvZmlsZXMvb3BlbnBncC9BNEZGMjI3OS1jZXJ0LXBvbGljeS0yMDEzLTA1
+LTE3LnR4dD9zaGE1MTJzdW09OGM4NTgyZjI1Mjk5MjRkZDY5Mjk3Yjc0YzM0MGEw
+YTI5YTFjMWQ3NWIxODFiZmY2MDJmZGRkNzllN2YwNDk2NAAKCRBOH3mapP8ieSuD
+H/90vmcaUOrfHXiDON3WzGU9lkk2K5GEauttX6p2gRRhzTqy47zUl5Wu8KWetkft
+XOf/4yhPwDyFzCElArReLBg0gM4vgCAH+jeZqSWcMvgv9M11cA8rSF7aRLdpPfR6
+m4RwS8niwpvInNG4DNCQxqZqSBB6XDyrtmjJP6PNhJD6Nd24nMzImyJ7QB1JrSjK
+lk539GS7fgEhhrBh5nKhVlvzzusvAc7MKysUCMduQrRYbkWQxw41OdIlIZMc6ErC
+SGEEKgrVB4xFZR2DNTd93PDggjHTtvXKnydCZC1XL94qvvHMmSagXfk76QwtHBG8
+099QR60buDGLnZvyDbR7H5ts7UPbIwIRWA0v/p7hhT9PRRLLVuK1oLUa1gEN/IAf
+Hgs7Q02RqW90W8NW73e8YDgLXvZ/l3+3ID1GwkeDuGaCCMjAaxMQO3YYy2M2H/aI
+EoaTMcRv2ILtcNgAN7cEfDO8Hx8jr98H9jlbtW1SYRzc3EvXVcRFwvlaAmnEb+aq
+glgZiXUxNFxFWHGWi+6mVzvfg/JTETYGaEr3jEEHka2btLJCVEUsOQ/pXJwjaKpq
+mMdBjy4neeBbjZNNd+5K/FGpMyEjWWaIVbRBG00w0MKr2862RQHOzca/cYJ8vaK6
++t9bnCPoi/mXMgSOtDj90LzCWx4BtTTRAc/EYSm8H2YWOlD0OGAEr9UUptCP4Cyn
+U0mBgIBdvqrPXaqfHqwyOy4vQcHk/e1b0kN07Pd5p7R41q+yYZ5jb6ZJFYh57Wrd
+IoEX1MLZRbw2SIHWpQaI/zSYeG1cgZjXEegXFSHngWqJ26nsK9wjbwhq4P4bFH+w
+eMFp5Z7BnhYRQz9dORAn7Go+cMMT/c4tvKxRFaY3+/v4wV3t2rIcF5HzdmVslCTy
+mRN+/M0fOpcrHF/GzN3aTla0fpZLLJnqmF43s1CqluPFW49AzQxbZufzeAOWEIHM
+s3Tw3CUml7+xiJ/2zXed0wcdyaAPTxKQqP4s9BDgeMbAUl0MqvBRtVWD+jMy9f5z
+BvOxZlUeQxYhDln3O7ge6PQLqgbPcqVRWMonC928n2QWx76EY9pgt9giCohcpGPM
+Ziron+rJKnVsVQGO9GmwOyFD/7auSS3Ml4/t1r73BMKabNK2+AQ0LEx1JFzkENaA
+Xe+MxpoW2QrXM5dO3+gsKIvekRVbeMY4ORYisLHudI7Q0kFBMgwTrO55FY48ykRG
+13376+wmvlLjEm35DE2YFlfMISe40MjBlwzRid5f4/hebytbQ5IocFcN913M4AXr
+cOeF0hU2JkAXoHY+UaHCkiRBAk7s7aEdBjsml9s5KGCQbMvUtlRaFyqt+ywhbSlL
+Wlx1WA90sNMY0NjwqQFwcM9riQEcBBABAgAGBQJRwcjtAAoJEBQ8n0HY8FbdcB8H
+/A2HDTY9dvsMrYr0RPlVrdyzL95H4+49fxSSJBVya6kYJQJiAmqrfJwIgqOID+yE
+uxvkhSraF5n/j/5o2y3tWc3Q6GDJcH2nYC17mDmHiWVa0Xep/gytNfbktZyUAO9J
+CJL2z4EfT3I0pqha0hKyUfd7bLU2Fy5ShGN6hHhiObBIBp5j9mWmrQnByAwWwQfk
+aVJxJcddBHruHctti4SFFnv5G+hswTSP4XQkNCKRgz93/UjXkeyAPNzHynDOjk+m
+J70bDF19umiQbsw4E8XyrakgyXCmQX4jD57bKF2SmEMXCLf2jdO5t9lRdFCSz94A
+5wTMD08zws3/wvMV4FltDROJBBwEEAEIAAYFAlHwdocACgkQsReetzR9wQ23oh/9
+GcctkEep8L4wD7aXyfE+ZROz+2+aCRNhktoftIce6EoGFtROaXRFiQEaqdjlcnga
+aJTMFFymjViC99gbQjjoFyEoZgyHIL+sGZe9IDg25aTMkFQ7TANRACep6Fm1m1uD
+QdYowHWSwvPWsXFYrKHFmETAZkd5gprLC2oLDZfcRt8SAIySqAnASEFe3rnBjZzl
+n0Y5IsyJQEpt+2zP4TR+qgtdNnmjAdYAnckmiubYNj9ph5y+HI4EsKIun+eyv8Aa
+X7Siwlvt9RLpzUTG9KRsCKcq1zbU8kp6S9IWsb/VSIN1KVFQlM2dl7d6Hjg9WyFi
+SEMp0UloqwB3Iy9b5WSYFXHjjjNcx1qK9Xf7DJrjztLT46LLj9H58Utllb/v+o2A
+jHr/xWjwQdqk8H2x6vVWhuTI9DlL2xL2B4lJAM08Kg2vCBoT2nHH5lfsoYzzRZ1Q
+/ovuN1lx/0CWGB2zK1daDrOTnOUYfCDqqJGEH87VZV/B/uJnjy1OoUxbZ9kU3ICr
+3M3zZr3QqZq3kr9jIOM7yeEIsCOR2W0PQebWEcRqzRX+7SOeafMpRq5LoFuht2A2
+oPrG/uahs2pyH4cDwsQLh+o8XyPuVOgQMxeispd+AbLi7OsuFnx0sBDyXin8qSsx
++2urpdB6jjZjLzRTpmn8l24RQidZ5rPxLbd4HD6pHuGxyo4u9rOclL7WHoJi19ZE
+U9Qb44F2+8hObKp/n/MVZNorZPu4dycgidD1yvT0WVXwDBGFXMmNUDNtwHQs4S8F
+Q2tJhlVe2sAP4wcR3YtskyqseguZK8X7IXbP4sgbwDsrBW36DG6uy0ZUJqi3FuQL
+9+wGYmpZnX8GRiajWxj6kpB4FtOBa/5dOVdR5XiejyfC1aVTQsxHGK2rosP9lKVH
+MyX4PwL+13TVMLC0bUWwneRn8aMezid9DZqIO59qSK2dMKamF2YixsXJuOIYqdXy
+8x4iY0EfTZUCCRG9vCs1p946IDlyj3KkxMRXy1xWOkMT58j0Rx0iKnEKKIhoT6rm
+pucKLasuYy8vajy/qtaaJQvirbkTp3h0dEom/T0DV6Hq2r5KtW//5osO9LrfUAUk
+Npwo0WS08V5U/lsix0ZCArXm4SVjBlON+YJhARbI641W2OF0oKdBBR/uKPSd5fCb
+FbMKDLgqmgbGlAWKHx0gou0oIW3yT2HCLyjQZhFJIDG3O7wKGu1Bna3kqgKiDhS7
+5ecZEZNIk4o1+ONu37f9IIDSriHJfbAIEzSj/Np9b57fo9AXaOXPm3HJuI+kwwIQ
+NvD7U+yvR8zrU2k0J/F+UUs4A9je+jg8+kVFIIlGWFx+6EEWsqEWzD4PWLfQBrjX
+VeFnpczVzMlGZE41RMKlW4kCHAQQAQIABgUCUjJIiAAKCRDhZvoRVxE5FnSfD/4l
+4bVSmoeJLLR30heCqvQTews+0maCsLiU6upl3BwQKxlRi03OrFxlTnpJ94bgzhZ/
+ek8j/TDpo72b2mr9wzHl5IAldO9QQDQefxQrSf382kbkbCz0ONnR4eQfGXajYkq7
+6hogZPYXrxTJUCS47q7F3RLxvwcxxJryyH/UIGqxinSaGa70jh4H6TiJTm9PFf7P
+5VxsCabp7EpM/vfKogQIYIFhZx+5xNKV/p2nJCMD+Kpl+lPSDEgXph7lQOceDSTQ
+mAXbPkVjQM5u/PRlJZICQ5Pgm1wltOqWcgxs/4fzrajQZxfg8Q8E1GPy7Wk1wrkQ
+2iIfnZc8aSg5pNMhjmChNja/H0mOuwAp/YUoP/9XoX3cPHA0xnISg0KPaDyGIWH8
+cmgDa2OT58c/vKh2Mw6UmkLieafbQJflUgyMrnlD3Ic8RHcsrfWZUA/7Gm0KhOg/
+QlDGkm/hqPVMD5MqpZckAWXVNvEeocisxjUoQUMyAmtlHTrGMksZbjLnZqKs4pky
+u6LYzxYSlt+L5ZN62pNQMBTkV874Yrz8ZZIjJvuxbmL2aGrOWFQT2uW6WGdOpvk2
+2zOardDjel7XgqFq9t+nXV+B6oR4Kg/wgCMhc1ZfOEZ8wVgLRsZ2TcvCJR90yiCc
+j7WAliRT8MNqIFJ89Fe1WtqQP3dhObeieWo6PFQ75YkBHAQQAQIABgUCUlm0vAAK
+CRCCxcAJYo7PDG6IB/9ysUJhzIM5sJTMgzif5L00tdblhqPgy0nbECsy+TtspQMc
+uXrfPLUQpbN/AYz09HamSIQmBwkgEctOA96GlG9nF32WkT/zZcycj30dG27XWuGY
+aOr4mIjb+U/zFAMvQcKa8DgOjtzBMKh30Y3dEhnvMKMzmxy/pBGGSVU0gD2eFWR6
+oxG0GVEsYAGBfGOnjU4g40essxHcmiwNToYQX4A5O7T09sQqtqlP4CUkSO8DA+oK
+G4w/y4I4Sc3nEvgO7wzg/zLxy3C2DAzbQy23ea2dK35IkVqkk9aUuT64JEs6/aEO
+BrtkNlByeO+8u81GGrEKxLOemrepzHSpZ+ddYsouiQIcBBMBAgAGBQJSWdZfAAoJ
+ELvkzMTyLzm1AQgP/RI77Zbjto8Ql6a06iV7G/Bets+JpJd5jr3APXEETFzrKuon
+GdL2d0SuNYCfG9e2RG/qNUuOsySzHkV1MP0dw8Vb26za6vjZ9T7XQnVccL11uQ0Z
+3QwP3HlnsCV2ZAEVaBMVXa1X/osyV++RycSYT35cgMV89pa2mc4cz6AEJQWWcyO+
+FEezmeikwiutasdRMDGsJS+zQXKj+lgfZejKDBnUYd08U2BMEoiAKdhaE3rCMYK6
+5jxVk7m/1/2OCisQ3V8ZwE9kGydZ1ViLDRzHKuuWiTe98XhICCwfAGoAahx+Gd4y
+La7/ZRojW43yTPxhsd7PreW8DdmkqyYOY59LO5BHyKr7XpAMG6ikeZ5JkNUMIOBn
+yUwt+PEV8IhbKT2pAWI7pdJHFVDCXjmf8Z163khwsRPdx+CcbboOT4G5AnxUm9/J
+dxU5do4BMmnfq0jJ1brOVepu6f51bhpXAduFOLxtFTBvfciC5aYipPdBMXznlTkI
+dYv1LLrq68SP4qxPAjOtatD7UerI133Fwj3cNHhWC6ZX4N2jg21erAKbZkijTDyW
+xPlmC2rjxns7gMv0y6IDvu+E76YDgu1Bh/sIcRLoDQdnlH4WINs0mqOTpujiEc9x
+cR12DNgM05+62f5wm2xsVHFAI5CRk6UIo+eOCryBuD0bs/Z4OI5MvzqNLJ9hiQEc
+BBABAgAGBQJSWiaIAAoJEBu11uOrln2o+QoH/2avWNs0Es1UZMhQ0cdKylEiiRJY
+Ouv0oQmVuVGu+5yjsDSIi2cVoCAs0f35xo8RS3L8zB5o2Bq4+So3OR4YPr1SVwGX
+9OKToRQTjucN6hn7i+dZewrc59WjtfejeNWwpOHnHZbE3fpUIC4SM6UM2SiKv9j/
+RxCWQKijmEQYX2yuOfpE4uETX/COZcK2YtGImNZBkZRDYh0Iw66LCNDHEU3pQl9m
+30z8HwbpVZzwhjhqWjsc/YEh38pULL07aDNnJ+Tvwh/5jzIdD0b8RPT8/84/33W0
+uHrkPa9jmIOpKwxZxvRVMyYxdL5+Q4z9nVfyqxVolzPKd2Ja7+Wv58t/2cWJAZwE
+EwECAIYCGwMCHgECF4AFCQhuLKAFCwcJCAMFFQgKCQsFFgMCAQAFAlJiNm9eFIAA
+AAAAFQBAYmxvY2toYXNoQGJpdGNvaW4ub3JnMDAwMDAwMDAwMDAwMDAwMDExZDlm
+NjkzMWU2NWY4MTRjNmYzYjIyMTczNmIwYzQ1ZjI1ZTAzNjVhM2QxNTZmYQAKCRB/
+qxFCZ+T6BBKdB/0VGRiDSGFvbOIf1I4dMH0JY3bctB2DoD/IH0bLj6j9YeYSx5fB
+gNuMJkd10FvISFwPGEXGo+feC4LHZ6AzaK91VqHZkBq9MWWHLf6fVj7/N26NE0EV
+lB+Z8xuVHMd81mkKqC7Kh/gby+9/oF/FCQzykOY/Z2o0SpU+GIzOAZzsznd9o95m
+L4Jkg8XBKBvczotCqEm28uA6aqax1/WhaYQvLaz/vbDimqR/WvIL29PUVQEXSUNB
+1WqOHMvNRBna5kNBxIbMxcyC2WL9JSGb5SILC4Akkzblawg9iWNqcuA1m3p4OJaz
+daP5JiqFlZMQUni1EOHoxurR0+tEZEaMJXMviQEiBBABAgAMBQJSa2veBQMAEnUA
+AAoJEJcQuJvKV618smgIAJkTHXzE12KgPxpwzQWbVgPVGnXzHzzbOdxuZh7yWNwi
+ReWk1g1H4uJIJo7RzLI/GIE9jONw/dLUwhFhxu+9bIHNix+5Ry0BVlxiS+KvDg58
+SEp2N51zWo6q7d13WvrnJb8eNQNW2cB6wC4VEqTSzuISO6+fCXMLShL7vOP1w2nO
+DVO6WVnd5TGlxalWbq+WSv+uepxfdwZUPxHtDegYTJTLh60pdDHcYPERZfwmvo9m
+zCQo7QXXiWuiW9/DGJZL82tB+v//ExiSePI/3FjDt8m3EhMYQnM39z4eLzj9XLTe
+mP6Lnn6xGi44u+nKmy+7gO0cywHlG7Oq9cukmZ70mkeJASIEEgEKAAwFAlKDsysF
+gweGH4AACgkQHN2toLREzdrbdgf9ER/0JR23pewJYTnx9LzXzQCe/E7pFZmjDyBH
+SW0xtRo1AJgVrgC40yN/vPVIU8k80RLTPIsOnu4tqrtkL54SL6iHRAXVSH63EzK+
+dpY+rz66tmaMOJj5H2iWq9rkDVg9k4RqRLxvKFJX0s5BR0SQrRTwOFsfrUxPIf4t
+3F6Xf/Tcf/sE47APTKQ6hpmUG021QnRV+vQ3Ybjgq6CUlQ7GhJ+bYmGcM05rlOof
+s7ngKy/ck37BPpZjg/taffeDQE2cAGeH3OWCcQwVvQ9ouUybKMsPEWTKh57LrDMI
+lJvoVnM1eiUaTVG9jshxlt5nS78p5yhbPsuYOJL0MR/UOfgZDokBHAQTAQIABgUC
+UpznRAAKCRBKaNzNVHBZpktrCAC1vevsh730WZvnYUvkmx4guaKEl6FxLRPcjvUx
+Qo92fP2qNRZNg2Uv83yAJmcNi5GnjqQCxK4KsjChilsjK3IAbzZ3b66BgHzbO4Lq
+FZAOqefCVXbYiLeEe5naYTBxgNkuDyLD5juEgX926RmUCU8NN1kCqyYsYuu4QENg
+5vhpWAPiigY2Uran4d+27PtDPxeLXOAtLglrqmWDyiJmUKdN/5RxEWfe4/85ufML
+cNXI5rfn7tBNzWme1KvfelgVcOcAS0HKufPfECc0dZU8T7QbopomIkP9Z0PE6LZ0
+C3dw5MNUzyjcy0uJa8RqcjE9dKUD1i0ekB19r/P+VjRRhcodiQEcBBMBAgAGBQJS
+nUWiAAoJEIYkYeTUGg811+IH/0r2dEZjYwELTUy4R0YBOBFQJ+gZ53UjsKTYFl/5
+rbiEJS1U16uj199ZjT/tOn0AjkJR/WOydvvqRM03m0pWawQ+TSGq6fEIwdsNZqMC
+35gWo8G68dBG8spBEXjawqTuPVcXum+bLVLWtgiP0FGRXCrV82tkq9ZR+fD36Ich
+QFe+LxHU1ujZXBBIyTb6xDAXxp1JcpinePnxZahXUyco6SFHOB31KBgPk7gkdNAZ
+YBglFw7ec/WWKFO6CEeNPshrCjxshfCGDCao3LBm1g41J1ymgYgcpIkVN840P7vS
+DqT9cKLP7z5e/zrtHmVCd3Bqe++AwWQ8sjVaZI5hoDnCxj+JARwEEwECAAYFAlKf
+jscACgkQyRCzVY2BZdOO9gf/RLmYgw6tN1bSaZMHJFVslNdajC0XveyRQ27vZWba
+D9nJdDgJwa5h8F1b9qtmHZ64iKocuskesAMXdRGbvucRnP942RjdeJngOEm0hijA
+fW0BN71tw1p9c2sZ/5j8LcF6nVAOtgxwgpEZXyE7+N1gVIdHNHGZgy/tUjqu26Xx
+YaUxnIIFXbMKrvNKw8nhADsYtbbavEmeNZMowToLw9e4BNv2Ha8HQFCFbVZkOynl
+a+zoLkCSYON9v84aidQpw3qSqx05WqLymOz+rDhuNKK1TfYjv2LXdm3MIpz+pZyw
+B6kOYV3DXhNsg+X0cq18IXF6TLewrJ+PPwuGePb40JzJQIkBHAQTAQoABgUCUpzr
+4QAKCRDmLFQ5uKm3TepFB/4gQ9T/Ojr6nMQ81j1wTQJwv6Qg8YqziqfACIoSUWXG
+iNMKYsuhlv/X8eN9Z5qcVkms9eAMHpX84D7W1CxrG9oEdQVttq69grdoaYiypc2R
+d9i4tDkCGaVf+C9xvzmJL1IgSV1YUcKsxwdgSqzFfkhne1qtQcoHXsnWNlpesF9Q
+Fqzzw7oHB6eJ6azHY3FzsamambMVpgoFjdFV0EZhMn3qYQ1nu/L1cVfK7nD63C29
+/w59ftWinEgpnaSbPmcPfFKRvb+w5NffWEm7F96rGVWRcQ8KhiNQBWXk9vtPMdHq
+4HrF28baSp6ZQsU7hdRXX4A7dxJ8u5b8DqvoDUDS24dliQGcBBABCQAGBQJSn1/D
+AAoJEI6Zuc/FoN8GXIUMAMzPoan9Ifn73pnEhlmx+/E/ZBqyHe0W8rvv34CTITHy
+xSR5kg2HjkuLkz+r//afa+YJDkl0+TXTqOOAkuAH//QrTsj8+FOfBbhTPkQsvFqi
+wLMA4NBhkdl6oQiAzlOjUan0KnPvhLgy1X0hL5KD+Iqia/WnivlOV7eonjaK2bZX
+eRssn1Z4z6l1sV6ygNqAgWM7CMti2v+BQ6kzk1VVlipru8+tp4y3VgJ01G2K2ieb
++fW0qWqwipc0f2cTeoAVjTvnVVFCbf7S3Dn5Cpqbwts0BiqHQEJDsh54NK7RU04I
+z5llAP+TjCDKhYDvg6IIe2VNrFxr7xES1WcT5Z9XIwUOhHhZuR9VApFT/mXbA2ws
+HSrDVkFhSlhpC1LdoRPkeIAYNBu6cvg3rQyAim5OmdwKBnWaEG0C6l11b9DsfqOW
+IWs+3ARoWjNvi7/gIjLM5MQ2Xv/Cwq1oQJCxOPd2NbD188WnJkxgEu4dlKQdAZE/
+6+/3AOaKDi6YswLH+NmlHIkEHAQQAQIABgUCUp+JCAAKCRBkfzWXiao8miOWH/48
+8WA0zBvsgIJ8FlD6KwbKMOT8wvNqo22s0vRREPogvA3YFdp+gwarOVtozzoNzq36
+ZEy1TESVlpJ9fFGVFxfR7MyuWB35+SZDi6J/ItjrqYracq+bnRx3q458nP95Xze4
+qI7e0YWHqACWlqbnwr3xZGPoEYzKshTynga2MMooX7RSABk7ZV0j8fEvrmrSwhOj
+N4S6Ow3ej9LJBAwms6JdSuOnx/+VBdbQ7oKGRzQgD46On26WlV0jH74pJSDXWLQ2
+CrSxz/ftEtZzdqofIbDYhr3PMe7xah8UzJuuuIV/kvxZTHDxbubSTQHTsOFhqCJr
+97Mw+grT2IKokWyrHKRbM0W6yw5tAuc881iwF7t67C8/WbenkC/KhceN8JC8gZgW
+fDgKsxqMuXCg929Ps1KIxqH1uMIOuM4jo71UmKoLh3JI7Jyp6cI4LNq6nSbXn4Dd
+DmMW8x9e3LU8HZyizoixW+JDY1W6LWWNCtpmJa8iVg8jS7SOAehsc5lz5dGtUEiZ
+c4fL1kOKAFsj424spEGJxIwrE8F4Y2DOJFz7lRcQ9n8WAT+TAFSfUoiu8X5qrnQA
+vppk1tT3TADbCFHMFdSFJ8QZMPmzUZPDmrBFFXrZx0vCm9uND6s20cJYGlEyZGAl
+Tk7CYchDLHi6WJ0zztLGHXW/Xc8SL3aRWSGr2fjNOQt909QIKm9g2IiIFdbVNKmj
+ai4ku8CVPSob9NxP+FfSko6oE8pk1ivi/9NBkJKuIo9V7eLDqpN2PyaQfTWmy94t
+WXPLnxlYbVdIV2NH+ygeBmJWzy5P65Q3n91+NxINBobV3tnMNIGOS02Jftgo3TzH
+ijh3VMBr3zxilN9ysGPHDFuMSMI7dCWKDXgP05X/Zmvk2O63cUDts99mL0nCMmG9
+RK0J0pbUpSuFfw4r/rhiwSxrM3narbn1XSAAvuaiLrQtMvtCowWkqlMJNAtgFQqJ
+a6nPKyFtcvx649minygO10K8/2lUy/QJDcs5zahEJ/lws99tqaV0RB8uz3f/ERw5
+jH5eIKdJzrC6zgCP6ZT3VC7RNlngoUXV0b579a+ziVLu6kU7KGr/8Y5bLQo2qZ4X
+FEIrTd/gwj0yFw2NlejWVF5kifwVSgA9Ft1gSpfSkhqmNWEUfCWi7eLTD6DVb2gz
+ewy6FfyB5Z9C/tPW6Jd4u3AzegK007wgzSf8ZJ6YdI5VWLVoFPZTO/zci1HNTWcc
+DWNvKJeEIlyKnpZw7V749PlABjvDkjzl9zab0cjuQ9mJ0jqkyyvXOxW7o1YiLANx
+51l8dvqw/VfXgMzcOyT+M0/4VtF6M6/SYA+O/cT1ox4AutqDMOWavVDm4cPLm9SS
+NJ16ui6cFnzfxaoQsAUyiQEcBBABAgAGBQJS+Y1SAAoJEHrQqRxAvQCReG4IAI9b
+0XlPZyCOy5VDI30nSJl3FclkOBHPVAB8Lrg+v4y1InSf/uSS7IrXPimVSwAAM3P4
+CalKmTU42zg9Khr2TyIdtoSkD4aPkpxMQGOLpKCIFJlg3M1Y/sh9RZzlx28CCS07
++tlZ/6Bm9dnkzmdN8r2NisVGxHh6UB3pAj90gEdVWTGYru++QY3ZPYVNv/x7Rr1x
+CWt+J4RZ+r75BBnjfSoNpuWc/wWXhlP1P/+j7ybtm4Q/Q83q68tjO+qqJ2IplNtl
+h71Her50PP9lNwcOmquFoYLS2DYfjPWMVLhujrOV7YHF+cU1CJGJexs5o1mjqzht
+icNIKkB0Edwbx+ZBVrSJASIEEAECAAwFAlLDzo8FAwASdQAACgkQlxC4m8pXrXzv
+ZAgAv80517fIe3nn/EQ1M/gvop/m9izI2mc4dRfOtOfzf4aLAlqSFD1EDt4dM5zg
+k/hSk5D+hzs2yK+AcUXEVUgzEf0wGe7CA3RK3yZNrrHqtNPhHGH8LTb9QhFUZL2d
+83KKAob5ULEtqNgB+DJn/UWziQ7vyAHeR2LcXRPTTU06JzNTnNFTjQKmIYIoPg1e
+JxqMc8K3DS6yr0IDtwKw3JHyaCY76wo2r2SJb8v25cGFfPQXFZgSfWadAT510XPl
+Gv4nWkoAPkoLQM+1TefSbEV8yAINZ9E+hiZ5O8phK4cWxrOF0WSBsjmiMJIHe0xQ
+58lahdYOvKbDCeCL/ukqa4XgtYkBHAQSAQIABgUCUvnmdAAKCRCQnB4bSJrWvNTq
+CACb2WJHuHb48LmjqxHtCltOiX1bqUd4XM7urACyTIFpzPpbyNww46hCleKW6xul
+nvZZmcC7RREC9IxAu3u3P4wkxUhZkNAiOQTJ2ZMRmvSiNPZGF/CIPauLUQbfwJg1
+5yo95N8XM8vcF191RrllAmUif7C0k8ukMYqLrcG30uSGvVW74zhZx7MzosL0XFOX
+VWcOf487jgqGuC3L8Vy5bmJMEK7zCGyYnmjmHBNd/dAC1g8zclaJm6Yigh1Jpsdk
+JvF6AcTKdxXHxLyyg6TAzxiuDooYuiAHwnL6jqvo82KuLPZdf3qocf3FjP9eAbMZ
+W+B3Yk63HojazU7h9+6BJIp0iQEcBBABAgAGBQJS+v/xAAoJELwN6FPCfm4zgKcH
+/36QAxvIhhX7poPNCwVnrnpaHpVC4MCvZjd4bKqp8lVrZCryKbMkpfGugGE9FHF1
+svLPGJPvf0ywkc3UyJx/m1bbgWijHmalzts+2MNoDTEH7jGikkfe1Lt3SudyYtBR
+IAarDuRO1PYACkJsasa9uOGhkZ3ttQtKxGQGf7aZPtLAGX61Ai981QtGMbHgjlyH
+NIbZB0yvLyP3P1CKj0PtnJRmi1OeqWfWmsa/MoYd1ivKZZvpthwVcRxCeo5Py5iw
+oXygraGsVx8IWqBLcAX6ne4L1ZREzkzwMnh7tBd2nhwi3qRSieLOeKo8dUmytIkZ
+lrkmrQ3l/dHvrq+SPI211cOJARwEEAECAAYFAlL7hGgACgkQakzoN1ov57824Af+
+MnuinzqvZ7pvP3+6Gtr2YkXZNj8s0TlAZI0+ziGdJXzc0yGMry6XynJltPjhtnCe
+tJ4tWSHc88Ardi3VqLrUYUJj5Mm6qVj1QobLDaih4yaZChy0TrmGFLKd8PT4wI/A
+2fWPGRwQYCWtgcz3NLmgV+Nt1XaofTRDJHk+hmvY1c7SgdIOfNB9hRcfTWPmKr22
+fxw+rMyTcY8Gy0g4XKxhsNATa9rrJvXxgBqOznXjIEpRw+1SzKj5MzP+y45ZLaMj
+tGfVFRIj9Ojy24te+ra8GN7OdB33D2mZdWhr+XQWTjHQGHGqnJEZG7QEEqLwydC5
+REeNId1YKuH4r+grqD0zZIkBHAQTAQoABgUCUv1itwAKCRD/tTl2knWVi+5DCADC
+3CtdnOYpX1P9zt1XGPPmInTsDYOjHvCmurJTVL9TQAEytqhQQFBlmFQqFiNgCZ3Q
+mqvRr/k1DpsNwKIkERVMAmEncLPWC1+ZdlJ5aGQZpX7H2jcDH/6LItKZl6iENxJV
+1uns/WQuIsPcDTD/ca177tAkXOcMIBQK1QJvKq+7lfcUsqIsv72Sov4FCMw+C+eg
+b0INnpR3pou8RDbe/LJqzAw55puvp0yDja9WB1XMoiV+JHulgnfaJ52L/4pZhjT6
+n9BdxrBQ14xNteg/pH2GWngjkHjK4EPDMjCyLxePfkPkJMs1ek2+H3pJuIvKd/kX
+VOBR3n3vK2yOiTkTEV8UiQEcBBABCgAGBQJS/V/9AAoJEP+1OXaSdZWLrWcIAJ0h
+peBNXREPb4kkfF+RpT7HWD0u+i6sWb5+Yzt+vuRip7JkVu+7FDefLJ6ke0nEu6xJ
++HbAmZznOjnAg3o8M+XD9NIJT8Z5yB+ikQ3AZuZ1bJfNC85++oKGq14xJSvcA/4f
+hLdGNmj05ijBMYLsdzDL+Wkdl/69sultxs4nD6mhlw2epZtiw5qj4dgbzz7p6O78
+3pZgXBvy5UFxgxx8hZsjDAayodfyebFNSLXC06uVjafFbtbQZc83UfJAxwaW0jF6
+cl0n7nquGPk1TNMVCHOd9VNCdhPlFJHctUbIv0+HNrzgWCrmN1JzP4BJZsIK/Oqs
+j1SoFdGwxRWpSNwgO3WJASIEEAECAAwFAlKOadAFAwASdQAACgkQlxC4m8pXrXz8
+wQgAj0li8ga7DxoPNue6DzfKUbXw/LqjZUgs+d/MlHiEXS9hEMBDKLAnpDVIwSQl
+Ldu7UvanjpWK5UVj4jTMnNKjJXHRlFc1WBRrehOFej6tob//cd3czFKDG+IewnQX
+OLI7TA3uP5rg9PikGJOUW7wHUwunBdQl9XpLJe2XIhR7BAC4ppYl14OLDXM87f4J
+grEDv8po/xdY+s2ysI31g8/v8mg2ROromZ12HMrsirqyVb+dyNFxcQi9U9ZC6h8V
+00G4+duTjJt8YpQ/DYybVpMmVa40ePV+Z113OFZn9JdKs3p0kSi8csyLyItyJ62K
+c3/yfspKE3ZDrd+FVJ/VJXUIXohGBBARAgAGBQJTGOluAAoJEHc3YWR7U2QV/1AA
+n1bPtu6ZiSp+10U6yMmEvc9jWGlbAJ9tSDXgb9k3bFr1scJJ5kBsFJLGJYkCHAQQ
+AQoABgUCUp+JYAAKCRCkTD3TpUjY4lRZEACqIACFZ0JHma1seks08qGrOYAIJxd7
+VS7Pgk4w8/kYaoXePs+F2Liaevnd06aCytJBxa32yR9fsgoPwoF2I4tRMCBn68Sn
+lw/te9SU7M9Prrf8Rq02gEO7a2kqAH6ZNcUHdQDw2U0Rj4ArnZkHUh2Ey4TJwVUc
+tZzeXxlpgqYRTBLNaJyyBP53N8A+nHtpcqJYdxDYMMdTYVNs8epvRMcRfO/dWnnR
+lnco1ptge3cwm7E1/zX96/7GTPDwvtWseo0PF9W6wbaWTNm3c71iDXJbNbcVWdFt
+BEJZBhHzciyN3sysHEI6IwGzmmpAKpQJ2foXpYhxy1LuHBT3kW7dq/mOnr1zyjkI
+eLSK4eqiWzIAePoJfeQUbWkUIAdSSCYXTNAb9dV0rdkn8vZRZvVS+suHDQgMYtMu
+pq3Ne5nJCVwrmfnzBj8WVKkPgShMgro26z6bFVIQX2dv8B7EXIEbut3DNeySZiaX
+YoMZRADPHhwO9BLhFwllSEW0uHIZSbPWkQu4e5cbvMPc1PhIB07lcPSP3VKXNSEF
+62zX6r1puKT04WHiwOZgeW2iGlIvGINawkhD4q0mGl2gsmD9dUEpkskAKKQI1BIn
+v1qxGbXYZ3mZpStf+w7FIDOOA6pQao/h8yLkcZ6K2Bya22vp48pAlT4oEyvm3GpA
+1X9/4W7wqG2EZYkBIgQQAQIADAUCUviNcAUDABJ1AAAKCRCXELibyletfIlwB/4v
+gUDitIgIRGSNt+g+Gl74DezowmbhEQZTRPJH1Uqs2nCr23ESZb+8ROGnY1yYiC9e
+jfpAabE6dPdfHqZq1XHo9je/LKq0zvaOWa+VKUScpQH1LsFM6K9W0lWtUwkFtZPZ
+eGHvYVgMoZvyq8CG433LOl3vuV2XMiEH4Qorq90INCugf0Hm/fXfw2x9632NlMb8
+dcw2J+4bEMYabBdyd4eTMw8MhutcmD1iWP2D4GDcf3wHLxALM/rmVyHMCQ/fEYp/
+ST1T0tiIS+UIEs2pZ4DtN6NWMlJWiu6BY4ZObSsiiEN/5HyX0uEqujAgQ3SN5UZ8
+oDA16dec1OOhoEZ1phxHiQIcBBABCAAGBQJTLdxQAAoJEGC0MXHYul9Bl7AP/0k9
+d6JtKAllAkACankmXWjNdzgqDJMES9rqiSITn3e5l0Yz6L9O62E6jg6j6qD8YAu8
+qxBcHNMjbfV4EjXxxFVvM9yEcdLWogrJzQ/ZTvOaiPKq3QMX908/g7gCTsjp4zWt
+p34mfDK8SelWAvboTbNEXZIQe8YlR17Wf4/DGeJOMFihmF159D8sikXV5k/EMUXs
+L3MB/m8MfDcHumAOfZiUhmIILXhlT3cCw0AOkJ97/u2eqlM6C7t5fLGC5k9tM1Aj
+A73s8bKBor1Hxjlct19o54/EpzmtLjg/UVdJJyXhvAFPxXay/Ucf4Kjf0gUNGWNq
+QJYWPINBDjZmPPvhFHniitgGFNT/kaP4HnmDRUPT1gGTzAlbVSMknBp7HKxKui+E
+HTrd6+UCh8ichYTGaKhq1yCMNjCC1FTqbLbY2o30pRn7LCQodWwvHZb+H/3LOmA7
+ok2IM7SlGYfLZAQ/Aj9UguCab1H+YaGZV6x/SSIVwXtQURN+c1Cr2JVtkfEI3dzi
+bx81TStOh6zWlhLVYYlorYM11kv1dMpOljokNAsdfOyNbtEI8C5M9Bt/VuCGYscj
+UA8gq2WX+u1Q6Afxdg8jGK2sMxZF2iiJ+fG0qvLX0Z/WIS5jQxhMA6cdrXnJ5687
+HpXDmlaUg9kdoEohKdLH7Gg6w1NWYFz+m2tb2gnkiQEcBBABAgAGBQJTPNquAAoJ
+EPYiSHm2lQsiBcYH/RdlC+JjtI+QJLvupWv3SvwATvDYat1FqqHze7Qp9WHfWrph
+SvXZBLKZ/ZzBUtzYLLAV3LP0Y6ZSCLuFTUfAkoqTm8E0ucKjjW5alFgSbPrCdY9D
+eH+eu33uZbD+TRkEmzCDPoFay6xL7ONMBD71JgW+g9Ztz90hz2xZGo76163LRX80
+lqJVuM2ECgC/VWbcyfcYO23FcwEb0UUAznPvh+dapXCl7cHgvSMXlUwUCqhQclnp
+/NPyMkUessmV8O5wOM36pkVG37oJpyoDSHEORELdX7NE47+X2iyA/k3WGOQ0BJQB
+47FJZMcVfbigK/9zhrvPlGiI82FYmjFno4FaUhWJASIEEAECAAwFAlM3HCcFAwAS
+dQAACgkQlxC4m8pXrXwQLAgAvbu9U9o0nRAk8ZTDTIap7s3cch1lw5nTOZFhWl1A
+ncPAYiEz0BLqS7YBeWpKKr38sbVuvpgXBo4vpEpRIY4b7TUp4ydYJMTry8XeErrZ
+M4my0bySels7CZxowsiaLoonTwceMD6OtE2WKa/4gSxMsLy4nWLxViJ+0ZDkGUJG
+vChC1z1QUKz4A8+huD+1c79HbNm+TEXx5vRsYHesVaIypbSr0KxP67RTySTSaNPk
+bOt4jFZ5b9HamQywDpScsN7elSNSVGVJPvCmlEUFP49eDxFhoDd8cFAZuqljT8Ch
+cinkvo/by/bZ9vTbP7GltloXtgKJfmrNWddzV8zOC+W5CYkBmQQTAQIAgwIbAwIe
+AQIXgAUJCG4soF4UgAAAAAAVAEBibG9ja2hhc2hAYml0Y29pbi5vcmcwMDAwMDAw
+MDAwMDAwMDAwMTFkOWY2OTMxZTY1ZjgxNGM2ZjNiMjIxNzM2YjBjNDVmMjVlMDM2
+NWEzZDE1NmZhBQJTPx1GBQsJCAcDBRUICgkLAhYAAAoJEH+rEUJn5PoE+QcH/jdh
+L8CN3KyejH7hJJc61bLiudILA1viZ0YI90UeoyCqzb0QAlA/teJd7Ieu+f1+kX84
+5rgICRYGZj3p8HJIzc+q2pDhlYYlB3u5fP/U0WiS6PzuMVvHEo7ifW56M67cDh/+
+bxbNszMnMaYErZfPL/43Orad5lpSPjvwxCFDD6WAQ17qAORg/dBv1rj7vtVBFvMg
+C5Sp09BdsotN1rlDyvv4SyuCK2IHvup2BEh+3tXLm5DnuoDu8C8jdCgOzRxqA1n4
+QYH+ITl2DLWD9LrDgFIAEUOuWA2M24ck/OSSKTpQw1YxSTC8f3OppYGjwVdW4uyR
+vvr97s8q9ONuEIyl3DaJAZwEEAECAAYFAlM/F5YACgkQIuNMkI8Cy6Jq2wwAlLGW
+sUgLsXCDdzH/moB2XOqB42cSxUAq1Y9TASdyvWs6mUsmvWib7JuyP663JvFIEq/6
+IkgiNSVKf+P+Se90+loz5dk55we2/bEjUTk3WC0yFvuGPr95wU3v3dQieD9Hj58k
+x43k0uFzzNDFt2Z/ZoxDxstqkUgDoi9Fvo4sBCL9iih+ZRnrxZvoFDDp9bHuVeYG
+mxfikzx/PfiuOXDy0GV9b+EUYjoFIGf0CDoKu1LxVAndAB8QY2Z3v7QztNOJdhQh
+Be4i7vCjUBwJ9n/9KKgC4BZ6kpmFDTDFj+/YUMti+XO0N7LxDGKRbXD7bLNB5QLW
+2DLzYg5gRN1+atzyj3Sixcc8zgm2chp/v2GgJ3gKQz9CEyKZVX8eT2iJFQxUISjD
+3obbl3+KIDfQnahv2WUSs9ncWtAq/jGz79uQzwsT6BKsxppFaELPRWyUZnjRtI4M
+nPwYmXae/u9IB3nDfk/s2Vq7L96ZYBMnnnygJQpen59mIAs/ZA3lvdud2LggiQIc
+BBABAgAGBQJTPybMAAoJEIJpXKCOp5VTbVgP/1KaEAPrhvDBaItMEm5uyu8nk+bC
+U0ak2cj2b+QukTeAhtrkj1sa78TD/KKjAPcMSMxWJNyypC5+mT0/qlVhbxYd6TZs
+WW6jR/XjCvPbzSyEeUnt7R7SngpjfyRC93fr+oT0ukFLf13fYL5vhtd72S29oifz
+GG+/ik62sSJqW2imCTPVNoviR61xIZ92G2Q43QZMBPADWJbHH0Lo/YhbxcPeInxs
+JYeTF8kO/yUTGiO1CWHx83gmVWgtw/IB+99iFC0M0tZPBajh1aK4KwwTw/WGVW9O
+VINm6S6Niw0UEvE474e5P47fz9KL/15A/JYqxpbowJSJkdE1RYPf8TP+AIOPhSky
+JiZ0YKWDbAZjKsn4ySA9TrkeQ80WZeaJlLS4p0QP18W/KRKUWcry690dkfMJkNCA
+OAb+mW6c9sLFAUcQtraCryTaTKmbSFUU8Pklfi5FqIEC7MxIsMY0KfuiDYi6hVzT
+EAwgmcENkcOXEl10pLuXtKA3oNT34elI88sBaNGtSmsVCVN1ItmxGIxtl/unlD/H
+BmZ6gB7fmX9NXbi68R+3pqSM+RKahIDbcg5KoEuFkMMzUkzmgIaXlMyFG7WDxPI8
+mZ9+dN9THddQ14TP1EP3tWRNHZZ8wNm8y5OL5+Lr7OUSR32rMDBKQ36o6JRsIwQs
+IphQUzrgVZun5n7tiQIcBBABCAAGBQJTInByAAoJEMIYUlgZ94RRCPAP/iGwt33v
+vnei1XL7YU8lsQ2JqyBspoW29ZCXSpnSmSSUE1CoybdAaa7tTxufTvCJtqUQPLXV
+Wu0oFFHwdLEm/NGOEpN0aFKj9p3u7b8Rlw2sUm/a/7Q4eyXrWhv4/JpnoIN7Cq4w
+vI7tiXE45I8Vpzsx9G7qqMgGy2YRUOP3s9WBbLqFf23AvU/EFW2A+HBvmuTsEl7/
+VlVi5o+B8QuQDXiEBkuOLdErWzQYTtJWBNEl5DpeJKvTZdC90jBP3jgtA9AvCVrj
+QBabrENezzTF29OwYVVuCoP6tvIRhyePoQt11guT8vi2q4oYgwiKhmR0ZAaaYfIX
+p4zPkgSCmyhcjkwRq/KAyPhemWcQUddrWRpkiRZ1j1Dii699m6LSqX7uISjRaGNW
+TE6RGseTNNMT8X15BLpa0EZ+hML0cVFzU92WCNyMcZMx9z6+oi2ntqGkF/CQk+VV
+q4I1ZciJzdaVStT7KNUjLt/vQlqfZbUzw7P7kG8Q6iqRRzkK0yDgEKHpxsZkGoeo
+H9Di+sb8RxpS+QlCI3I2jMcC9EWflhGtxe94ucbA98drM6ZMxzEAj5E59nXoD/K2
+i8PVVfRSd2rDLL7lL56PlNZpz1HXeH86kGXRzIucM1JlabM3I+GVpZCTucFiGkFa
+AxJYEIwNOMz47beP2/4J9ttOiZ7Ex4/HQ6QziQEcBBABCAAGBQJTg5KEAAoJEO0a
+ZQcAABARPI4IAJTM0C9eXIYJUCmf4RAk3rsMjVeVIWAIyLXlUCpkmYKqiRWlH9Wo
+OOsTm9zstxFqSM6ZNX6eE3ZxMyXbZsGYahGbHoWqVYbavZzXwYDiJrCM7PLEQAW6
+qW/Wx8/9aZKKnoIQirPU3KZmhbjs6q7sl6Ze/J4emTJm+fLUx+P6o55jgt24uopo
+kCCZnu7uouPgvWy66b+JCEPz6zzSIBQv50YU13IigydzqQhkGCjFl+I3P4qTJ6wO
+8I151BvpaL04AsKWRk+IrCMjMmpXK6WMGpQjdqKqza1pdvNK3JGOUGJ7mtw5vRwC
+38EXVznmrmg54skilHeQkOLV8UN3bzmySx2JASIEEAECAAwFAlNaDqoFAwASdQAA
+CgkQlxC4m8pXrXyUPgf/daLzMlwjTlmMqtXMcgOWLR7CZesMQIuC+KrKur8uD1oG
+EQxKjk5XPz/ByIQc3p+Y7/sxSH3fFYPI8+InuvDjbJQXmWOWvOMU+0w5aNg5HK/e
+kpqG1t5323a+DBWI2ui+npQwXplVjRPH1PrXuDgQnUvxG1+xy/cWCA38mFPyRpHM
+YbDdLuF4qyH3Ff93JwEXNcPO51UGtWxDSjMPAK71OA3m6AvVH6kTa+FM+GiPCcza
+3+W4oloGqiSbYI09m29mhF4E/593ZlJ7eViRbHUBT6e41cfycivKx0yXR2Q7I78y
+U9ujA1nyydyeQPKEBDojykUl45tiCGEFUkWtgJjkB4kCHAQQAQIABgUCU4itMwAK
+CRC8I2NW0Evc1swAD/9OY6ThJqOJpeMaQVVIWx5Ik1YmhFu+9G2nrJZF/c7RQI96
+2ugbnVG3ZbOjFM2hcOnE+OFl0LJJjrtNfhqc4o5n+HPv0ysr7M0N6vgegH1JN8nU
+iVkiepfE2GYkUK5NkzWMB2BRfJs7JXeYteZ0Cq0Y5xn8SUFYlJZZ3ml/Z2vatcom
+4fpxvkLMG/cZdzR666BVWbmQuC2Wk2taW4uV75VyN8bI20z9uAYMszKGNX0JWJqc
+GbYLEfmlmu3hD6NiuX7LL61gVXc5wjP0DOa8abwAyn751peaCKs9OAsxXPg4wOuh
+4rY/5dC0pfA8G53bCadDiZqG9vPKP/p6WtoY62YL21wVZmXupNiVeIDCopAEwIkv
+SS1JQvQY1474VFRhHein6JC7csZfH37XjjlnknI6vQAunhccKPa8ko5Evu8eSxsX
+EoX1xAxYVFiu/I8SdYKGWMz0Yy4c9LMAW/Ou/OdcPRRbDroAj9VEYsPyhuQrT1kE
+Y4YJCeRBOK7ZpaG5IFoOP7lgX0hcK6VWGHnbvOnF8+NeuryIFQBoSV7maNhDYSav
+USmzwi9gjZFnp6CR/hnH20lauHvwzTp2cGBGS+UMHfI0yN46L+Jjo1r9dUboqmR/
+kZxYQd3nlqEJBYW/7eiED/stf/E02NHW9QXs2ZfHOiDdDZMIFbjaAhg1YuYDRokC
+HAQQAQIABgUCU8KMsQAKCRCDgslcKQI9+WwdD/9V40Q++4vtud893RDMucMHfRso
+lnkI2QN83qL5tpEHnQFnWMuSlu1GELObZ6QyNdarWHvW4TvDe7dbF6HssAaK+P3B
+oZvvCxk7qQa789DW7RBkaaovW5dKyW2V3e8hXJrDl4aKXK2amzpBkX02kXz3ZB8I
+/+GUnoZZIHAlNYm/6lkMbCQBfIdqPukuJNlXjR8vdPZ8uLVJO2VdtctP2nTfaIxS
+QTDuD+7YLw5BWrGEXSkKBuvTILttgMmZpbfNy9nkejvB9NtlaneZwOqzUZjDuijB
+TzuMX5tqD2FYkQgwOTXQOSZzyi8OdPKVS1+/wOY5Ryo1jEkAyzDUfEEXLNk5GHGv
+MfTqcxPB9CUh/rIN94KiI+jL6nfBDShnhuCZlNtzADtNy9nunBt71CBIWSIPYz2H
+7rdN+KFCPmP9n9FNT3Bx+esN9Zc+YxLZ/Tv3aGaxdgifYR6cLjeiM8+4KY7dg4+i
+Bnj2nuknqkVQGTLDDfC36OlWj5+cBTUOso3ThcGlwhRsD1QtstVkh1zrfsnEd6Bl
+ZZPafAtsqtphBEnWobBevon60nOKXn2WX1uTNJMvVkj+3G2/RJOGz6JMUU7NXLfD
+LyCL9LNUcSss/gkqn9MTb3NyYJfHj5fbH/Ha4pIeV7mmoOZu9eSCMQOo/9Uo+Q19
+xgppySgscGwyVFJIoIkBHAQQAQIABgUCU66hKQAKCRB0VcXjwM3OuW1bB/46KjAd
+XmRP88iW6r5kNrexv9vN+xFl+p3wLnhEC/Zc/SiE3fgRjanUf1U5RBYvtHXmqIfZ
+jyFo1lJQq0egQkfhyCsXTvsmsupH8Bkw6SnWFCryXbg3MCTICbbrNuE1tAH1ESSC
+/H2iZUKoAppLRrZh+ZK4EifyPOjO5QkkRLSZ22GH5w6hvvny7vrhrDbwL+PNSXwb
+KTieb24Hp6lRLUS6JiyDmC488rC4/oNKfr+f+i5tajy/rGJWm7is9Ctz78AqPhy6
+PdKKcexkZ/0TOyycolSzAI/OLDE2KqhdmW0MmBHxxsTkRMzlwIoIpOV2JnXqRNOh
+lwHnBHzQi11tWiHliQEcBBABAgAGBQJTt9mIAAoJEN1A8liqzgHpaJoIAKittxrh
+HwDkZAGDjUpHaJTpMqTh5VVTawwewQv5M8OCIaCWcL0tyF2VkXyWMDJ6CQA7Ei3A
+cXYU0QYJJN0+m2ZT9/P90LQs5ptKCfdgc8wMk4mW85D6ZxT2qo70vH2S8/c8akvD
+BFsYGsFRiAZIaxr4alBFRadBW1B60Rg2DUFbNmH30yct6rhLpUIaeSln1oY2x7Kr
+qTP9r7dMM6HV4+wr9Z5NwZHChrX+GEC6+m4HKTK3WTDTmuiHtEPFcE1xX7XGlQTm
+S4Ny/n5GI3NPV1ci+zC+gJpn8gzgCdI7fs5PkcjRyhn+IZvRuxfG95ooTQ/5DcQw
+BWmmtgcan5Wy4O2JARwEEAECAAYFAlO5FPYACgkQ6sXr8HqpwqPIJQf/UddOpOXU
+Ur5AkWei/3+XMJTF6LLqdDzPRRH95IoL40sn+l22FahSq6zcbEi3ktFf5vIj0vlv
+u2k5bVUKShXMilye32ddeITv2DNisuRYHkY7pHL1kMvdFu1CiuCH0pZYHIaBI+Cb
+NmcpoY5RB4dl4WiwtAxyjz7l+ytWzq7qWAjBgUDtXhQojT7sG7gg9TZ7GMpwRgWu
+BFFGNYifzApT6IZkxWh6Rq/DhvlS5jcqfF70pDrO5ZYJbbpb7mjtEf/qwEIAvTvw
+VCua1yynn5RGAQQxOuxHYi8IiwiKEx77HviNRYIs11jbjGFQyJQYK/EkQDjsPMQy
+AzUVFQjWPzkcMIkBHAQQAQgABgUCU67DBwAKCRCfMYAseWQvJVOMB/sF5wN+K6db
+rC4u5A6Kq86wXya5TQfk8E/pOleNKVNoiBuAEi2xNfK0aNfmXJORjJEUY8LCuC4h
+VI5Di6K+UpbpauuKIzJvZdp29yXs827wZwudRHDlwJFlRv7cW3Eg1s5TJPIVPZgd
+mpjgofkv92ceO2LMG84V3Gpn9n5zEE2WPmRi3bULyJqJeFqe/Vf9m4xI4ZyocYlV
+Wzj8Zh2LkQkQ/bmx8xiHYtns3IhXriFY789kxvzHKC8PbW0NxQf6nOjL2aSpHLgD
+DXmFCWAIDf3pfGsKQp0OntyeGNCnTBRmJjH67ltDe2AgNLnLud1XSOTokgU0uO9y
+KV4kWoem6zO3iQEcBBABCAAGBQJTvv2uAAoJEELoaioR9I02fZsH/3tOpaptnALZ
+q+Nfe39YZECz0+W9LFnTr9lsC17QXBu94lh3U4p/SXIhEb+BsOKiBp4L6qe0wzmS
+GJNbP0V/zRvQ3wT0XCYYlW69SOY7vBGwUbF1zpRHZhD6/UUXiH24SAL31EVsSAwS
+zdJ6A2SIaLvn/b4OG2CJXVC5/YdXdzvPwoYDb3Av+drTppAm4gfwzSQRy8mcmZ7t
+SzbC1ZXgZjJkRFsnA5WhGF4YzAGo50lq9TAlO3zCkYCduhMjC4eE1yCxU6P+8Xgo
+CTentqODwUHaxcdWY/NZ7OuIoC7sBdHUc+NHyGVP/d34hh59sasuEx7lDTOtfSG0
+cylIdZM+3EiJAhwEEAECAAYFAlO6xH8ACgkQogy+sgAMZRXYLBAAo3MvO3yCD3gW
+v5mNPSpC1KrmpcIrIu7gUDEgv0YY6C5mezeRXwpLiPNZPeewg+glW6qr13nRBlPi
+ZaIQN5JRNDESPkTBC4k5c+QiV38zcqlggkzCv9sMP25wxoayI26w0GlO3/X0wsVZ
+k8/x+corjT5ZAeT/9Go1ZUGyn3hYVp8voxbZoOfJYTOtLXjQ1i0JrDulxp3DxrCE
+8OGMIVGpzejOxQPNLciEUtq1NN9QESHpXTaonTWjP8ubT019fO+qIl8Uy1h/ElzA
+ztTZq2gDuQ7//xQJ4R8DbDP7j0Qggpsm2Hso/Rg5ruSiX+1qBF+COhm16Dl7zoxR
+IO9+5RpanXm7g0qBcALCuIn2aQOMTtB9bA59I7fXsBMv4OuHr3bpxbcktqA1BpHz
+y4K7r98opgGpfZb1YyiEw6pAaW/VwQoV/cEQsqopuSmSngXtvFtXLPqAMkODi4Wd
+S6/YySiEUkKdpe72jHamZUQwWrXc0CQ0M+YONXlLizOVDGCHj+itHx/jqsA5KGnZ
+1X6/UqpwZLBlIJyO3JSXEjofIN0u7CyYspQZRpowhJA7EuGYCTCff5BJ/FWvM0yV
+Tk7yw1LXYvSbGWMWvwdbExADiWY4Nd60lVxFkopID+jqVF4ggCdGtSPMpzEZvdx3
+RnaCJS7A0Bq5zGKbf6or5u1XL9tf5tCJAhwEEwECAAYFAlO2mOMACgkQFtVCxJ1n
+Uejg4hAAg6WtMSU2pFsgEHr5rXHlQ4d0SKSsEPgFV7Fi5Rr/PtZQahJ5o9xVNg1o
+kW84KipiFJaPH5dzBkRjcZ2CaN/61jlK8DNXg7+ApIXWy/blcRhR6lc1fYW/jerE
+5QU2ImTUSxKGUYT/2HCCdsRBk2EWYBbk5uDL+h6KWnY5ZY03bmazYvEdw0/AtC5/
+VtpQbdw4TUvssu2cBXUnoijMffXmETZvNuhGmyVf7uy/Ha8PDAAQR38UJkLjytDJ
+hmdKNQ0pk8yzQ3z0lxjM00p/kmtv6LFRVvC36u9NmeNsmo8vY+WdeRWEM4mEhD8m
+pVT30Sp1LLpNuObkwzqH+vw5ejHh+NKpV2zSWQXl1MqGBc/kVqH7bM8PQff5SOfo
+d1eO5wUX1Xm5tdwnpvdfMc9tTosVouOWsf+sITyhwtvnr1Ph5pjbfHeyrEKHh7pR
+JkhOPd/CS8sUI3VKNe0mzhvydCljCfq/pcfBcJxrKr6JhCo0NRihhqL6IM6YFYqE
+WP6dBT7aXtxAeOhkn5/oHmVmthhuCwHC2Q9fGNwaiYmnYGBCDYS+AOo4rbMy2IKM
+kyqVgK6b6/wT8RHGJaz69MrZvuotx6Nsy+UaV6Ce0MDVNvWN0vo2SgzqPNDWq5yJ
+TnhbUbXxd7ZdlDc0y88jVDKyfi/BvsUe8u2uWrYOROiYl+NlCXSJBBwEEAEIAAYF
+AlO5Y+wACgkQrs71RuyLAmARpx//Xu2RFWxxhBSmX04zkINjZiEdmz0LPfr9Tby7
+Skppefe0k/s/t3EyRCHAjI6UOFeI3zpb1Dojez0bLrCqv++++t7Q2jbBPa0GjCI1
+pMVPz+nJPrfZSOkUpgzbH0CDOCrcQMFGyAka3L54sC1AcDye8Un/4pcBZ/fWd70f
+hbNtlSKqjXmpI6rouT4uowxSKQzje5fwzqsJZbZcYWyAeAfRdkCiT1Gf44J9sxMo
+9vQ4BrSUkXwEa9pR9fROxcDDCjsHMXgL+Fi5oYR9OfVUOxUz5TGWAuxNg7Mv1QBV
+taMjLAYXZHRrHqSBaHWDmhT3DDzGRTEjrlvSjtgwxI10Gbk40bLpL5BIlxT5Bhc5
+pNcDnrVQiZ1h2CTc6hpCmwPP3FC6iOEqAcCH5OMnFIgNEb+1/cuY9f3HgcbXAX9r
+o53K0cuCnpuUfdR2um7648wngK4amzMkOMbo0qFPMuPz2VxsHjcjWbKmZiQKFaEx
+jCyPmGvKEI38JAh8BC+rJE4Eng/zS99rlTOeEGnGxgJaeEP8nmbrj1BgNyvXUsPZ
+LXItD9vmG+xu6+9x5shG6Q2LRRYx5NT6CD18u70pqPUsulrmWZohlyz/ikJnMvy/
+StLGiBFSWIawWraJMl+3Hba1U7eFL61qi9ZfJzrraKY06OtckboqCvs/7ixWg8Jb
+xaHGKbz97GVzd40rufoD7U5dJfeqOBzRrOro4DcTRFRitzslaPedzGaPWQVt+JJ/
+tqlmHsS55X8rmsdR51+Td84DDG2tqoNzWVrVPRwyWxvYAdO5ZNU8l6C6HhOqEUea
++WtGWxzK6XqrkcmGlFKvCYd67+1eoHFhq7+SlAyqIqGH9HVhEJhvrpOUJSH6Eh1j
+B0wELOESdE4h1DO86lQnCAfS99ATIiG6gLI2tbUU5/HagVotMGDB82Xfva0JhJYG
+2d4Xcluu8276H0RZaQFtsDF9WRvvEH1DpR2XTZ5Eh+TxCI5gDiTZU3eIl2bHfirn
+qpkCPR73FRJBrUMXbbcqO9DFGFPoscfLLrkkmkI+ovUUGjrXN/SI7Wki6rHEcqhG
+FkWEyLEJ87LBZrB8ZzSH2DA/PnhbMeEY6/2N6F9LhFJWT8NLtEOuH+0KaD6MwHae
++3hrjdhvpVhlyDfT3jerPRHdvkgZJEJyZ8hTvmqsms9WWuuiHwtXZ1reRPRYio2h
+lr145esKKwQKKI7z1qTpl5sT9m4FCUxtv8oB5tzoBJxo7gkV+06Gho18HXTX4nJu
+2Q/ZzWW2mHtBJimajXNVmBgxJcgv2vnFnQl4l4nKgcAmrSVY8xyGNFJQ5yZMyKnv
+k1297hDnXO/erG9VOu/x+4vyvym4d2dWJU6G1bT4/QcjXi/YXIkCHAQQAQoABgUC
+U8UOYQAKCRBeOpO01N3NixXXD/4mk0TGtdT3HhrwstIA492xmTOnudt6wCHP8s9l
+LwdiirLWIVhA6f+kBFVAZufiS0QGeY3gfMmuhcJwEyhBjTgsfE03SW663dQwRj0y
+aQYuzJGMxORkUMi3r3URRXQVdCigcjYUzaGYzXzUef82LH24eyNDBaiJrCo8s+Gt
+pqUuAyLJ3kxaCxjMCyxZfBMPzUBheLd9c0NDmBRSuaAVwyqXlavh6E6vSY2Y/syC
+3YLvqDWif0XJg5sJUBCwf7Ju6gFGrN/h7wy4up6SIoLVwR1prU1fZWaIw1X0mxSy
+zTtox6AsCZgWn/AjDx6zaEHrvV6RQxyVUUN/AmlfH3WYIAJNOOSll8fwIcIEtnWl
+9TlrE4uJySCydZXPUa/+zTk0AvKWuaN2E7DyRvk6fV/4dNb+4pnQPUz0o+FQjy7P
+Wf2R/eK5a46svLVl1l/TchW0IW+D52RrIPsQRMHz9W34F8vvTx6NpARIzMTXQMDa
+59Pu3tBOmZA97Wl7ZfwRXqUVIYwf80B+zmAF//DWe7zkLoGrJPis9/ZGrgNpL+i5
+Cy+D4sy4OZfKveEMWfl0S6TpG5VbvmEOxa9RRbMut/SaqQBxQIV2/gRYH6x1injW
+dwAZ8mPgHCOLXDY4Oregj8f9te4MaSgHrYbM++BjSmtGu18ibgePMsE9nB/kJDBi
+yhqy+4kCHAQTAQoABgUCU8WCwgAKCRCDZQG+nyenI3RaD/wIlMHp4pu47UD4Ey8n
+Mqonl2OxwycHhI+n+gbl+F5k52ZaKQ/by7u8dXIuBGpgckVWBSGN21tyiU4fXiyb
+x5riII7NkXB0iZfpC17qE5VWLC/GIPo/e8aT3LDFVe/0oNbfCldRa5cmN4HIwIXl
+VSHB7dXUqIskjpJAc+FfEXJqs42GamQQgP8PqV5VvNLxzWv4ioUD7R8usk5ZyvsP
+WvtkJTqnw9nCI78zs+iGkYrBpqAbC4ICmkDXWRJOimcXSXtlxzZxh6/+9X63Du8r
+LXaKFYgzqlj/NWkNTU1kTZq67HrymOlzQNUNOIzpe4+Z2sg2qEAQ9KeWeRXQbWbb
+uvF/O9rcxIR8s0Lwd7OFFTcDaU91HRSSVQRgC6oT4IByZkPjEjwrZwJhPPJNk7Op
+hSu5li9iZvlB8gM1HFHtHozDl00HZ/EN2yGAUwU2uz6eneszQh72lbyzGZLprgB2
+O4WlmTb6wlJ9nWYl8V/FKge56keUDJueGa+fmQ3rTA3nGdUyE9kWpAvEuoasrV6W
+WFSTLOFudPDxGI9d8Kg8SrwMYdDxm96Dj7fZLOlw/1seOQm1AJuHXlaPqefG8rFM
+cVr7tdB6VSPrAtmF2uqCkomHzhlrvSbKzCz9xu2Ibe0/2FPX/ZLyz3zzYL2hH8Lp
+mVIHOH5KLoGNydTwLZyGgyz4X4kBIgQQAQIADAUCU8QtCwUDABJ1AAAKCRCXELib
+yletfDFHB/9Rg/GopXG6njxhcBcCUEGGwakRltV/TOqXem3zcVu3CeEPGt4oVqw+
+BTpyNc4WwPmYwlpsAldMQjqVA0ZfbKy+EWFUGTnMBxkfVIPSNagrYOAtwe6qKHUe
+uBWfY54INC1gTzeSlkzdTo+vXjLDQv7JE1gIeurkhDkIWlUx+8qsfNx+JnEMuhZt
+O/uUddbxJCw5/TWqP/sdbVpj++K2A33qshwLZC45ImyHKWXSMEtDf8vzxd/JTghq
+Jg3VWrtSAtsuDm9vi7pkVGMRHa81J9A+bIBLymTZcdLx6snoV5+tJPZ6LuL8tjhK
+x95VZ+pwvgMQJbMOW1P9QG8vaOHIm3NYiQEiBBABAgAMBQJT1fnPBQMAEnUAAAoJ
+EJcQuJvKV618essH/R4hivDd6XuQi3AbmumF6WmTuFRvwX059UflrMw0XnB5NOa1
+tY04OvEYyeB4Xd5JeZX1c4M1lhgfEVY6Nf+k9E59oSii3JBlDy68pT+zm5GvKMWr
+hweNqGgZ5bytrgzWRFICkUqt5GAsRZK3iPLpk1Alh5vBMlEcWMlRxpjm0qo4Smhf
+T6mbWXAenMVbfU8nb+feX3QIaNwi98X7VqW8uQkbJeVtXWGr+y0nhqNhMF7p9+OE
+2aETLqrrV6T6cnvsXVCDkbjdZN7/k6Nz7+vljkNMgotkiaMOq0lTp4N/Zym9dH6m
+4YUu1vOh+lzN9rXNPjQdvxeNe0t1n1M9WN5gT9aJAhwEEAECAAYFAlK0eNgACgkQ
+hvvFGwuj4WSQGhAAvAq9Retogx1daVFgJNO/TOVdjHjGKwJJ283zN68BC3HRlXmj
+yDDHC0D3/Wevw2pZhlWUqMYTgEOjWVVqeZeePx6Oqs/NAkAqM1+K75WifF7ccZPP
+5VWGapcZ2vTT0wghr4w2wFdnoaWBZ/NEaP1AZXcqHT4LkGX/Z93PLMqeXAoGkA1a
+LKcdLIlDL6ZPfVplMNlox+YQ+KprpiyvAkM/iwyPOPJvhdV7d92hFLL0xrf1dgBZ
+NV6STeKfVwqpeM8O5V+hUpGJU2GsxbuKjb2tqwbFblsPHTSz7Vs/CxSZgApH7YOe
+ybHHfRxM/8ucCVsWtSVpCWUz7DvBkGLlW5atRU19Wsl3HhJ3dap//k7qqpt7vANW
+iILtwH5Z2qy7qVrzcMvLzUKDCctzSJmoUvsq/mCQoWz5XA2wcVbbONrxw1qny50X
+ha8WI75lK/PBQxw+yAaUVH4yr7g08p7+Hqa69VCR+ihSQv8heTluMfZxsezeBpkw
+fEJMTrZC6j8R5or9D3vGd8AFX7tLjETpzctJx2757UHmY+QRyDwdog0laLzjRLgk
+bf+FQUOSNnIdfp+l9sGGxln7Lqyh7VTW3IrkDEIl8XsAdGCdxmRorErG9Z03qpL8
+v32/3MhkQoUcQOIyz/DbQWe3V+aajrZj/isIZoa5hMdJbOs0X1A1AlrQjT+JAhwE
+EAECAAYFAlPadngACgkQi+chBy4YZL5pGQ//TL87RzgzJYDVhCVCIWkc+PH+9L/3
+UFu9MrmFN//ks3amHJCErWPlMMDww+3uHwBS8Dv95MlQsojFDj57XaJDyv+xABpJ
+00DlQiMasVX8NKvYJ8XOavf0oTza9NRbcJQOoBcaZSj1MR2D/QD+xO+on/zPiA4I
+F4+rUKdJ0W3nmPvguGbUDehncM5cnhwOeRjnDOEY3qyvq1qcGUgRQGHmWQdb9MPq
+pU7ltuwlu2vfGqZgroPm7YOjQUFeTSXNWUMXW7y/W6L0c8PwgJ1jx9e5InqRTo5m
+t1p/a0lkVgSY4Q5k8BMe7GSYYfKQ+bLtB/aZ6pm/HLdjTrR+4DjhLC+q853IiBK3
+flCtIGX/DqseC/SWzsE5InQ6PO/KUUGNvQ5OeoL7C8eWtudYdtnwU462RwRXYZvR
+2/WpH1DoTMhis+PfHn8jZ6oms7532AN6OsMgShPRNI7xxKaxQQAG4DULCOUT4hV+
+lDEzWIGeQoP+Y+XWrmPkiwszmkk+FbZ5rb0t8o7OUQ7lqB/I6mFKy7JzC3ISKUog
+c/nUw2D1i+1ebmnQxEYTKavLWqfVvKDkY+ITE2HJKTkzQ0saZTQYIhyge7BDmn7o
+hRIZ5GQtr/ZMfBDkr1xUR8xaBKXEsGcLn3gC1y/pJyq4mt4EVQEThKHR1LqLgib1
+v2LgVIwe5QvSTUGJAhwEEwEKAAYFAlQAyCUACgkQluKhvoHUeqKSShAAijtxj0Az
+Zi6o/EYgrWZcQy6ZuKSX5O1INDAIitP/PTYBk4vy1/pMVwDgOJnYabaeB79En5f5
+yfInaGKzdwwcfX35T3Co/a/WwGoa2RTQ8SESM4uFfXj7g+e31bhH6RWk+hOxJDlV
+rvs1L33tcT/tuxr8vl8pIo/zQiX8erfgxOelBSqJbsxA+tj5ASlh5Oziu+uyCguP
+fhhEz+Kmhg4iWYsKdZbhzgGruA7uyoVVaY01ssknq749RblGGG6/bcdvJbjwMbJz
+ZFVNWjCx1S+vrjsGIyI+xTEDSuNgUUGhAZP06NXtdaPnmVXmUfCthc07ky+S73O6
+XHQX2CfUxEdYtwWcIR2AjDoSVtnFbOcoNaLpBgWkSLf7RGOU6ddTTTgFB0VH6l+J
+JCOJk9uq/nVmUimKZmkfTdlSduQLK8YlQt7jDE5Os3pWi1ndAtXzDSyAaxYDsmmM
+Yu420WSclLJeRyngIIFRjuMfkE5yQ4/XJLY04RakucKYEy/Ifi8PdsszPCPJ2w4c
+4YkOM67RGc+9y0FnHYRIhv6LakGl6072jmLcIHCzkmoubQPv/9e4lZKDM1YpciaF
+USwxk/Bceoy8JO8lylKvixXfakHMTmYd5RnJRXHaMw9oHzuIMLMXcFo/2Z7tSMU4
+VqkcxRlIGUxllzdzbyuEKDcsBYMydfjAdtGJAhwEEAECAAYFAlQR7H4ACgkQ4eSy
+oShroyNU8g//UWIwig7aKTBiL0vdeE2UnhKOzvwYUGt7yr1SWTEjiW5WVg7Fd7dU
+wxkg3rqpFVp1blixup6DJihTbBaz2sn8RaCa5k83HX/V7tB/cp29W0Iq7M41DZmi
+ihA15t98iJ0DWPURxo+cRNjVogrOF/xANjY49E4sp1jbvfMH1bKtJkknDJaD5q3C
+CktbgtcEoC0P5KU2jf357biJKUgvHtr32gp4qtjjkZSzg9u0knkjetqMusxmzv4q
+cPsDY/Ov5Xy7UV73ep3wlZX/Ghx7XAahUJ1fk834v5j9Jbtnb9MXakhwqhRoAZmq
+qy7bGY7yGI47E3r/ugmNTsUwT74IFiNkYN0GABr4J5dlxSQLoe6nc6iUuMQ1K86w
+mzYtgbqYRtKvMxYfKNQyLR5Q1tFo3tVWiQWjDdgznUCvdFIF9ZMrxsNKvJa/i4yx
+CPUPm3qqApleFZPMtR4OyNEgBSQBjzV02hEo/PtZQ+qm3Y1spj7Llmrcszl8g1Gk
+gb7LBG8uJYb83jVOaQnW2TJzrM8x/OJCAnDq9FDAq8IHCjBSK1cLgqjshfWjY0pD
+wSm3XubFWff52hjNVp1sNT92JmwPG1+vt7aywH5ScKxxyyjgcEitReamJoiKVK/r
+eRAAe0HhEhR1Ly4bKQ7bL9sobc2quyPfB+ql5/brRUnQhWlHfzRG9nuJASIEEAEC
+AAwFAlQ6KzcFAwASdQAACgkQlxC4m8pXrXx85QgAlsdERxQtdrK4PXAp/0J/uaMR
+vUatM9Bt2CqD3KIhHtrjhuPJnXzu8T7Gy2qSKuGlBKnsIIUYdtjGwa/Muclro6Hr
+5zVj1Dnhk9kRdm9+iuTZL5QoJkChM0kjuY3/IutyvZC6y6V8tzQAr5crgbIczCbQ
+PElhh4qobPhez5achWz4tGMiQ41fhxi4ZRk2/V1tpFr+XQ8KnPLv05pw+nn4emvQ
+j2EwosOFJX+z/882JOcaLVhf2UefPtaZBOUvKST2LuKOvgR6Kal7On79di4fTlpq
+hOFog70FlBhy7X/k8Ofc7WhkRRJaO3U5dlwJo2tAurfCgEBwg2btexzCxwWkbYkC
+HAQTAQoABgUCVFammAAKCRDo4ni6j1yKEcYXD/97wyRb1cMbV5MXIxjesYghtt8A
+MKp7Yn/PSid+pNZlaeDUPyFn6IDKxnloQFnm06kXhLIsZRJXaWtKI1r9U5agPye9
+OxBuK/a3jwXbWyRuEEiuSzNy0C8rWh+vkpIwmE7VRRa9IPuupcUuhHr8l6yHz69D
+z4qXj8Hs8haSuYAueo+BcPzPFZq/cx3xhb+pRMo2TGl1k52Dg37P7rGHCI4bRDoU
+snaK3RkzYnnq6zbOsZgdrvmnFXCGgMdeME7WIxnmMF+ZoMtQpR6uPZFdiimKIk/R
+6i3LOwy+B8PFQme2mmHh1ksc8WUyWNFeGu3p/qEWPOsYo27xYoj3PXDwg2xirEjY
+ddaqSZF7/y4kzXMMln2tQ1kFLdylSmAiT3dAaEuxvfaJVFXTroHvsUPF5ZwWKDfU
+Y46ctahUQk7bvlDEF+LF8KvwS5zzV/wWyyIDINyoGe3fJH7xH5DA/YwXzCtME5kO
+Sxln1q0FK+4GxRBg0w6sqYpycc9wZvrj46oz6Zmco3g22xD9pLkNpdYaB+I1SdQZ
+3fPv5wh0AEffvl2EUxPRxd3rKyBaVudGk4NSMgj7lCcmBgjoPCkxaiomZldw0cAI
+NXnANmP6rUbZkxksZp+hcTltvAqeJl165NEBLv02c3AnjatgNxu+ING/dhTFBILR
+FO4vi17p2/pnf2Vw8okCHAQQAQIABgUCVIXkmwAKCRBXJYbejhNFJMy7EACPlffi
+CRTKSitdRPb8K/7qj2knl+9jRjXgCQS2Is+cD+mjdGuKPtrDHV/uB3yc6a83dlrw
+zibgk34V8d/dmQCnM2lULQnApXXoTLzBrwR1fQ4EAOWLmhrYdfIQ6cKPzKjCu0HY
+1kKBGEx+HSeNfx/c2d9AjscC5AMoIMcCCsCRZWfa8CeWJkxNCFQvtIkJdl0OYT82
+m1VFVTNNaLT4Z2jKeCV9odKCCqixJnIFmQLKvrFDUZ1UbsHqys9nrbxS/jPrpKfA
+XvEPKZjLqlNGnQvdRjae8WbmMl/qfhqttGGTBgw1DynNls/uLk5yJx1jBRI8TBiK
+Ph9KMyc4ces59QWdKcMAx2VRUbF/1BOVVudaFdABAzLs7KAJSQrUPA6nVh/LYoWm
+zlCJrekQTAw5Mz2YctldAcu6V8AdGkzPB8xW0SbDQTCVSgQQSUOJJKkf9hvdKZC2
+I43OKxSD3r9oW5s3jciVBRWPjNw4APlSDo/cA58q1qDXL8/7XuqEYz7YSugDx/xf
+YCQQaXqaOdlT681fjdZG61Bpb/UXfclEXU5CHVYs2Q+CJgP6Q6n3hUoKlI1mBrEY
+3XNocHOWtHr14B+gVSlU3vPHRqaXwUfhF2nLRac5E4KDl+LWyJ5WqFwl/TyDpSN5
+ZGB49JxYdd5hyUFvafeVjeIQk/QM8dxy6fvc1okCSAQSAQoAMgUCVJnpmCsaaHR0
+cDovL3d3dy5oZWFkc3Ryb25nLmRlL2tleXNpZ25pbmctcG9saWN5AAoJEOzpIdqG
+O5X341YP/0AFeqUGu/DX/ZOypiuDSvgu4fFbErICGsmGOx/I7Z/UZxJIIy8MAXAS
+QQ7xeV7xuMf2o+kxkSIaxrV6PaiOtyDlYW2T8jMGdzpSAxwqGMoT06CMY/6gmxuY
+gB/BPcxTouQBrpRdb86JydXJTOFpwjSDel7wX5BKtxezYy941/6wrPyCCANt7Ys9
+WfC/ZT4JJOeVMC9r3C/qY+ZFioUzxwLGuYmIksp7u3mN92U7Ieurb7GBJU9zA0os
+k+6fGDsYvdb6kMgBgIgAQLSRe8zOACN0GDrfCnwStivLmNgkaGTdMLbgordm6wKF
+FQfJHyvFYm9wwlP64WG3ZYW1F/eriKu9HAlQOMTM85oDF/IWUC+QbSnlD+BDYg+J
+bIruvP6Im+qnSMeBP0w+jEFgX+mHfpOh1VCWEQcruGIqO0PjMG9v3oJQ/SBA9EKD
+YODUtP3xvOc2MVvawevkrbSbWsly6oVwEcMtvceFBG9/lNC6RZelOfOJVgXpMoTI
+5zRoHaQUB7DDeeylUB47fQ4mu4KtmvGqyc5LHe1WM8VJbopteYdzY2md67cvj76a
+L3JGvxZxxnihFdHIfvByb/8IeH7qZS92a6N3LyIs/xX5UMnQb+JyZIVtsBwytpgA
+IaTJ5FTHktf09HtAH79Pm1Inz1lHy3Z8KsEvcDREZvp+WnF+pA+7iQEcBBABAgAG
+BQJTvaraAAoJEAPPSgqzx5pjzfcIAJJKUzlxdHOWxuoXf1zMdqYYbheU8uzB9zW1
+8SEmqkB4hThvR1wKn6+k9MjXS0RWrV+2KETKQCibVXnrXxhzGQMdoFEYkBovtBSh
+b9B8rQRdzorpixWF86JTnGKV5B2YIuZ0yK/QxFhDVlwKgpsPtULtIjZvXcSzUmK/
+tB8aqlBJZGXoa0mSI0AqaheI5n3bkCFIycnVWzH9FxVFI6F2ELhRDlIK00dA1bEo
+Wj/+nAMbBxrQy/ROfjjM7sB7ENy8NLwai0NB1qLfR2UYDgisbPaLGzAjUOzc92tv
+Z7E70wUnJEKVJ64/KiZaDOOxmILKakZISJXDuoWXw2deT3Ul1C6JASIEEAECAAwF
+AlSjCY8FAwASdQAACgkQlxC4m8pXrXyQrwf9EU9cleqkzKURvWGCWaXxUHW5QBeC
+B2XFBtg9Qmp76++Ymlx2EPJWjkbpSq41d3PsiuYx3WLDaiV4pZvOvVfYOPRBw8GC
+dt6Ub2DVXZfDtd6r7gEG6TpqW6z6jZZrra5Q/Rd1hSxeXmMniM23bJL1MuMvTncV
+jX71mQr1oVP/i8rTGRDgp9w/0txkWV5mKUMfnDmMLLWgfRGNOQqoQCBKGwd2GoiZ
+dIDYoWBVwCS00xK29POtdIYgcqLH5FQwIPn81DXP3pCOiaZO3Sc7C+W8X0WmeGLS
+y2baMTuahIMIAbDMRsPjbEHOp7wlZ/d4LO7MfNHUb09kpmKJ1Yyycdhg6okBIgQQ
+AQIADAUCVLTUmQUDABJ1AAAKCRCXELibyletfPY6B/9sYWNf0hyNJ6h3s7afwm8Y
+TZlsWqtYRYrMk2DYJHR9HkfrL8yN0IornIRnPUw4JKqCVz9u1IUgjyRs6kriwn2I
+VekVQEcLejOvZvit3dv83kV3SKnJLo0GhaiMfG5u1YZDhXEv9F0ttG8wQEPyduIG
+xIU92atvl0L3hnzL50KuhsAYefzQf2BOihuaYh02T6BO9QPrkD2TbsqmfeJ7CsoY
+QIkidk47gBvSDy40tJAd3JNe/0QgL4WMIaPm8HMzvmbTVpsN4px1Rqwlnl4SAB6a
+Klv53/t4MuFVeX6rmEf7BPgWRFaDJSEjYlWJffpDM7xWik2bHIZc8gM67Te+bhgC
+iQEiBBABAgAMBQJUxqCrBQMAEnUAAAoJEJcQuJvKV6189oAIAIwWUtzMWZBF+fHy
+n7eBKXSEeXe7yojBZa8X34K6qDMEbM2zBha8giHHCZjFbxZS/hh2j9YNCBZ/sP2+
+29w0GcO0JDXNyJPqsxDVnSZ0hWCNec30adxS9E2+HcAFc0K3CDiggfoB3aYtVdqZ
+AXSeyqHIlpN0Edl9Smyvhhz+75T4ETugB0aQQ5Mf5REaEg/AOzXewDpAcnC+ymVk
+Yqq9ZIZYFMYiZgFJbGaHF60BuR6bMD7aPF1/LJNETXpENvoWsiEpnzALp/GohWf9
+CIo4Fu4xCyg17r5NUsg9+6flmCOT3eR/7XLLzyiPu9WbWHXbgdpP6uBTZuEfdrK4
+5jefQ32JAhwEEgECAAYFAlL673MACgkQwICDq15+pAokfRAAhx890VG++EEp2v+s
+EF43qEOh7RjVXlC7gaJv/9Tpwrh/gON0a74m2ymsxSKOIpi/s1uwc6l1mc/kuSEW
+rHa5FABtYla7l4ORfcR1b4hRfALwjbiAXC8J+aTRlkaFPWj6OMzhgKcCT3nEzQxK
+2bL8ZO/rDzagM7NDN88lQxNFHnPlecr4fba+ffk19jrqwOCphu0iusI8HxkwJiwH
+ROf4LmalY3MGFSqfQIoaJu5zhDjpppalDmjO2l8tscV6+r3i5byZqN2dkQQ3XsOk
+Do0k54v4BmMTwXp24oB7tV6DvWHqffijRNZpYYJTKeAsbbJJSICNEklWREJx4NcE
+1tfXZQbjubOQH9AWjpkTub0A/Sv8hIaWFHRKAx97JeyNoAsYr8rrKxf8CI31Rjbk
+PEbHu+1xWKrmff84bi2J/J1+zsNcjk/+cegNjwCQYOrnOx1RTN389AhjZ7hV8QNT
+W5Czh1T9J1Re4AQupQbV5jeWV2jeZLZOM7J3Ef9YWtIQARO2BIFem5yHPnfObdP9
+fFpGkzp9S615AfK/XKDy7fsOG/PAZd+PLazZRp8bR04a/gnos8oq+ZbYcl+Cky3d
+kFM8DvUaF810HPlAGWvCSeLNmARMBAuP2GbnuClUf6yPD2FAv0h/HvGe0mPjZ0UM
+Ku8GSJ5GWTntqPJ+LxCRuXOdj42JAjkEEwECACMFAlOv4MgcGmh0dHA6Ly9vdHRv
+ZHYuY29tL3NpZ3BvbGljeQAKCRAjutNRyRa2fX3VD/wJ0hJPbrhO9lGSRmzmLjN9
+OqLRqxVVuupdB0ZtVoEhB5JXOxjj49fu23bK/z/fWNR6ZuOpnaXeTwnaC0SEcv+T
+K9yHEkcIWWs10h6Wmj+Ab4XwvmaMdzKb0GigUT5RcqvOaTlKtrzUOd83UQzG4a+G
+uXdRD4RAAH1iAqs4mp8qVNQgvGE+s0t+6OIEXv3BihHKBSppyM3x885z7xfALLdD
+IQZfYTX9xx/1eMtoNuMfvcZni+pdzhpchNy61wTb5Cf2+U9KosMOtSTdKkCFMyUB
+ETOrmLXIbc3OZ7+UOa5whyaZ8VQQrnqWq+WftAOTiWPpxG/DsrY1+utzhaYjFA8Y
+8l01I9JlKh9LRThQjGrYDx817NSUqStHZUUCy06QgBWCw/G//UkmytODmBSQZfqV
+9iAdcKR4ni3tgWzD60WSsGodwslpkcbPZw1b6qjzSRc+HLJpJNFi9k7qwH4Cb+AH
+NNdIhWwOszWhNKw/Fiw6LEfCrP/O51uWafueQQ0F7MMvxj9MKbHwoUOX5BFImqm1
+6SfrV9t4ad+8NZ095gwAJxQTUdwRiAV1UuXwZwhIc+DoYnWTQ/m+WVdtk/Wc3pie
+0qkgcr4WvHiLBt3yjeGuyS1OXjBXs+hd7vjj5j6boVWWUt4eQVBKkoeW66akV10c
+nya86EAdMdcR2/hvVVOvNIkBIgQQAQIADAUCUyX3XQUDABJ1AAAKCRCXELibylet
+fIiICACrqngenwN7p5ii1tmJN4eyMk++Sz9GVqSvEOFBFRwfZdZXTd6d4Sr4doVm
+Sa4M592BPpYZ3eU1xd0fvveBj8pYXmdJCOeTvt2lOjpjjh++9fTlPnrOhHacW1Na
+OjsFcAyWTug37nXq1yegShlVCo2/bDl0z/Cj3kL0W/Ck/hzyzpVUPdrpFeEPrDC5
+so2P8t10e4bb8STA6hLkMYEyjVftDQs2N0ml/48CCH9MpuduNXHjSjXMS/GXFNC6
+8w1eRluVmCsNoITqH37Tkj6+BUhyo0IluxxvsCrOUuOwmvvTHwZ6C2EObTtUphPQ
+/Yy/6Z2jPB0exvTt6MrnhUQm7WsAiQEiBBABAgAMBQJU2QImBQMAEnUAAAoJEJcQ
+uJvKV618jUYH/iRhR3OvceP+/ebyypdmtVGnBXTcyWZVDaztva6gg1TBoHK8wzId
+OLoEmD3wQZ9EBDuZywRGnHrgWlof/WMnhk4ZuheZeVFTgA5RO8E+IquIhcrkFBep
+Fl8LN3bFxJ8L+s50cgFVG8e0BG6dfqf8IW4M82bs+A6fwrji8u3rbjuuhXvG9R7d
++fegF8nEazE29ykdg/pwDGsAefyGYWhNuRF/wZoNI9GiQUHmtsmRCUIHRuaGSZ5l
+eYjFChoyHh/W/GG00JI8OdL/jOh8Do82HmEDSDYmtx9/2/T3ieNhcxyllcUHeahn
+Uln6cHwEuFI0bzin+P0927cwxOEUtXDYYpiJASIEEAECAAwFAlTqOAcFAwASdQAA
+CgkQlxC4m8pXrXz50QgAoxezroOZ3HL+tejY+gRr/5LsOQgc//CdlDCOVkldPNX3
+LMl/I8RQytSepgPF4pxc4g8l+WWvhNp+no6z/TiiRm4kMHm4Y2PcXQ2YX335f7wR
+vcDZpUijYP6YbvDUwyg3IuKU+WlHO5ggOlDpoctTr6c6+z5gJsmy9ZxAkQyK7ZHB
+K4tilZ4jdUarL2orpiSQEnlfgV+zjP6maZygb85MBoR/2HQ3vI9ot9XI9ueSvR77
+RGdo+6bsvf+RUhEdrC/SHyX04mWvaB/xzYHpxk7rUfAES8A+vrkupzJ4lxnWIKXp
+cERo4l7pvfJRiAAvpLXSG2X2I0+oXwd3n6/OBG2ZBokBIgQQAQIADAUCVQ0a3AUD
+ABJ1AAAKCRCXELibyletfOOlB/93RjbZ+aSwsRTKjtyFf19XJSzS0RIQL6U50KcT
+3mrBNe7MLtt2S2exY1rbPCJUkkU2o82pxsrKg1D3sHIiP6dSkN5RiTTXWz5aFQs/
+fV0BihNvICYAkh/1BvL39T21a/cJqExvcG3JqBN6lb2NhbS6CwrRVop63wzVMDJ9
+VPUWHxkeTb+vm1Ucpc4+Lenuwq9rAliglxjJjghs7JxdReI4Mb1NEfbp/1mcKUEx
+lLhZMhmUSDo7lcmQ4jpRPvuWOHpdM9d6ZMDGvNQrpzTVVlcpGLKzfwUibNfQS4+d
+C4CweBhiQwjRHEoGYxpRqUhvtkuwloZfR2VoGdNDvmwbEfMSiQEcBBMBAgAGBQJU
+rjxmAAoJEDzYwH8LXOFOWPwIAIlL4BdP6UUCqktIiVtFpHpcLdwJoElOOlxmpWen
+tQH8yNVrHdHaHgNzG5KMQNK/9RUvVeOQZX4g0/a11/GvwcY5pKNVSD1Jev4GSthf
+585s6DyEGV/ptBYLLDFtSZdwttN+psNjCW3nk8cWY3cV0xZ6rOq22nz42puv9Q51
+TnaxBZk5kjROOetXQapW02twdC4k9tXLzuxjZ5w4zul9j0DFvXXIENHRMZVQDODr
+e9SkkzfvYyhqLMB5hFMZK7bnY6LvtWWM+aLZRa1B/j+thWwhM0JnCyKtqOXS8sGK
+rfpj7et2f66fi+i2yNhk/UBBHGwNlhYkeZG+ovcWTAtRjdGJASIEEAECAAwFAlQX
+PQ4FAwASdQAACgkQlxC4m8pXrXyvNQgAq8NazgIJu3cuGoIkel7tDAdPjFtQuznc
+pARNRSwVyG2jdZHOrNf76AoZK0NIqcenuKVyLe/o/U9+P4ufbBPajqnhSqEiu4f0
+mk1TWoJxWC2jW+Ew2ZLNu0adtoAqBE+FDCieAObUKF++4cxiU4r5npilADucQ4Fy
+UGLTA5RUQy4j9w0rQJ4xCAhzxBT/SiULlKQgEpj2XdOOiHSMS76fbIkw991L8ECN
+/1DiNDAzbExE2BwS0WwPb3KUiT0ookS91Q2i6mWaJbCa4iJUvK3i2YTxPpFb4N2e
+YmCCvKMLT4RC/2JQlUSjEozMImdYbFh1c0snzXmRatWK9THyyFuXx9HTt9O1ARAA
+AQEAAAAAAAAAAAAAAAD/2P/gABBKRklGAAEBAQBIAEgAAP/bAEMAEAsMDgwKEA4N
+DhIREBMYKRsYFhYYMiQmHik7ND49OjQ5OEFJXlBBRVlGODlSb1NZYWRpamk/T3N7
+cmZ6XmdpZf/bAEMBERISGBUYMBsbMGVDOUNlZWVlZWVlZWVlZWVlZWVlZWVlZWVl
+ZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZf/AABEIASAA8AMBIgACEQEDEQH/
+xAAaAAACAwEBAAAAAAAAAAAAAAADBAABAgUG/8QAMBAAAgIBBAAGAQMFAAIDAAAA
+AQIAAxEEEiExBRMiQVFhcRQygQYjQpGhFbEzUsH/xAAYAQEBAQEBAAAAAAAAAAAA
+AAAAAQIDBP/EAB8RAQEBAQADAAIDAAAAAAAAAAABEQISITFBUQMiMv/aAAwDAQAC
+EQMRAD8AyohAJSiEUTyuy1E2BIomgIRAJoCWBLAgQCXiSXAmJJckCSSSZgSSZZ1X
+kkCZ8+v2YQCyTC2ofcTW4QLkkEuVEkxJJAkmJckDOJWJuTEKGRMkQuJREgERMkQp
+EwRAERFr+RG2EXuEirUQiiZUTYEqNATYEoCaAgSalS4ElypCcQixMPYqD1HEV1Wq
+CZ5wZydV4gx7OR8w1jrX69UXMQbxdN+Dgffc5Vuo3qcnkxSwuRxNzkde3Xl3HryJ
+lrrWI2k4P3ENPlDllOfaM55zyPzJijLc9ZxuOPfnqNrrDWBuJHuMnuczFudxXI+R
+CswekKScjrIjFdhfEDtyVmh4ooHKMJw1ckYJhE1RXhkLD5kwyOz/AOVQf4GbXxOn
+PqDD8icYHe2RkEwerruoIdHJHuO4S8x6iq5LRlGBhZ5bSa5lI5G75E7uk1ouOx/S
+49vmEw5JJLhlWJRE1KIgYmSITEoiQBYRe4RthF7hCsrCATKiEEosCalCakEkklyo
+o59opq9S9dZIXH3G2IVSScATkay/9TeqL+0cws9kCtt1hdzwfaBs0wsPqbGPeOal
+TWODELc/5Hj4ljYN2lC8o5IHzMDdjA4/EuxmOPYe0KgJQNxuHf3NMg1o55yGx8w4
+OeN2D8GYJ2Whk6PtDVAXsy459oqxgO1bbSfSYbzAwwf9wTYyFbPHctqynKnjEisl
+sNwQR8xukBzgnB9opkEEAYhaV5BBxiSkMO61qSfQ4+OjMJrRbXsuUbvYiPVacXIf
+MA6ib6PynwV9OeDMyxWk06WKWKAj3ZPaaVraXXB3oOm9xC16ayhx2FbozVg/TncE
+yD3GjsaPUjUV/DDsRicTQ6hUu3L+1uCJ21ORmHOzFyGSSVFYlYmpMSAbCLWiNmL2
+iFDUTYmVmxKNCXKEuEXJJKYgAk9QOf4leaq/snAE56sQM9EnEL4haLHLsfSOFE5t
+moYsFXvMfW56PX+t1HYUZMSuUu+R7wobAwT3CgbicDviPjRIoF5YZI6EyiWEEgd+
+06C6YscnrMcXSqijIjyPFyPJL0BiOQZWoB0+pW1RhWxkToNUFBVZVum88V/QxGrh
+Q1izLDnMogqvqXgHB+o4tApJDRsaZLKsn3k0xyLaAMWKMj3h9JVssG4ZVuvsRs0h
+P7Z5UiXXXsoKA8rysWmNlv0uBz5bdfUI21gu4blxBvYtumII7EBpLDsZCc4mcDrW
+bKwp5UdGC1DgFeAyEcn4mLCFrx/iwgEtIUoeQOokA3HlWhk6PxO/orhbSPkTiBQS
+D7H/AJOn4ZnJIIKzTPTpSSSSuaSYlyQMkRe4Rkxe2QCWbEwkIJRYlyhLgXF9ccaZ
+jnEYi+uQvpbAO8cQPMau8l1TOQIBSDYcTLk/qOZdY9RI6M18bMVAu6g8x7TVMbuf
+bMzoaR+orLdGdGmrBc+6tMWukjJX1AfElzlRn4m1UnUNxx7SaqrKHiYawuP7hB94
+xQogaU5EboQgxqyA6qrcd2OYPzAqY6M6FleROZrU2eoQWNbtwEmpymxwODwYOg7l
+U/Ec1VW7Q7vcGVMII3JQdS9OgVnJ7MqhCbZq8Gpzj4lZxp+aWB55iCseRnkRhrCC
+FPvFbOLNw95Yhqq3bx/ieZ0/DnrB2jgzkJhkXB5nR0NeGXjJhmu1LlDqXK5JJJLg
+UYC0RgwFo4hS6wgmFmxA0JcoS4ElWDNbD6mpPaB4fU8als9gw+gr3uAesyeKV7fE
+LB8mF8PRjcABNW+m479Gj/s4A66MZWgoCw/yGDGKK2RFz1jmMqoPJE4u0jnLpmLA
+gQz6TcmDHThRMMwMjTlDSlG6yIZa9scyswyiFAIi2r0/m1EAcxvYPmbRBkZ6lHL0
+mhcJjHRjhoJqasjudNAg4AEMq1nkgQlriHw4oC6iJ36Y2OSB0J69RWVxgQL6KvJI
+Ucy5WPKfl4jVadkcHEQY9ie11fhvmKdo5nk/E9I2ksIK8Ga5p1AaHwVnd8NAJ+Zw
+Kh6gR1O74PyxB+JquV+Ov7S5JJHNJJJcCjA29Q5gbeoCyQgg0hBCrEuSXAkkuSB5
+XxpSviJJ6jn9PVebeWI4Ee8W8N/UUNaB6wM5iv8ATx8iy2tj+It2OnMsejJA/EFZ
+4hVWMDOYHV3qlfJxn4nIs1IBJZGI+xMSOmupZ4mM59oE+KVk4JnLbUK4J8sgfMT1
+GprzhQM/mWTV16Ea1D0wmxqMjgzyy6hgRkcTp6LUoe3AA9zF5xZXXVyeZi3UlASI
+Su3TFQPOTJ65nN19p3slBDY7I5kkLW38WvBwgl1+KaknlZx2GoLdn8Yg18QZG2tk
+Gb8Wb1I9QmuuPuQY3R4hbwGM83Uz2VhxY4B+Y1pHy+GZvyDJmL9eqqvFq5Pc5X9R
+6dL9ESgHmA8fcUfxmvQakUXBiW5DAQ2nqv1+oe2zPlAemJPyzb+nn6tJYLRX23Rx
+PRaHRvpqv7i4b5iWiQjWMuMnPGY9o9Re11+n1B3FTkRaeG82mZJJJXnSXJJAntBW
+dQpgrICqQgmEhIVcsShNQJIxKqSOwJcpv2MPkSVrj/UcinUal7XG4sG7EUr02q8y
+y/TgMRwV+J1/DlFd7lh0IbSBfNuKDAJzMy49X8k2kvDvP/uLq/8A5PnHtN36I3HI
+AxHrK8Wi0AkYwwEz+oqXgMPxLrljlXeHEoQWJnIPhjCwkvx9T0txDqdjAH8znvQw
+PrsBmp1h4y/XOalMhcdRrwvRpqddtK+hRzGadKG52Ej6nV8O061tkLgscmS9NyH6
+fDtIFx5CH8icLV6FtF4gwrT+2/I+p6iqB1VItTobh1mJ6iX3XmSFVslcfcXfTaS+
+zJUTsPU7kq9Kgj4buBGhUHPk/wDRHkeLWmqpChVAIA4AEa/SVfuKgGSmt0XFdSD7
+JhDTZZw9n8KMTNurIWp0dOpuZ3qV8HAJGZ2akFaBQMDExptOtSAKMCHxzCXHH0zV
+afxC3zF/ceDCGrZr7rQOHUYgdfpn/XZHR6jjgrWgPeOZVv8AXnQpckk08iS5JIRI
+KzqFgrOoUqkIIOuFEKsSxKEsQLkxkYklwALSa3dhyCJnw84tsBjQ7mxSFBsK4b69
+xMWPTz15c+2lGYO+lHHKA/xCI3MKSMSNRyW06qceUv8AqXXp1BBKqPwJ0LFBHMWt
+4HELiO6qhA7jelTaBnucpG3XgHrMe/WJXxxxEHVqx7y2HxOdVrlbswy61GbGRN6z
+ebrFu0vhuGHvM+WfbmY17DKsszp9UDwTMVufBkQ55EZqqGczKMG5EYUgQz1WuhM5
+lkzOZpzijUrZdlyR1E7zl/xOi7qtXc5bHLE/M0599XFS5UuHJJJJIEMHZ1CwVnUK
+USFEFXCiFWJqUJcIkuSSFXGA6mkgnBi8ooG7ksa568WgcNmELcQZ4lE8TDvGXs+4
+B2yJpjziRRkw3AhSxGR3OTrKdWl25SwH/J6IECZdQV5xLKa8/VqLF4I5h9NoNW9w
+sWxjn2JnRfQhzlQJ0NGorrCkjM1qpXpCKQth3NiIX0vp33D9s7Xt8xbUFSpBEzU0
+vpr+PqPVWZnJT0WbR0Y7SSBIldDORKPCkyqzlZLjitvxNRzvoiSSTkkypck089tq
+jLEkkIkuVLgVB2dQkHZ1ClK4UQNcOIVcsShNCESXJJCrkklwjLHEpupLOADKzkTF
+eji7ALO4E3GtSYywEWNQeznqR0AbxVazjaS34i9mvvtO4K+PoTr+RVt5UfnEzvFI
+4AI+JuY1HIXX6lDgeZ+MRhG1brvWqwmPrqqsc1LmHp1W/wBOQo+pWnPXUeIV9I2f
+syefrn5vTbO3Wqd9zOpqDrnEzazXOoVncEzopxxiARdrdQ+czLJmtsTOpf0gfMwh
+xM3ZyM/E1HLu+gpJJJp51ySS4FS5JIFQVnULBWdQpOqHEXqMYWFbEuZE0IRckkuB
+JcqXAhGRgxcMUba0Zgr69y5HYkrfF94w3MzjmYSzJweCIdMTDvqsEiBt0zWdRtRy
+YVdohrXJ/wDH2k9GO6bw4ry3cbDKT3DVsJdVSVbRLdCffj4hSQRxISAOYxnSZrwZ
+RGJu6wDMTNpZsAkxjOmqyXcKIXVjDL+JNHVtGT2ZrW9rNRz7+FpJJJXFJJJIEkkl
+EwJBWdQhMFYeICVRjCxWoxlTDQomhMAzQgalyhLhFySSQLlN1LmHsVWVCfU3Qkq8
+/Sl9fORwZiq/adrcGNWrEbkzMu9PJcCO5GtA95xzY6HgzB1NnvLhLjr+fg5Bha9T
+9zh/qWl/qG+5ca8noxqh8zNmr9szhra5xyYVWZuIxm3Tllxc4EPpauQTF6KieTOj
+SvtJTDdXE5X9TWW06Wu6okbW5xOqnEQ/qKvzPCLsf48ywscjw/xc2sEt5+52AcjI
+ni/D2zdPW6OzfSM+03Y4dQeSSVmZZQmUTITMkyCEwVh4myYKw8QpKkxlTE6TGkMK
+MpmwYIGbBgFEuYBmsyo1JKBliBTsEQsehOL+qL+KVEns4nR19oWraDz7zz7/ANvW
+1WA8bhNSemufr1FgilqR3gr+YGxM9Tk7kHpDRWygrOiRg8wbYxzzKmObtImwMw71
+g9TVVWTKYzXUWMe09IHtzLqrAHUMmBDWDKoHEYr494umT0IxWMdyKZQe5kvrW2pk
+cZVhgiRJVzhUJ+JWXiRoP0niVqL+wHidrStsSKMfN1NlnyYwrBV5nWe57cevp5WD
+DIkzFq7QD9QocMMg5mLMc2iZRMzmUTMiyYGwzZMDYeJFJUtGkMRpMbQ8StDqYQGA
+UwgMIMDNAwQYRDXeLJQfLqG+08fiWTUdN7UrXc7AD7nL1vjAGU0/J/8AtORbrLLC
+TY5Z/wD1Badg+oQH5nSco7Q3Gj1nLEZJM5WpLDs8qcidbcCOJzdcmQcdytR6XSXi
+3S1uOcqJtmzOL4JqwaPKY+pJ1gwM4WZXeVHGYu6Rg4+ZlhCkmBWapfDczdq/EDsO
+ZSH1O7o4h66wo7yYpQHjqjj1Sq0vHAhcBhz1BZ/iaD4kU0rgCc/xTV7a9inlpq7U
+rWhJM4z2G6wu0smsdXBKhxCHGOYNTxMs87ODYODmc+zVW6bUsEbA7xG985+pxdca
+x+//ABP/AOQldDT+KpZ6bBhvqP7gRkTmaTSrQoawZsP/ACH8wrnniYvP6Q2TBOeI
+A6kr2uR9Seelg9LTnZYpOlo2h4iFTAe8YN21Nw/3GNGjaqDLGDOtH+I/kzn2Xbzy
+ZlWLHAm5yzp06hrOAx5iHiC+X/cTljwx+IfcK1wOW9zMMBYCp6M1PSOQHGYfRerV
+LiA1FRosIb+Ix4ZzqQT8Tf4R2lIP5i+rHBhDkNkdQFzhm5My2TqsbT3h1ne0+rW1
+Ac8ziW7W9UzXa1T8HgzPXOunNemWwH3mt+D1/M5em1O/ho35v3OeOhhjB5GYPzZW
+8QHK3xxDhsxFLOYbzQB3Ci+cm8qGyw7gb9TsByZjJwWAx9zm3s1lm3Msmp1cFtua
+zk9e0yCc8DIiD+JU16hqHbBXjnqN1XrvDKQVbudZMcLdNBvTAWFgeDNmwE8e8w7Z
+lRgOc94PxCaalRd5579vqLnBaNUn+2sJTNp8xQ4/kRdm+5BYVYn2+Ji5ceoHg9Qj
+Jb4gXrVuQSrfImt+febRVCl369h8yDlVszn1H+Iyl4T0t+0+0VDBRBl8nMmKacEN
+856xCbhWODye4Kl9qjefx9TDkhuYB/N+psH3iobE2G5+TKjeprW5NvuOjEtGTTqw
+rcHqP5wM5nJ1F+dSXB6PEsHU1utWivJPPsPmcK3xK52O07R9Stfa11m72igE1IWm
+F1dwcFnYj8ztrstoWys+04ChSMGNaLVnTNsflDFJcd/TnGCPedIKHTI7nGo1FOwD
+zB/M6Gn1Squ5LA/1mcuuXbnv9iFGBmlDR7SmrVLlcZ9xGhoARmc7cdpNcpQ0KgKj
+c3AEesoShC7kACcbVa5d3qYKnsCYk1nqzkxbqN3pXqcy/UChLHY9QF3idNe4q4M4
+mt1r6pzzhfidueXn660va7W2M7HJJzCUau+g+hzj4g8SETow61PjfAFq4PyI/T4j
+VaOHGZ5jb9S1BDcHEmLr1m4Nggxio4Tueb0mstqYK5JX5ncqs31g57mcXTBfIzkT
+K2do5yp6ggTzNIFxufr/ANwi9pTLsPSP+wFlzOck/wCoeywXKRwCOoi7AHkQEi56
+mkPPMX3EmFLALt/3IDNZuOeoVXDqFbv2MTVszanJ4gHOQ2DxNq3vmDVt42k8+xmX
+yueIE1eo2VEKeTOZuzLvsLufgQeZqIsjI5gmXEJmVmUDE1+4c9yziV1Atd3WSISm
+y3TWhlJ/HzMr9Q1YDHa3EDsaLxmtHDEmtv8Ak9bovGNPfp9xcZA55ngDpSBmZDPU
+jKrEZ7wZjridOnPd5eg8a8fWy0pUdwHQE85qNQ9xLWHk+0CzY6g8knmanMjPXVt1
+ZGZAOZcsgjGRNMrxJgSsyZgXxK2jOZcnEB/SUpYAT2J1B6VAE4mku8uwA9GdtCqp
+uf8AgTNBE2hd7jj2+4O64sfr4grLWc5yYMvxIrfmspyDiS31LuA77gWP3LS3b31A
+/9mJATgEEwECACIFAlFp/+QCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJ
+EH+rEUJn5PoEtpIH/1xKaevV1VMnvroV0Oc8r1yk42SBrSGdu7ZL7myZEFLTthHe
+sRlP5aHcDl+bNiMlIukjTwzlfjPU+mOFnSbsaePMsElLyr2Rq7IJ/qAlWl+TqgiQ
+aCR2T+YhH2dj1RAnhp8hLQ1+rYq6R5BUXvOffB/eppYnepoK2nYVghpnA2xYpS4j
+CMT5oVeSczxKZYxUWORy4cXfM+e1CjiDjZJLho2SX18xi7lk0pzNIWoBr+dXstej
+1U/8yfkNkbLOZPgIudR0/ChuWPuQuTsHo/ovOv+SRADHwAAMGt/AhAf88NITyLjP
+D8v/Cy1Nswde2yhYdbWWGaHipJWmLsKP6fn+EDyJARwEEAECAAYFAlF6hPIACgkQ
+RYKxTiY2GI9mrggArPl4ruJdJ6+y6D8N0uR1DRG7Z1oA5xZiC724ooYSSft/AORH
+RMGrPgwxLH4Er6ywg3lmt39HIx2LBl9EXVbvgUyVWJxXCM7yf+3vjhk/cxq9jTgw
+ED2PvMB6xvJhRyLhFdSlzj9rE2pyPa2ty+o7NPQVszTjvMwKmAP3NaPv5BcvsZfW
+LM+fBPaU9pEf46IXfL0Yn9sDHGuIdvFLm+T4zAB45JL8nxeFCE9XVd6a0J7krnMo
+VhtJFjVUGRp0U/RoOR2HVe97kAK8bZ18ZtlcqxwXFcsL9+6EXfkKc8028hOMwmK6
+g5BzUTafEMotX1r4S0NSxLtFR9vKwpkOsv+8+ohGBBARAgAGBQJRlda1AAoJEKyF
+k2KwQTv6Fg4An3/EMOskl2vc8LRetlV9RLLOq24qAJ9nkLmR0V2TQUDWGaL75Fg7
+o7sJ84hGBBARAgAGBQJRlmARAAoJEEOPdw7I+lJYKOgAnA/ETjvW76myGGy4Ae71
+QsNWi5K+AJ440ObKFecn+122mWJ7iCtimWHhOIkEHAQSAQIABgUCUZXVpwAKCRC9
+ApQkIfSIn4+PH/9HxYN6LDzP9D3Q9xPmZqoxFt9LHXqjfy3uj12AkBnoJGRniXyK
+y3go1kT1wRD7i4R1PiDZ0mAvLU+5go1BKMnIqxs3vBCNuTTKC+fYIg9zqTw8n8Qu
+tLGj50GXET96RjStY0oux2gxRH4eWlTMp1/m2UDlv33K+wi2PGupGlocd31bi8mO
+0j0/gfBEs0Qjvo5rmzcXv+N482Ys5zTRpzyMODhgiLN2F0cthVBMcCcWmgAmFst1
+ayoVsaB64o+yKNyabpwJT8SeygIc/dX+higkP5F9IFVeO98txZG1d6K+/FL7mPs6
+ttaHNaVuG1hxZo+skV4Jz+ZP/oCjDS0k8JA9YELdYL+15FBbRT3PhY7LUaMH+6r9
+UIhF+rxzZc9vyiXZYb7Lzwy2bmk3XtCu1vTgztD55Agpcd/RKCVetx/Nz8gvIS1a
+re8Eqzx5mzJw1XxROotyEmRO0iIprIhqXs8mV1CZCZdYhpKXSXg7afS2+KkpS1YZ
+wlmyc/lW2xWlAzGTwDAp76lJ9rAvRSD6xsUTBhCBZQjVfdAVsLcSYcH7KXVjYRvQ
+8LQFjI3G3EhV52HqQ0H5i/OT4lqqiaeMxt8OjFjQxO0Ta9/Ukxh1AmmkXVa7SiyV
+qJddl+gfMnuR15mzLB781j9XvYOfDQ26yjau7S0p2nrqkEYQYVDAFMgJUOUQ2kVI
+FTYMHIjOSGWKx6wlgt+AHaAdElJKr5j6ycGDojMG9Q1LvJC9SWF3vQaEK49Ggetn
+SKmlSqQhr7dqr76UA4yQHH4/YD5KqQ4d6+Sf5FceGiTeco4JLFlTosgzgH+0pDW9
++zkBvv+Cp7MBoZoaxQ0bJU5MX4IZlQSpe5eNOx95yD3mm23xPMSkmabN44s9venq
+Nls62ktRSuBnFwhdVzb50/H2D3s9Zg2Ml6OtUYTkmKDrmn7hdp9CDi+zg2iHHGrb
+Lev1sPa/NOw9LWxHAzVfMEU2pxa3k5xQKV9qF2YKp2uFf/H705Zp3v73D/wYAeCX
+RHdw5PqblnubayTRvc6OcJoXRxsELgsbKpwyUQhw1XA0XGndoRwB5fOyLhplZyyZ
+OCdeA+5tbFW00XUPKBjUoFQSnoXKYL5QwFS0XWs0mbAayFMkYotjZuI2TyphgFbo
+rKHJ0FQcn+9jhkIsOTVK90GdPhDjQhA+lnEAFhoVZNg8iK5Xt40i0rzI5qT6mhws
+EZBRExL6pjL8XZsjCyN9q89Wb3xtqRa/kcAyAUZGLIhQ7k+UtNjoTzg78yhxfFIm
+PIAuBHogw0SDNJoqVtdUlmxTPtJFnZBmzDeTfz90HuM7EDqMe3CY4E5EE/ZVnHV0
+xxEA3O5lKWdEVOHSnkuQnFStPh4zkk+FDhSqiQEcBBABAgAGBQJRwcjtAAoJEBQ8
+n0HY8FbdjDEH/iUpY23ERRZoBSHTu76wjsqKbRlx3E5+G9a4V+tef1DOuLLQyY4I
+KxZwVfv2Pk07O7NcjNvwm1ObrbOLZISUTlWoSbkIMw8Udc+Gnpt6tjROuljcWGa1
+wbekkGhx6kOdhhXOiA8JRURDBzW7du2ZaMTabdjjkLLYNFzlIvUqoR3cjhib0mux
+nH1tU8sg6Rtl2QQDjt2Mi1NbXpdmg4sJ4BhAlCndlRE4Z2L6ga4Z0BcrrSv5hoEJ
+BMwilQBrmJsHaKrWydtHl6Vhl8wRr2J026UVIlaQS08lYiATtJj82HVc864kRJh6
+5iJznPZqLYwXENKWEtMRLDJlkqWLqoF0QP2JBBwEEAEIAAYFAlHwdocACgkQsRee
+tzR9wQ3ENB/+JjAN8JKbSWHbe+q3fxTHVs3aILPb3ETKYGy7t0nzFyKEv1JXBB3N
+nEUA7vrcjKeJeeLecJvwsdv9keY4BRO7T5OSYN3zzL2imEnuDxqTX0QooTmD8gc+
+jCNF1bFyQew0/XTF5MNUqVFGM+pfmkRAoAPY+q0hrpAtdIgaLg0mTyoUiSe3IgQr
+Cs4mq+HdyG/+rb7/GTAjEQTozAowThDoKITYl3fvDUdhPrDwIZrUB6ruvmm+bPbb
+URuetUisMcBk2c3hzTCZItZgJxmlLQbw+T3DmtFHUMWPVTzlYgPc8QV/OIUm6Z4v
+ZzI+0MqmYnICiWgnm/8rJkMfKFZQ112HlI8etB1eAZhcoWbvd15SKBdrEcBpovni
+RZVal/T4dtoyVjlG120qHfKbDIZuzh+/vWI27drqS4Kibd+i6lt4HYXoUFRAxMRv
+Ts3OnZhOejBPaREdeL6oENqRLINswd9E2A8GM1w2aZFu8jqJ/XyLYyi7p7yXYCIK
+dBaAx3YPPfBwx9g1jrzwJ46LZ5xT2OyAFd1nEueVXYnKqIALr8GVldo4XwcIkW8I
+gnto7mwM1sijh2Kn7X/r00ZJiUtCpm7KB4EbnGfUx31GReS+SYvUygk+7IacAKAL
+mKq5AVh5qSn2baBzpdG9tcPnmbr33gOeBX1m2q971QBte6XjddR9WJVUm+e96mgf
+OlsdP4VTyr+8jByW6JqVPk8iGuz0UwefcOKAEC9/uv2h5DI/9KHXoNpEVK2cxK1r
+Ec2G2JQkSBoKTVvL8bk68lrBQosndKlw49SI4O0zKE8OPRU6CBg5F6gR/C22ltmD
+Cf/ZR+PFpm2xR4CnsqQ4TT3Sw4ITlbW9W4fouDJVzCvg7hTXrSMz8tsVoWPjyjn4
+KRmw6MVXLzCiC9SijxMba3MU3PgO+4X2ARaTTrfr+c+yY6Hp+IN588rKDRh6dAWT
+42zhETnc7wuf4V73B2VV/cpS3ARAma8JkcCaPTpbKxD3DUxAhpX3/aU4MZAzvb1+
+87e1c+A6kLJkIOFARSzHI5FMZ7yvcJz4koo7LDswhfaVYp7MC/9O9L9zM64R6Fpi
+JrHMRZKK4z52Dup5Xid/jqyoYZEycTx8oF8tf5tNNAD7dmhOODo3+MvOGPfH8hM0
+QqUaIlK9wXvBQJ5cOdrpJlZsTSUEjx5tkT8so5sKUTy2clP09zAThY251f4VDEBn
+q0pw5U8JSiQ5YzjdJ66jwWLt30+Ic3TGuFdcDHadOCqKle/3FvaFghiWWvRFSb1u
+tDH0EQ/LDnAgPuQtrMiqW99BC0WwBydYGHXnsnN4dsQhN1FgWBJnzEzerahkEk9L
+dkHA3Oy2nP/YvcMZirbiNfoUsh7xcKYbhYkCHAQQAQIABgUCUjJIiAAKCRDhZvoR
+VxE5FuD+D/9GTNPO0XAuutrAGcMcTaExHeiwtBpKR7SK6fpp4AnDeD8HdVN+1wrX
+y2APYLFaz1ebvg0Ffx68xRAvidEToeGJGh22t9Mwtku4i9jLZw3ogQegGAO/13sz
+T9c/WZ2U8e8RBaEKC2yAq4Prxr8S9FIshAaPY0tx4w46YZkFoJUgh3CQ+YZEzX+C
+hNHPEc1byPiGOI7SGiQVghOzb/M1wUoKXzbdaegw5/qMZvfR62Dav4R90GjFE5aN
+SMnGc7TpmyeWSlVeRVSlwh0bXf1a3X34zpYu+3sJziCCYEYC0DWKWNa4VCSgYLCj
+HVGGK5OmHwXvKTyAERJoSpLVSscpwLg/AP7NfM20754L+wujcFlwaXCg2cq0gJlN
+lKw77q2/SgTQOvNuTYa/sTOJmnoXUGPC6K8gSrso77HMFzYrY/3TU4usWhVbYpz9
+GVkFRwwLeyeDNDYrfWN4/81Mq2QqIAL98rIvNS3a4koqEG/t5q1pB4Cucn+Q25Yd
+YvEQptq3JhC9inZCGUIYiwciORiZirCnO6LxayUhNDOY+GLwld9pAn0nJ+0GLIJ9
+6P8BrYSHqG/p5upI7iLJ56HsXMJzr/xxO0AzA/E/31T0TTxpxDj4a66j0N0cjPZi
+oGrS5lqyfJHo8RNyzMbF9oN5oQG7EJn61qQunm6PorduBf/6QYo2fIkCHAQTAQIA
+BgUCUlnWXwAKCRC75MzE8i85tYpKD/47NWRJr8egw6nS8FXBGx1So7RdiadweNMl
+TRurtT5gx3bLDAocjzS8kqZ58LQ1t8RM2lTNx0w1ZFPXjperANwF7aBM4Pou1gAI
++S9mUPvPEGiMCnJS5v5xz/zfuwpBYOxhKK3LyNqB1XIWYJJwK2B8cLcvbhX7kk7t
+jJdHGr3GoC/+9IOgQGDxd1UTYoIzw07TEmEr4lX+ymQPbUk05MEG7sEFG+563HhC
+gVaHyy9w2lGm1S6VrBU8R/FyY1lMKNzYoYRhBCQZlDMDfok8kUa0eV/wiQ/zB4BM
+gnQvMHMWtPP1aH1P0e+Xm7cy9zvQ2XrqOBTU+KVEbiiyDIcdwHa/2jKjoMWezdPy
+bc0aCRJuw3d0pvPAcnl/i9/1DdI5MtLC4krmOOYTBhPDG1G5hky6SvdCGq2urdRZ
+yi+rEQobkrNQZIsg7UnJU2YUEj9PurN1+rN+SdQ77ijpNpHSR00l03CNooNAycE6
+jLo6uKKijHvTzwlM9CW14rnwNR4WARHlnSFabqhj1Av9ODIKuLcy33+g/BUxAHtc
+wHruFLc1pT3SNqoRUQ6SNrl9kl8dkxWL1lOfturSxUYSJSRlDy8IJG8PCIdMuomm
+IwoE/kZ3eZo9wW+KHEOUVXRVhwA9y1TU47Edt+vgq5xmI3P6ALTqMkatyUmr1Vag
+xWZF2GdWxYkBHAQQAQIABgUCUlomiAAKCRAbtdbjq5Z9qLusB/0aj5qhhfqFA3+0
+WunBGYs+2zPAGuVNHPJyCey6pn18uOt1I7DSoZQocpwrLN+OofuTCe7+iY6porsf
+UUtbNtGLABvU/KGZYVJTmsVhWi+w8pDsKwU2iO5iVfVKDo2llnDDW4B66MGCAQ4z
+m2Y0dMTG6Hll0xqWvop8ITktzhgmlYcKM+dCDty8/do8ilQmd7JEpwTnrR8AgUes
+0XVGngtZ8eu4qFpMB3CAqmj1uvkTdPA36G6t8h2Yd8pgAbBlH28HvP+Kq5zEt5P6
+2DtORhxilpipWGIN3FbzCpXeJUYbRjg7DDW54vtzCHf2vGfxnkdsPPjfg/75gQNw
+om7vLpApiQGcBBMBAgCGAhsDAh4BAheABQkIbiygBQsHCQgDBRUICgkLBRYDAgEA
+BQJSYjZvXhSAAAAAABUAQGJsb2NraGFzaEBiaXRjb2luLm9yZzAwMDAwMDAwMDAw
+MDAwMDAxMWQ5ZjY5MzFlNjVmODE0YzZmM2IyMjE3MzZiMGM0NWYyNWUwMzY1YTNk
+MTU2ZmEACgkQf6sRQmfk+gSHEQf8DKna4yJHGd7sBl6viR7xlg/r+w5axp/Mvc/v
+cueybibEGKTiJqLEFdU7bYiMDu6D2pOnCLwEBspVK+1qz+ivzKO84W3xJ42C9s3I
+Ja3QG5FvIrYHWfwXD8VrtAWtiIx3C8cPsUzvT4QdO4+6ib7oHIzBuncSYb17JbNU
+X/6V+2MFHpYwwQF2JXcd5ZjI1dMpuPgthvwJSrk9kHTAHGI+IHPfMV2V9tVXkkWh
+8yUi2hIXzd8mhWA4wW4FrLp0hhhHr7HnqIjsuhMUbRm929Ko6lZEW7UXbrx3WftC
+MliCa2aLDMFOQKvnikJAne19fe3TRfvo6GEjPSrgH2WkcIXBRIkBIgQSAQoADAUC
+UoOzLAWDB4YfgAAKCRAc3a2gtETN2hLICACweYffJ8n6SIhF9p+H6Chp50KPM/7P
+m1lNQTJ2Hh0BqWuHoo5mIlfHd4Qx6SO+Qnc7OWVagiap8kyMW/Ij1gjLecuyeKYt
+ZmgKdhIH+AtGdzehfrIy37M8iMDg3GKSPJHWj83LYWf7IKXm9bFQf7y64Nis60uk
+qYVu1o4EqbQZ9yIzFUwiOIBxGOjJU7YQ48bp+avrQoDiKp3WM4ADTYFTLMvRopOa
+CLohwynraSSB5BuKkRTaPCXBwjLy8HTYPIOWqChzq35ihZ4s+7SFtPXrXfIe6NV2
+V+sVzDM4zLvzmrf19URntx0Dj3Alh+YoYMDzPjMyjCp5VSUPyoj2qDKMiQEcBBMB
+AgAGBQJSnOdEAAoJEEpo3M1UcFmmnL8IAMYcqnuFdkrwThQEXcf4GUd2+kDak88v
+6ir6JJ+2p+P5OldySTiQu+ks71fE8gT21DBxKfp/XN6apHfil+mgFYtiNpHJBF/T
+/KrcJpzNSBcSi5/ZXlwqb0Je3nD/ePA3djGwc9IRWYxU6wXd7qKm9xM7kaVmjkyy
+UH8Vg+cc6LpzMyOifSKrU3v6igdb9JJKNxXClZPaeo2ec6yG2tmiXhNrB1CK7jUY
+vLd4qhEgnRTLy/ClW6A6ybt7ji9mXRZ30O8FP1WhX4CPK0kFb60haSzTf/2BJyTR
+rGtdPThvDxONqmZHQDoelT1EGicepFoSwHqjV3eAgB63sv+YQHBGKeSJARwEEwEC
+AAYFAlKdRaIACgkQhiRh5NQaDzX8rAgAxBn12/dEDe4p7mbcAFAhzHlHf7PecsbV
+JBXw1njKY359i8/Q4RSnex4NiEJMba2E+uU5qzdPBUMiKjgAMzKcDSFUkewBXwn1
+dVuhTjvQVgCtZY+ds/CejGLog7x8cd5a21TTKjkmg4oeLCMO4FQ/+B5+FW855uTU
+fepMo0k17HYEEN0vtqUwDcERnjE89OApjCFmOXNlKdALRaOyAgvy6af4VSrRllxB
+jCbwatWs86YCkEzQHOMsthpHIWBQO5BsPfMfX0OmK44tNY9nfrlh4NRB+9mXMxUK
+hlyCmywuFE1vXObMmZovaB0vRHGmMeJr1YXfU/RVrugEuNUDxh4KGokBHAQTAQIA
+BgUCUp+OzwAKCRDJELNVjYFl01WAB/sGW1sQFUYMvmnXVnI8UDRbEA/3HbcHMbnW
+sABw286nuoBXdfhAY2ZPA7sXeUlxg2cG7e2cZP9wCG51KOKj9ryi+RpjKUka1q0i
+7aClOB5UuMl8kQ8hkumsPEBMX2CoidNtbTWE1QbkczX30aXgFqG99ohl9uiY11m+
+inZyUjFEk3aWHuINPW3eUmhm+hXpKs7XW6uHZHub7FiIVW/oZMcmIJ5mNxjIfW74
+lTZx0BUzgWEU5Mop24mLsjDqAl6H3wX71bm3NOba6iG1vYXqzYSYxIa9tmo6beYF
+uJsQfnr6nUIskliYk94+jFRoMUpsmPpAzrF+vdAXEkZCiZQ1u/qRiQEcBBMBCgAG
+BQJSnOviAAoJEOYsVDm4qbdN5mMH/jcmlhTmrARVSB59S1f1A67AG0YE4kSPXWh7
+MK5s6F3KEnGd8ZXu9H++iV9Onb8atMw3vaiy7Mon6cYVwJZdEhPtsowKe9CPKFTb
+kWCvMw23t33zSb3Al8MWdZQTB8RUYInwLHEFGJjq3Av6mC2200NQeCRBfnaQ3r9a
+9iP0H9QNSzmH/qW6eWbjmeLsIPcC0hjmxfQgR54Ez1k8yltpWXCKtjPYLr+QVLvH
+Vo57v1oMIfX7aRFgKDFSpHM0o4bcAqajV2DSJ/dHOM+OSLG44U4t2xO0Qv5HPEhz
+woifAJlqQ602CKdPVAhHOf1GXGG4vaTFrbsnFHRfacklLzgZt8uJBBwEEAECAAYF
+AlKfiQgACgkQZH81l4mqPJoiYB//TkRbdrEKfcmhYRqd2De8tomiri1ZatHcap7Q
+It7ZYL6ao1omyO7XmaP0+IASVtQyFBEE5oaNUQQvDf35FVyiOVc6rVoNHfAx0uFp
+8bZL+YD6PAaqkWi5WNJqPmTdX48hIHHtVFt0FRf/RRPlS1L/JtGU5pusLtDugzdt
+GjhBDsoa0ZkujoWFlLZ7xa1ClQjBjKRkFz5ewnRtHUIG9yQ3Y7DnSLS7zoeB6YOq
+QPeJXBIdVhSITkKnjIKgB4zRMXF2+4OJOBxSXBfimL8lylmONaC7K2nBuZnagMxX
+Vf5t0qSt+ZkSLCM0xQIxvMKbkatDTvr2Xoz4nxI3VJXoEZsLfd52i1tCkRiogopI
+xFnFXazRLeqtEbE38cDCw8D6WQwYSnjZQFMM43+zu1w35Z7h2BSTj/E9kjM4WmbK
+frPoxYdYEb94/rTWg/fGykCiZ5YCmdBgdxs9Ys5OdOixO3guRt9cTEywJBm0uQOn
+grCBKslw0NsIg5eDdpcdZuQgXaqylOF2XR8lCd7wawHgZvGu2lZTDnzUb8G1xxgY
+hnr0mYejZFoWvKDmN4mNnOb+A5w7RokoOskkm36X1Q4D2advCO363EOamp3fIjfT
+ueLjfRTwIqwTq4lLmNwPYbZaEsDvmeOuqjRVbPAIOWxnHTclWPbSakJmqhdUco+h
+bQdYWP0mUBE7GIW6LF0Lb0jbkXoW26lyAT6CEF/WuIkdBDxEkg5xFcaYNCwi8cwe
+uVajcsuzZ4eIXg8yMYgfgan2MEe9TT3knlIbEeq4lA5z9LgDs1ClBmP4erskJPzR
+GlimHHjKO52oZlHdcJidxZLRzPz+FPgWhSJ2CxpoauefSEqklrJ92545Z2jUHs9n
+IuAXIze6VnI3h7DKZ6ysoYoe4CFf8EH8wkYJVaDzJ2FFB+9EmEY45nMfPSzo9erl
+bG6P78gL1ofGcOM7wLdzCkX/19PCMRBp3iS24nX467Itk1i+7vwQvheZnIjMP8FY
+7iKc0jpDgbS7mPGPbQyQPzcpA88WuJzH0FOCwSBGRZaQbrt0QXzbNwBDNqSXBkzt
+HML3A5yd3fv3LrxFSAusMmV17wQLoBCa5lvGIyDZvzY03o72Ar8jW3ImOW9SAxcb
+cspFGH1Ao8IklAhIoGsRKnpO6rZ540hS5dnJt1JsDhL7yuME7eGdmlA3wvr6j1ij
+vXe8R6bnYooiI49FNOt1Gj0FnHZtMwDjN6WZdyiXn1sS+ma2uLn15FCD8UQLcEr1
++OQRUZNGWIf9rxOfEDgDrA9xRrkqmQiiObkuz2eHRoKzcYeGq9Y4kisvm/BvODjZ
+aA+mI2SAOwaTbl4uONZzEqvioJX0ZQZkaTrBh/ysuIFOmx6huokBHAQQAQIABgUC
+UvmRRwAKCRB60KkcQL0AkRSfB/9uaO32B/1eBpuGibT0Td8wDnXlWgmftZLY1SDd
+dRqe5fgSfM0mlRpyM604BvEBtImtv8Np2YTgkWUHYzLLOpyhCCYrF3oG+AjJg70G
+4HeYajvr6Z2diEesX0//kcdVcKAangFxFBKXe7rUaRL4+/bHvf5uUt8v+YXRb4oQ
+RTuAyFNCDUHUgAzLVQPRtp6QbFcrbpXZ7q4hYhyTRil6MXcUUygsFNP68lWYKW6M
+1ObhJ2U7sWhyNPNdCS1nlhlYfnF/l31Q8F96g6Phv8fnTRFC0yE2Kivit8Q8upbR
+nfZLxx4IoOmfy5NUXs2bR2XefYqz+7V7eZBAJQGcdeDaD+NPiQEcBBIBAgAGBQJS
++eZ0AAoJEJCcHhtImta8nWgIAL0lz2iKFHEKweJwpCPW79HnDI4j/r056JSmyTTp
+GfMCwIku11eeK8HpwduQBtg8U+aB/XAJR62b9KNXHy2DOrPNcGl84gn+UmZrSNn1
+Gp198vbk+EitUjvItVwPbL0a8mEdAgW1KoGvCt+PATdAgcKKivx31gzfmjax0beT
+fwLg/7YQLgP6e3Dwr4DSM48SdW0gMp5iWDlSKYLvrbuKdbeFTzSHvhKviS/TPP3w
+E+OVwOSSuGPiNSBz3cL7XmVlQycM0reIajZmfVd8+572smHUjChLc5Xr9Bdvs8HF
+qIzsd+5rPy0RPKHxKdxqmvIzkwm7yYRp2rJt6TVao196axOJARwEEAECAAYFAlL6
+//EACgkQvA3oU8J+bjOdyggAxKMM27x1g43zKHo5LYPRPiRyB2NVFuovTgpNEMpS
+50dcRK6DzOYVRDvS+V84KJrEwPpQoVgQCQ8C5p1HBtXQUo2J+p/oI1qG+LfXHcRh
+RBnY03OEUDJA0l5h1xaGGORee2x2mVBZTMaXDZ6rvxj6gisuKj3mtnM61V3Dbuws
+hckYjbQ7z4TOuC/UmPTBB7B1y5k0J4uDj36W/hrEjQVLhVnMtOdCq34kN1CWz6rY
+aqskcAAeeBCahkb1GeJ6MuyX483tblCskVnsRENFrS79W78DLq7dDPiB+hK1nfgF
+F8RYllsWP/NOFJAsS1qcffeJN2IH9oQZLZVxykWY8PNxgokBHAQQAQIABgUCUvuE
+aAAKCRBqTOg3Wi/nvzR9CACkCquU0nF2oasT0FQITXBRrYYAr2ndj0NjP6sBIfnR
+BH/P16z2tFz5jM0a5sXsteSGODiE7UFcvh7s9jAsIJMUN38PhiNuJahJKY7PNTFz
+xzoCmcEzwHr6JADnhrxc01mIR9VHUMkTC0NmD9IMzJs6UgsgcjiJFu1Gy8iXuEVg
+M/0qYNWv822WGEtOqz4W3BVT9sQxeXw5NEGIUbvUCSlt1GXQXCD8u8amw/v+wRdX
+LEi1l5T8KxwpJObIe5n7fK7rhc3OCOlj/epVgrdvyIuRLhxqOeAdm2HxCiNHXO53
+a0W4AuQfn7H8TL2alJrjyEl2kvp2m4BYQ9v0U68J2nhviQEcBBABCgAGBQJS/V/+
+AAoJEP+1OXaSdZWLojAIAJ5da9Kiz9YVrnqQ2m8EsK+87jKNV6XYh4ll/mM4Yrlg
+tEY7aoNl0l4KrWuqL0JGKaQYD8c7DyvorFMLO7MCk7FMwUVqQu1ZNCCYTWf2W0G/
+ToUeNcJbye7rILbor4WTkAobUj2h36/+/2uW6JeupgYSp7imujpv6w5Ws7j2AM1S
+i225S3MisQlFMvvF0V4q2QMeac+pTEyC53PLkqkawPr8wH4051FOio08RMySi9oj
+3Swz/iHExDAFYVratbOiN/wVZp19I1WeKHv9JhfU+veVmZTxfpaIGDIyQOTK3fGE
+1sZ5m30WIRsxV0feZXh/Z7E2F/PTGBWj7N4W1w/vD0iIRgQQEQIABgUCUxjpbgAK
+CRB3N2Fke1NkFfA0AJ4poWqAKtU+O/gsJNK/OsfXAf8L1ACfaOGLqmpmhsyeOwhx
+haVD8ecdDeqJAhwEEAEKAAYFAlKfiWAACgkQpEw906VI2OLnIw//aTG5xCcpHq+n
+CsnlbHsxSj+1EdRna3knbUM000Qy/Rz7eclxmalBeO6wnZnD2w/li1qRa5XpUuyV
++5eJWCd6o7UTFbk/jI8pci3srx4CAwwewYDTGjziV0JUpciTrsUAQ3eaJAbKdQ43
+15Z4s8VL1xOoobG6jj2Kawlh+lVB22YixYS/689tSMpD7WNvUZ5xsp4WhXP1z8cP
+37p8eP9O1CFBtgHo0fNe/esfCnOofxUjwKbTVz/bgkAHtOa7r8w+2oGDRD6N0osz
+8PccGr8Z/UGz1q13b2TF0RT25WFNXV9oDaGJFcpLeAdpwhLerbXce8NnabTMculh
+jj1iqXgcDpHBR+/h75smWAf4m3HvGoAfdVLEEwVGMGnPVu3pj+qD5FhIslC5Ubn8
+B/r0RhOPqMO9ig6xFX731hOy68P6eGFDQ/cc7bgLZ/vmh2xfza6TSBsAtWbyTNrZ
+PCX0Dh3vFnXt+WUEst9ZpG+JpK4tkKbHu7MiSY7qh68pV2gHE6QvLCiaMpR7EJUf
+B21GEirnz0Ov9pKUI7xaB+nI7SmY+ZsuMQ6f6GGHWeF2iYNezTDJ/ZrIhsNdbdf8
+1Ce1kPC5dI82Nl5eH7bHXRFNf2o7A4idSk6mYXkK7GQ7BltZeJc16YWYXywj7Q6R
+liWArjg8Xzq70BHp5pcvcuKQg1gyJWqJAhwEEAEIAAYFAlMt3FQACgkQYLQxcdi6
+X0GnPA/+JFykUYbU/FPlYomyR1xPPzKRiKhd+98G37NsvUtw/pHfyTsQuom53r9m
+/lqtvanTJOgXMlGlcz9HcXJyY9gsoGJdkQ+XXyKfD80opUxzX1xmya/cT03AI2pl
+4VKCWafPwtTg8H9stdRAfAiw1VWZqoLcVDiTX4eorN3H822BfDtgl/WoucfVMpFf
+YG8MWdR5K2fKphPMVPoWyDu41iKKU7A6MRS+b4kKI1/8PYkIDoPVYMxKNDwKAbIz
+8B+xC72CiJxS1sjxuUkuw+PXrPYXgDzH2kaAFjF++E6er07GkCqIlRRzvdSrz4Xl
+Ma2KdrIKMj+EwIVnyKlLAch5BIa6I9fYx6jrCiqjNln6yjyMBMxJVfYQXEAirnp6
+Cm+YSafRdm2nFtptLmfhbfm6jz+EWW37x8f99LIdCLKBMaNvwFo9zU9sPqm/oTtZ
+6EiWjWmN2LTraVUAr2Ehj0Tdc6VttPV6qWVd2EpKffOJLNgKpju9BmU3VxnwB4Gu
+jsEuttUya1Z5fQAnvsCOVWP9Z9t/XSuJdkYKw7jGwUBR1aKzrHusC8q+Jce+EOoO
+Wlr3K4ZYLudgJpqCkJ+HNvCwL7kMse9d+BWtGef94ZNaNI5cCAqmIQ6f3fcGiavr
+Ar66RKTwkVJfCiKX4swXTNqrQd02A0XNsfKA5LuBXqK3dneTXEGJARwEEAECAAYF
+AlM82q4ACgkQ9iJIebaVCyK8rwf/VLZMQu7MHmmIAggoA2///mEuHPhsMR6Fxg41
+nhYNQZCZhi0wRxpiCpkLGJuEH9E2ex/jWPV5OR0GFhnINXs2co7kFqLZqY5zl1Oa
+CxgYWd/LvLQn4CmQzls+vrEfPlzs3cwzrvXr7R6/kz4ksTUfbF5Rb/wtNEugMywi
+bxm54CJZurj8p9a7oTnSqjRrXctsrtKCt38eKwMXEnKkekzaSDGpyS0nJBNSlRpf
+i1KGXaytFLS83g76TivWz68jui35X0hs4DCc0rjMPcWiZApvC5sSf3CyLMkZy6QJ
+IggKSBOcSOwHiaTdppt9GH4Xt/zXssB/l9tN521Ou8mfr+Ar74kBmQQTAQIAgwIb
+AwIeAQIXgAUJCG4soF4UgAAAAAAVAEBibG9ja2hhc2hAYml0Y29pbi5vcmcwMDAw
+MDAwMDAwMDAwMDAwMTFkOWY2OTMxZTY1ZjgxNGM2ZjNiMjIxNzM2YjBjNDVmMjVl
+MDM2NWEzZDE1NmZhBQJTPx1MBQsJCAcDBRUICgkLAhYAAAoJEH+rEUJn5PoEyDcH
+/2aGFPz7RFwmeUCcwUScDpXGBqUTLD/PeyQlQdR5k1JuoP4ufBAiveMGIqlUn4wq
++Pj6grGsRppykMoSrTwHIeB72ONQNCdETPg/ojJ7AXZvwZmd9JM7SUaHn1ttjVk7
+7b2PPosORucNjOGY5I6R2TmG8mYXlzSgeJ+G70FJJfo5PWa00TpVH7JW/mPUia4b
+1XdOZEnrWuY7ZfzM4WvKP3Vzjy4DIb6Oqqz/lLvC5IFlhDGCZa1mqx3dU53JQiho
+ptM4XdEUP8B0qiPGgf4ajVz614olqF8CLRYgvMkRTfy9g6/kOPR9Wpn37yWB1h23
+NzAvjGKlPeFpT75/dumL0eyJAZwEEAECAAYFAlM/F5YACgkQIuNMkI8Cy6KoVwwA
+gHNcnlSE1QaYbi0RXVH9ZBMLMOHN/YHpMKvkDnX4KGwNzITqSQ23t7QLwEpENdLn
+b35g+7tYkfSptq/RHi37a/alT0l/u9sqZzyS/ycfTUgdpbJMJtVjf62wrSpw7HBp
+9rDnxTiQ1u9XXV9Z0MELX/d3RbwTL5VIY2u54oyUyNRxpsCu42RZGkvRmaygBja+
+Mb7RIWZZCU+c3xopSdzddU50Vi2cqmNCZSe48+k2IEunJgsZoQOAbhzJWO8p83/o
+tTTyfsXoVxYhwiifpVZnAM5URZYN9PnaDPzJhTyWiq9eVxHZEOrXZnLuXpxJNzG+
+ZQkAOIoeBsaiLwgmZdGl1VdRoqjM/g4lGeTDglRZMMa41oLjFrbUn9+INCDn470e
+L3t1hz0cCZhiDWuptI+VD8oulsnMXuYRzldji2E7j+AubZHioXJAHSLdKz0g6mze
+jNMLgnykjpmxdyea9NbFyfJPLVmr2BAJsHK3M91Ov1veimqRJJ8xnvAg6mZdH4gM
+iQIcBBABAgAGBQJTPybMAAoJEIJpXKCOp5VTxnIP/izRh3IS6mAF4Zb9opLqtkJd
+2xURUeUWaAQljpiIf0SujxgiTvOHYG27hSd2Z+yKqL/0EkowXMz7RiHubcww1cps
+2ym/Wnoa25npSn1JFe9m1TvOolAnPlNwRZqzvJ+R/8U6hDryEruLK9pFmULaql4Z
+iK2/JjtKDkWF7msKA1GiY1x5UI/JfoNtKxp2PoxgqpcmzjYqWZJwBQ8NViEa4cqb
+T83WmCFD3RrwTgr9NGEcJw17oC8o8Yb25D5aJdwXhRNu5k5msY/RG0xRZYVNn2tE
+VkDdEXpZywYSImpoZQ2svbru5kxnW+5E5Ix8yB4zXW0ZdqPbiAdfUdmL1E9myBe/
+0ngUmihmBlOfW3mEAvaBiSpSlPXW2ajINF/qy/kYd6uJWYRa4sFMyxy22YVvWJZ1
+8MkPzJmR1t8hAeNsGFVK8i19V5iEb0zJi8lrPR9JC3654g8/KxR7LwndPdfezUuu
+dVTrhLotNb1KP5quE993JsafV+4VADbk3xm0HYOGLUod9HVMjoVrNxLvUfwi5CHL
+ZQjCo4NmZwFZDNTBzORy8KpRru33BhHj/89Ump3RkH1yi14i4w79yoQHVBN0vwrd
+mbYPsvS41aEi6Uz4VlkPkXHrSbXs09h+LVrHgsOOj2FdRW88v0q+o/B9NFjod8Cz
+AH51Kuco2/Ad69cJi4PliQIcBBABCAAGBQJTInByAAoJEMIYUlgZ94RRZo0P/2l9
+cPoxIY9Pt4FuB3r6ECTHHPHbqoMAwjD6IrUJhB+tUAohXjHp6/BK9blTpUNZg2fm
+6L09vu6bLe7VvcQ7qemDqQViWf7hzDVcfKtNTzP7p6bH4ESBB78+SM9rmA8U9tyk
+yveTJZjMUs2bqgpVZG76Bqcd3hmHAr90HSKXf9/T2LKEsS8SI81p5Ippss6WhQWk
+hhg+NtlIZWx5TVrPS7Ctm7hI1z4cuUV4Docm/C1oA3mB/NJwjhWGujlBow9Pj3JL
+l0mM4qVchKWRY5i5ske0NMx7m9dk6tJj9/5ZIUxo3j+CYup52NkMxMTHbKrISuJr
+cQMm4/+6YLfvFeBdBqBTwSK8w6zOIhQMW6p21PSl5QSDZ0G4Cq6QNdo8XUT8Hcbu
+zdv6E+z7zJN4MJIrtrTlWgVa1CfbwrQHZxSSfWWmO8HwWKxCquXmMkgIa9exR0zF
+WRo03/N75BReL3wJo6nOcO2WQkLA9SCsWCD5uBdouFDM7rHeTZLB7pFubIUe80Vz
+CqjAwgBqkypTT4AvNLJ3MufrYSWbXbcHZ8Xbd0ok7/vUPE/N4E/EIk6VdPBfHXk/
+qZnzX1l93CbDJ10S6v9vBkSG4RQHDNHcsw3rm0UVwc+WDtB2RCrPMOZLn+1Khtub
+EY/GF9PeTDz06aSvx/2/ZQNmc3+GX3w7rDndbpQHiQEcBBABCAAGBQJTg5KEAAoJ
+EO0aZQcAABARVX4H/A53WcaXu0qghdWgTNFhGJcDG8oYhHZ++uJdz3gtdOZM+u+3
+6+yOdeApr1zJe198Qevq8MkcRFCqw8lKtZxYqBLSz8AM8GgLsG15RPkVcJNPQYeX
+szXxSS6oJPs6qLpf/Ej7pQpxvbd+lXe3RXXGa3Hp9n3t3Y6GWmI3p/xFwHMkQZZM
+kCi7GLaUNimhoL6hb6OPOpPEr/yUXg0ZBI0zDRc1WlRf3cI+8oSoKdBNTKuzJHEt
+1C0l7NZ1jqjXaM7AW8WQaMzxQBQKUlLL3StDO9m2hHfao/yGhAIPjzMdF08OxUut
+s6hEFDieCOf/ZanAMLiF9r1YB6T+Bri2l9ufwX2JAhwEEAECAAYFAlOIrTMACgkQ
+vCNjVtBL3NZkJQ//fBzGgEKozYT9femgY1oS+sRu3LW/wBEMiEo9XnsllF9e4LYm
+bx4St4A62N3TWiib1qYoi3KP09QHpwCfXUKA+TkJnynHNPLSdjUxNIYoA71Uy5HR
+srqS2CXBYtnmXmsYkR9wCT/ny/EKkpPAFvJPwJBXEvPiuSzjlEN7tgu1ueaUBlDa
+iQzbC7JamOJP1kek9nZ0KQqPx67KOjEz0iOkADfmTIyMJGwA76OJKd/JQ2FEViEn
+JK9qKc+zEAo+k4MBdY/50UxxfePh5IG/m7N4AaNfwOIY1npDD4N0pppsRrn4wnP8
+bLkBt6EXikrruGd3NSorEe+V3SlT9GrrgCpK9WS0+GDt47ghc+Hk9/qu2gZVLGsF
+UJZOBMT9T6kh+NpaAVOK1ku9JAGPdAJGeDi0hOoBIm4IO/RdRxUDXfqW/BzqHMMF
+EvDRpHIUyW+fkj3ghWI+ckdStdqtyF28d1+WJjyYEbRyV4sE+qGSmIKTQWZoG1qG
+9N4nAu5LUTWB549NN48Z6AHqzu7OrVYj8/vVaun/9d5KlCVU0EF9hGi5AUf7AKIh
+Zr8K9LWDYiRgX4PAzqtUwEABoQ+6h4K5oq6jx4fJiGYsGmaIM9cmJC43giF69cKD
+IKuG6vSPCn7BYUwLsO4nYp5ba/oef4tRGOurKKkZQBVAtzvoEg0HHMHDcG+JARwE
+EAECAAYFAlOuoSkACgkQdFXF48DNzrldSgf/VSF7gcap5bbmcO2tiBrVd0D0+jym
+bYtd9bkAFjpzoKjVUZX32/Fap4/fl2jKDv4kpd1NadC9pfkgUCVHDVaZQi28gFqv
+HDNBVp8cz8QezHGELyQ0TOatgG1WvhQgaeHcbvy/Ra2f+MoxwGdJFcBPkUA9swy5
+2G853BEnOrxuno33R3nVVqloMbB4VRAJp15Ki6mYoqNqJrm4DLApekYlzPiKALOd
+5ax6qLZtluamsHuKN7bJWrzKylFljuWdGQzvcCijBQ8OFkXMsPksG0G2S83RD0Q4
+ezxVlQAyD3mMGwxl8qDLLxmmvHBd5LRkSBNYYeJ74782Ab/OITU0I5vlM4kBHAQQ
+AQIABgUCU7fZiAAKCRDdQPJYqs4B6ckdB/9sHGrbgrPD226xvMBqdgKONvRbMA88
+DUKATyqIQ7m8majSbR7jFZEkaBLMpCkgNP6l9o92ZKcQfMslD/EbKI0pCJw8eSgv
+22/+S2VMEQteDlKiUNzNcO/yJi+Z4ZpbgZytxuJW+y23v/u94pt4D9Izh6ifxQnj
+xu0JU36Vw2SakYsjE06mQkTGtvs+PIjc5LTk1eiW/FoAFbyN6WF8pirTG1tykL4o
+9/VR+t1/fqU5htUfkKEUxKy4EjextkbqjUMQuTHcg8ocyKfCU3sH++YUuzpq6Rk6
+fQaAHY+RFxxi4CqIDe22P0yZeYB7bUMSB5R+alHFVtZYeFxhtNg/hCnFiQEcBBAB
+AgAGBQJTuRT2AAoJEOrF6/B6qcKj2lYH/iMTs6dCcie+KiAOc/TFh1XT+lAlj9vL
+a7KPUjjNhtfB2YcnBZ+zhLkS4gBCRsIFwBygojFhO141V39rstfFC5TcImvnIsFZ
+EwQArYvlxIUiyG2VmF794fa/lH4hjCkVl/cspc7p43UT9+hVaLHlax/VVR6k126F
+PFfK1r7lQ73LATuuh9dEaP/4qJhPa7CtDpCFhJnMb5Ojk0jRCSTLDddIveYfTL3k
+aGNCpGUPP51uAs9C9TZ8+7k39jEaLcV0NMNS4jmo6ZwZqv+vqHW0LuXPqYXjBoKJ
+ZtRW+SxggnybDzCxF+xOnhewN0lkE6BnA7ByARQLEmJIj7S6Reoyff6JARwEEAEI
+AAYFAlO+/a4ACgkQQuhqKhH0jTbUiQf+Ib/kWc0hoeKy07BOWIHFZYRYIv02IQY4
++ov3MyufXZ3LGDWDkPPD7kaxAn0t0T+H9Zn42LTutgQvCaD0GPCBh1dnxeQZBnIP
+nDdrnoJCc8tA5EfXY2J+eFwdaNszmravIfPM6n0x23ZUnXEzHfK/bl8XrtpVZjqt
+sjUWU6D/mT/ZC2IJaoypVX26SzNWxT3HQ366XrMRW5k2daYZdSzUHsI2RjLSS4ku
+FeL6K31Kb/Bugm3DaJuyCkFzDEa4iqU7OIuam/TozuD6XNKPSLlP4g+QKG4B5lr/
+ipfYdIXkM7pYHUOPsjQ7jW8KU3J/vMxKEAC1ndg7FQyZIBnT39+79YkCHAQQAQIA
+BgUCU7rEfwAKCRCiDL6yAAxlFUVaD/9/94ob0xl1WCnrRwdjIF0319N3Jg4oVkXU
+3cugiIi1ZLM8wfApTCQwwO/U/y+XSbR7xaKbQw7lf8nMTqpYX5NkuKbViwugpIRR
+zAlvMSkrsCqzVfvTUpI6kbouMhPGP3xhIlaQuW3FSjJx7EeT7sJZkK0pk9QUeXwF
+Sihlqt40xHquUAn/YpQ2lQNgFdy3mFS216MW1Y6jPm04JdmHnNq5+5HBS0mnoMws
+rIyA/29jY8dNNrG4/r2jzL7AEB+o8SNojd0p3E8tI2FcBrgoKjWBl0Z1GALBHhb0
+xnl/FajBqEYOeLy+3K8w4AcMIbrrqaizAQldUyOJUJZSwukGT1n8bnE7hyd6nVdz
+avjRuXK7TUeqlipZ6ziU5wQXkkalre2MX9+AVhSZFTpP1iU+EjJgxSP1S0IoARLE
+ampj9xI7hJNINveUfOzIXf41BM7m3ygdBHu5WaRGVApDunMpGentCRAzt5h4dQ9w
+mpVY7hynytHEJ5WfHrQ6na58ExUzOredvsgJgkRwd2YXUe/mR1FunWJxRQKv5pFy
+TWwlavVpPQmgfJUQdk8QQXGwS8Aramxx38xTtv19ajpz14XzusqkyklkT2LsR8Mx
+5xIiDavnnoAeugda4CY6uRJnZBMBhik6aesXLJuy15fJcDDnyMwDkDj48/dY3BzB
+7V/OqxGe1okCHAQTAQIABgUCU7aY4wAKCRAW1ULEnWdR6ADLD/4oN4f3MMA7YkgQ
+M15xy8TgqfpKOCzppXuINkQefIl55F8bdsgaahg3LWBK6WF7zfqjNJfP6SxKz8AR
+CxUJXXoQ1QvxU9r8R6aVo8clA/hjfGg/tVOcLRnzqB4n3K0YENiuLP5hjwSMlYx+
+UmuU6vmq3vUtVZLcHToAecWqAEaAoluDgLj+Cktkaczzz7Grpd4dK1MAj/llHJbm
+fCN5x3muQ8woSQTCdzYoibKHnW7Gkge/An+NtI/EqVmLB571nKLRzngMwy4aimjT
+uA9252S3fsJpEOervIzUQwsqq03g6ZCAki0Q7fllXNKBMW8QLyJVn9xcMv5EYOa6
+pYmTedwT1iy6tZc7EYj5iHDfYP2GDvxW7vT6cCm2e2S1ld7/Dtdi4SgQ0+lmexoY
+2prA+dR//xJUqaiONFfXh5lTfb7fKfBtZgHmTwrPj8FRafqd6Uf5LBLxQZVb2aZX
+QY+nJgHdrf1pxozz/FSNdTtUI5EoNSOI47wWbR5IZfsYmc7yyrwQ/SFKnGiomGyL
+MC0cWskWf6B++ILhfj34NFW/SULvN2JXHNjkAtNAubnAZCeUV6ci+qnqLcAS7+2R
+rnbSMh3fvBaQpm9PbhtKZEQ2h0tLwSCMda3B7C8j96nVp0IFkvELMcNOvGKzEm3H
+kx/hedOqis9wuhr5np/zMll10rrW6IkEHAQQAQgABgUCU7lj7AAKCRCuzvVG7IsC
+YPBdH/0cOjwMmek5qwcPpPnoWfRp7xQjugxhei5SF7J7sW1BYSk4+qm4iTGrueZP
+XiAIGv/8rIWdTpoZDFFZPJkrmhPBV4bNbpanAYNnTsVc0N43jDbO/f4qyxDd82aO
+0ILXD394y3Ktblfz++/YgJhPWdrcU/samRdqFqkl/vBNjP033TpBjIOFo99Cpsds
+nwtL3w6sz9WfXempDc5MdMwXLN2DQLzmCOKaW7MAjRrTz5aTAN5TI06EdnWUGYa2
+OwU+PWOhDDiTFxPvyIG7kYhsPm4n9suNLX1pHxJ7eKpYQHcdgKU81ZKv2hyfr/5q
+xYBNKdcruOLdRrSNIQUcaCH96Hnsm/Ye3vS3QzD1XFyF9PBvkQRa0WJHDmljIvSz
+60qD1vekzPoX59iRA9rMFpDOOz7qd00YtXgr2Qanjs3sXNdFyJezj2Tc4PvbkcwB
+2ZtnWFU3LGiSwbklZou0bL0XiW/tbVLd30mPTnwHIolTsso71wy6ADv5dZ0qVzZn
+8+fSx1ACA3PoDFL6OUJF4WkwM7BGmRleVunYj8kxTEPmxq+EGhOo2pHTB4f5gP8v
+hQUDIy3k4pwKj1PWZY2mKU7Y4c3nR4UP6sBd6FMTUmzqMdxv49EFhmrWaZQg+qiJ
+xDDEY09doyUokfexrditazYE8afU653sJSY+3gf0UUoMTMxlOraJvACQNZ5QWgai
+0x8Jr3IPg7SqDPTEWWoDx7kB6IDIGJBfNytc/q/G0HwHG9EhSp0YtCKKdYlFyha6
+nhtHqpalvVBh1gf/ale8/dmbJpzZNTITsylzkIzMsnAu7WXhiMo6cu+2CaqGHbaz
+yGtkuo0kqz87fs3/5GktUHZlz3MCEV7wMCVJ/iOO8a5PY2uoiXJLsFDmXqU34sDv
+JqjsIcGhnq3Q58VbsDU7FJSB+e+xmOQhHBOPzdFKHLyPUcOTpqZlb1BVBPirigfX
+80O+AnDkdMDel/YYxurvBtMdw7W+z9V9RD+7ypKHBJfgmVpSPgwy9qXAeuXXbndN
+nualzz8EJDRtStC7WBIcsJ4ABMkfMaKRTX6C4sIjf3OqO5FMC72nQfVT0HDUaNOZ
+jxYCEdFHe8nbYdXn66/+QNr1Wub7nZBg7oVID+grUF70XDraER0PO5BEbYWbKsN2
+8L+GdlRHt6bhz20X6gBJWgU4m6uokTLY2AsxcgVcbCfrvYzSChQGrtzSsxDqixBp
+qpxXJzs/ZaVrIUO9YySY8yM7xqGNKa33j4feyHLUIZUatlV9BGvckTClDhhjtbF+
+ixMmbIvDpyaim+H9yZ0RKSzhDzipBAt7t6hsEIGJIVuH4FZ0nTEd+6sLJFM1P5De
+O+9A6xGDMsJ5TJPjFtspL60Cs/ECiQIcBBABCgAGBQJTxQ5hAAoJEF46k7TU3c2L
+vXUP/0Op92s735hz3/t1MXTbzdPH0NUvi2lGEPVQYyP4i0xd+9YIBFDg4gkqQNKX
+yFU5CTCSe9h/8TOiaeMdon8erPChrNFmunJCID5I5MsQnY++K2/Gu03R4RB0t/xP
+wqXPC0qG56g43/RlD5/pVcFwxpzFBROlUW3dcMlrnCAHa0B6W53US0bl7n/SyO4F
+U1+iUQvh0qpGovCApASE6Z5yrgkanEv6Zd/UF6flx/JuOV0PU2TUQdb4KqTkauEL
+80QvIOQ5fGBlQXbJKHpdvNxo3dgHttSqbH16KAV+vaXFYOYkYpgNv7lox+lxhdnD
+DNNYwIO5hYXBkLZgTyB5gEyWW+SXWPEk/9mUpGbGhR/bYru51hopjXkOaKeI4NyV
+UwFPk/r9bXE3U+Gyyx0gI4U9vaLz3xsNzu8d9tgjZPOeqApC1lVZDBQLTlB96lNS
+5NBFN26wj8XtLsiO2pCj1HEZpfcZBVxrnHkGTWCKflYhWJmKMl7egB1yhZp+cRWt
+Ml73VlIhLf0HUowEyr/NrEouLOHGn4kkaZyqa7mNtJJlqoei2la4NLzS0FrAWEhu
+VFA+lTzBQMxQZrRb+qy9f92uBKogXU/AEFALAtRwoHAAT9jbUPY/2Oxw4Uu0FF+y
+5nDnC1nZ6u82d+54/J3GSz3Vc8PTxUtPbuZim7xi6EZ4ZaVgiQIcBBABAgAGBQJS
+tHjYAAoJEIb7xRsLo+Fkl7oP/1RnbeTcdQnxD64TFlLKKJki22Wt3f5v8G4+/Xqn
+2D1f0JZfKZ8WnCKgKWEXUUM2EGsHdhodUICLISzK9QUHkVjry/GJJq5GuZoooYKc
+yFe7ub1QSJfySTg6cd6KEtHu+qlgbkrLeRAiaOWsEP441RfGiNOTXJ90TRKM+NY2
+sqoV3KUBRelAQTlT7GFsJIBp73rOSKTzCdjdHCR/tiN/pKYZk6DATVMwolaKLmng
+HgZN+D5nKS3/SDwoFmzA2HbN2hmvhziw8mTrWcXDAUnb1luGkZoK973Y8t3bX8Rr
+VGoZAxpxml3HILNv8MKObSwuIEDOb52dCgrKGczQAo/WpghksMvkRB9fpgWASXyc
+GfnsgSARG8oLI1VayhimWZk/TAwzwWhOxOQEZcbDm6lbxtzeDnVTm5gB3nwBdWA7
+7Z8fRgu3e4NnAk3LNVhi+xUdKxHGqxZUn83FSiHdKDNmpXmhTKWZF7Bo+Q9ulFUI
+WbBgttmKi/PK/8xLfCvh9VY0bOLq43lkUwHS2FCzoi5IBXXO4sS1TLGCJ8/H661X
+5DAJc908zqVIaUanOPY53gRD55xPc00/sccAsqvpaiR47wB7xbH4SuNrwBO3Zbh6
+22qBH/RzubroEdTOcfkvo7v56e7yJcOd4bm2tpyDtPwUlRPjEEAsODIQA8RPYcle
+RgmNiQIcBBABAgAGBQJT2nZ4AAoJEIvnIQcuGGS+KfsP/3wRX6QJJpGQdxQbDQ4r
+LhmLTtmvAtfllwI/Z3B4jOyQ9m/i8pvpcgC/mAZ1UJhAI5KrSP8EAOSfhFkEjYJ0
+UPsXgecvwXUtzBCGegLta9CpwTK0ny0etTDc35wVoYGGVyUkMTD7HtmlN90j+dZ+
+5uP8csLSYgmEPA8FPz8teyNaJBfSaECBK+J7I8BebXnDNJtI6m72y53JMnws26mk
+IDuPH7/zpH8M6zWX6tbwpSW8gqTjWlnl8l0ykWe4LJFEjUQ2jbmr09Oc3QjlOFK1
+kdmp+IBWOlMrYNFdyGPV29tBEGtOvneuNxC7eOkY3L3gXPDADJnyVyGJgwnnFiFJ
+tIv0lU7LDlZN2Oy02Gk+5YCyOqHMHyQdPNBylvW+1ZQ52iyNm0UYpaoNW6+vbCLn
+quieqH/Dx6WR2xd4k4IbiC2edVi9xONyOHXLp2b9ytYYrmhQbLE5owgpjYwQvMWz
+vOA3FcBwGMxVhy7hi9F9zLwTQq25+ABgVtyvf952JxVuUTbkvrlvCYkiPf0g773W
+P33NHb+7UII6M7TZImlcOqHprNqj+z8NwJB4Ht31aRIXwu2Wdamw5xBMwdKgbbBM
+wG471wgxqzYfsOXwznF5GsfZYqq8jMzuizX9gFTHDKDPinDUUtUc39hIcZKspGSk
+OcwGuS1sFlCFeNuxFXKVnkr8iQIcBBMBCgAGBQJUAMgpAAoJEJbiob6B1Hqiq+YP
+/10KcjSQUrbYopXsTQpIS5mch5VvA2nw0DCtbXl/SCA4Kv9I5EZscuoIdovAoESQ
+8hRpVqC7N9eFG8TdA/3t8dsv3MWRMVPubUUoi5fiDpi/AXfmfp+Fx1qX/i7FnaMt
+UK8Z1q2JPWDGOJra/HTb2BIyDmfFTTeHmsHV2dhAkQ/Ij2O/nULQx9Gv9JEKPyl0
+kou3EFbs8cxFkBjpnrHxoa1iwax9HO8p3S1zw0i2cb6sBguW8j596zNX3qmjhcJm
+NNpgPR0DuzNe0hM+jdxHTwK+NWO/gt+GOTAK3e4FmeBH2Z1iUMKEAT2OF1TM2BzN
+jOVNraAr0pH5SabjEBWl5r3sbU3wL4nEyMwYEMxSIK6DP/WUFaUgyy3fk/0OpKty
+X2zBRqj4tpTOo0/Ga9yp+cxS1oGfjRFNZ5uXXzerKIxaHmscgJkrW9SGav0lmd+G
+TkrV80LkeojAVV2I0IG/SZ+Brf0Q+owc+ukb2an1KAUbJPqlOQ3HLkNJO0HU2ZLs
+5ORMJvLPIjtD4A+cUrWcl+bky2pwV7zE+kPRxmHTobi9Ds9o3dC3upSBKf9jnqPi
+vvtbirAmQk6zK5u7T0mtKodH677uZrFrTep8Yn5yh3sjLA4di1+9KQjA3hyR8ssY
+wFVgYPrs6D5+CZWTKaLwjAq97b+sKwO+VqoVsLvF+U6MiQIcBBABAgAGBQJUEex+
+AAoJEOHksqEoa6MjNPUQAI31PfN3AqTmAETBQ5qJ1QdiW4bgFPB0aEmMfHEX7l6M
+AJ3Zq1ORU7o2P1pAwXDcNS4a2BQX4BDgtm2X234B0reiJU4//mfht0govO3zf/O2
+urOl67lsj1d3p2GdFbnInUvim7o4QOdwdZauAIg21ms8dDw2TLizY0GUouKO/AEn
+RKx0WH6/M0sYoAxlCixCFE2JlVPglEeYDNQUARDB2tRNaYQz5VaNur55PHGpSzNy
+pV8qUOB4PiE9YgkQ/FFDg4Fx4QRzjdgnoRP+xXGiJ56Q0y4sMqH3rCPYQkacYQV1
+zPfMfHOEGmmAA71scc8Zwbs6UeJXjdBUIl8jQ3Sr+NtNHNTcC4MIW7AMRwTxANmF
+/PCqHtw0z1zIJiUvGoLFr1V9gpD9Nn8Rc4w9rluGVTbRMEYULDtvUlkklX3iCLZk
+mEG480C4cTlrPmsC8KEwmOsS4tSAY/wWwwRDzWEsWfHFLj8z+f53SUDaadS4p0N3
+B5QTeJsctmmQxeJOKgKLmVshOs9kzvjScVBN5KBmDlzXrYBXbF6NAr6FbCyII6kj
+HGuOL96ycNDX00BQv87cbEDYJURoINgmKetgeK9HR/GDSbmYI/cqmqZeX88q7BPJ
+7UfO/xbOTE10mBjjyyE7fdYtdVPm2rgQuKbCQ2QRa6JLUCaLW1Df3lZ/rib2uh6M
+iQIcBBABAgAGBQJUheSbAAoJEFclht6OE0Uk5ZIP/jVb4lvaHWChT1Is5GiEcfuY
+s/npy65HLAN/Sp0FyR1i2bo1vO3WQZhrLHVe3se+KnRL6dJyGTt01mia/oyXXac1
+7gumkgbsMyw+PMsEqMiIw7NtaQs1eM0MHH36wJki29FhapiujdJm2KfcqDZb0FIi
+TBJhCAlE/I7z5Wp86NmP9WVCEKDoRc7/JHfSBPtVD4LbpS6jXrxPU7dv4T9d7Iyh
+ddcnY0NWKj4kmBPS7HHne8wIZ3uXvZSxZWxoKocVY1vsC4sE3o5CYKGnFkyDb57S
+e+S2M5C8ert29tMeN4q7cAnujRwfiHtgWZUYbyoAX8r/hJ58IVNNBWgajbQIpDI6
+W7OQJsOsdVWY4xByg2K/uhJPD33T5bIc5Q42T447WE03acsbfwZad2aYFC5wNyoT
+EuZ15dLysj8cwo9+A42Ks1dtVRhVgRUZw0cf3+2kiQYb/j0lP5x220bRcMJbdlLF
+lhaLlH83UBiV+lDtOi4DpkBvbHmo5l9QEnqDxTuEto6zVevvbDbbW5LfsqUXLUBq
+ivEL0hv8CPsX1iWoXntEqHdDiD/pge1L+at4KMXwV5y/JceTsHZOT5TrImVbeqGA
+Bsodm+PUeQczM8xLWHYoM0lWij22D5u8mV8GdQ0J609mFKkO0trj5xWF76EaHoMZ
+DX2cKafHI9nBUXcpe29riQJIBBIBCgAyBQJUmemYKxpodHRwOi8vd3d3LmhlYWRz
+dHJvbmcuZGUva2V5c2lnbmluZy1wb2xpY3kACgkQ7Okh2oY7lfcaPhAAqpnJX7Ay
+hrl5iwMw6syaTWPO3yge76z8BU9KNacxcARR9wm8jfqV+OtCfPvFBTFPZb2FCPJL
+8MX98bRe4Il8dqRTgciQ34zcCE1S/f8cOIv8AJShEcWatvVGpaLk+WWSE666D1b4
+ZHEDovBBf69jCdO4guNhLfQUO2TTVqsbvxbEFjwCCfdYDjSgPZp83xkaLwn7JY0Q
+ZDMfnvu3lHZ6FZ2nRhJaKrCUUfi7AfzOhlXn1B/vB3o/Sb1pw9zp3ZQTQ/WsdwmN
+M95PqLQCrsFfujnG3KBBEBwe8Kl+0eDxL74DmcAt1iVQt8ZeITiTEIzNNyRrD2Hx
+BKk64PFfhxVsV4YdHQoqhS03p9X6DBvkdpS/esa1b4hFQzaMi2LB6Q+WkCgZ40VD
+vyP2Z/tCTDTrWKztu0oV3GiCEj8CxypFr12TrpiUZykLnp7jhNdIqavUDFu2riRs
+1zZFgcLJXoSHgumg4Nc/UFqt3d3632FNhtEyaP7piTRS3ib97VfmTfNR1b1uUtuu
+4kpo3MLzkfkOH3Kni0pdsmeOc+nmwk5qco+AI9U1mgwfAVgI97wZ8c7pNOTs6chb
+6o8mLolx6dCCkYv52UcyFdup8VgcgBjdYUx3usqoabnh5Zd5AbxXMyGrzOmWe8u1
+0cVJlHI8xXlyBxNUXQWZK/CIrYrY2nHIOrWJARwEEAECAAYFAlO9qtoACgkQA89K
+CrPHmmOlUAgAgEXa2DEsLkKYRV3GgBTirsvMNXKIX1H/guafRh7M/SECVzwRoQIM
+h7B+3ZciLoZnuKAJlDzuMEivy37bzqxRGAu3bJEPAClb+B/os+5a/gk55RvxwbOy
+kFOd/FCwfSvzq7B0UiJWEXvAneYSMz2jl7V0nMGlxKh5jP5KQhqPbdlSZOWbQTqN
+jeFSLz6uSlFHBg6BwgS3K9+2Rosn7XSlfgmGM5CNLJjKcaEAVjn3Kdf07VLHYXrd
+8LLN0XbaSomWEf1Bm/rDKUZSd86AzL6oUEnXWvRyMAUR4kVoBh5rrb46zMnko2ei
+O8OcMoI5QNRZhobiU9cSqIg9KBIme50lwYkCHAQSAQIABgUCUvrvcwAKCRDAgIOr
+Xn6kChwAD/0TtJBehf3MnFDRy2xZlAI7bd/19hfD5yvaVzKXcYggqP0jvfpKrgNs
+TH6EzJnPthG9aAnukd3CbxhNMiTC0U5u7TaVDHzGPpen7Gdb1l7WV1GSRrOOdfEk
+DaqJodL6BXQNJu4S7gTwYKLXgwsK57Tx4zbjrHV9faDtIrMQ8Y6ST/HbNn1jhHqs
+Cms2Ns3Y8k54xSS5irT5sV8++B3pZnqJ578FQJmopuXtSrK+u2TgR96VQolhdWOg
+aZRhzvTKxHHJuBg1TWCGgrfGqQU1R/6VbOrfBsAJwOU6r4yfCiJqXl55HgHK9aUc
+TlCjLe0kq+h9AaILfHwbk+TFTJm6VA73YCh2QN4rvfiit8jl5QDuwKV2RBln8unr
+nzvSjwff//VUFAXk7pbPz/mvEdYPNpWlX0Y8O5mkZbe17Umcy0fDqkAiMScZNfGO
+01JelEKeF0GykRPrfQTlBwYcsws+jvoBCXxkTHcuDUDYIxSQV/yHqKVbfVPXbOPg
+LpfmkhaYp6phO/YXVcraeGqV2XUKINiU6eJRyZAI4UWA/KgigFXiknddHgucgLXL
+uzF4vNFZqwO5xhRmKpN74SZhgE5/unCezQsXF0yv4By2JtBmiDIZHbk3MRLiJifM
+WKOghoSHL3nGsboKZG2HePmCcZ9K3pjlKpuD3NX0tGZ4UuATCy2PbYkCOQQTAQIA
+IwUCU6/gyBwaaHR0cDovL290dG9kdi5jb20vc2lncG9saWN5AAoJECO601HJFrZ9
+xB8QANlST04D6RAQtM9nHBTW8yc+5o7+wCY/A3QcraBNPnseemcMC+Gu78jFBrqH
+0yzGLxyxV9olD12C7KKckdzzSw1I3rAhTSe+EWioW2rSSmu23EpPipxjxM8n3It+
+cHabJqfvNnfkKQdEUqyZGIF+g1F92yuFuYVtJPPUpSa27SWoK2RBHFLM+hdPhFg6
+DYPo8z88VkK4RAqY507ZUEUvQZJqKZehBcHOnLm+nVp6v5fD8nWJ1b3fKgnQp52C
+gKs7qU77kw1ECdrNrtXwc8v3rNGKYcgGRz6ovWHFVyRXtb6QMGrtbwddnbevksC5
+QUUj0KTwN6atVa+IoCH1DUp7/RVc3tf4GnEsTKHG7x9IRR9+zoPsxUYhRLUsxeav
+s+Sp1WjoXngB+jXDXqMT5ePJtSZe6wRy0lQ4ehdxc/ZVR2zlXaO5P/Ir90EELOZq
+McMQyEElHY6Y/CUSkGADXEgvfuom0tdQhZC/lm30KHObmqBpGplNWPseBwFErMpi
+wfxMkDsLiMGoTHEgmQ3sS4MLdlz5lcxc4VZW4nfyTHdUdQkat1xaOW1GGm5EntSQ
+7CeOoGVYZS1n09rshpPgSB8328I5PIf2pkd2RU+w8QmgAhNGfvbPS8TMwKxp/VP/
+piJELaX+aUmRIcYNOx3dxFIY5Jsh7nD4FFP/NMIshw9zy7vViQSxBBIBAgCbBQJR
+lWzOlBpodHRwOi8vd3d3LmplbnNlcmF0LmRlL2ZpbGVzL29wZW5wZ3AvQTRGRjIy
+NzktY2VydC1wb2xpY3ktMjAxMy0wNS0xNy50eHQ/c2hhNTEyc3VtPThjODU4MmYy
+NTI5OTI0ZGQ2OTI5N2I3NGMzNDBhMGEyOWExYzFkNzViMTgxYmZmNjAyZmRkZDc5
+ZTdmMDQ5NjQACgkQTh95mqT/Inkrgx//dL5nGlDq3x14gzjd1sxlPZZJNiuRhGrr
+bV+qdoEUYc06suO81JeVrvClnrZH7Vzn/+MoT8A8hcwhJQK0XiwYNIDOL4AgB/o3
+maklnDL4L/TNdXAPK0he2kS3aT30epuEcEvJ4sKbyJzRuAzQkMamakgQelw8q7Zo
+yT+jzYSQ+jXduJzMyJsie0AdSa0oypZOd/Rku34BIYawYeZyoVZb887rLwHOzCsr
+FAjHbkK0WG5FkMcONTnSJSGTHOhKwkhhBCoK1QeMRWUdgzU3fdzw4IIx07b1yp8n
+QmQtVy/eKr7xzJkmoF35O+kMLRwRvNPfUEetG7gxi52b8g20ex+bbO1D2yMCEVgN
+L/6e4YU/T0USy1bitaC1GtYBDfyAHx4LO0NNkalvdFvDVu93vGA4C172f5d/tyA9
+RsJHg7hmggjIwGsTEDt2GMtjNh/2iBKGkzHEb9iC7XDYADe3BHwzvB8fI6/fB/Y5
+W7VtUmEc3NxL11XERcL5WgJpxG/mqoJYGYl1MTRcRVhxlovuplc734PyUxE2BmhK
+94xBB5Gtm7SyQlRFLDkP6VycI2iqapjHQY8uJ3ngW42TTXfuSvxRqTMhI1lmiFW0
+QRtNMNDCq9vOtkUBzs3Gv3GCfL2iuvrfW5wj6Iv5lzIEjrQ4/dC8wlseAbU00QHP
+xGEpvB9mFjpQ9DhgBK/VFKbQj+Asp1NJgYCAXb6qz12qnx6sMjsuL0HB5P3tW9JD
+dOz3eae0eNavsmGeY2+mSRWIee1q3SKBF9TC2UW8NkiB1qUGiP80mHhtXIGY1xHo
+FxUh54Fqidup7CvcI28IauD+GxR/sHjBaeWewZ4WEUM/XTkQJ+xqPnDDE/3OLbys
+URWmN/v7+MFd7dqyHBeR83ZlbJQk8pkTfvzNHzqXKxxfxszd2k5WtH6WSyyZ6phe
+N7NQqpbjxVuPQM0MW2bn83gDlhCBzLN08NwlJpe/sYif9s13ndMHHcmgD08SkKj+
+LPQQ4HjGwFJdDKrwUbVVg/ozMvX+cwbzsWZVHkMWIQ5Z9zu4Huj0C6oGz3KlUVjK
+JwvdvJ9kFse+hGPaYLfYIgqIXKRjzGYq6J/qySp1bFUBjvRpsDshQ/+2rkktzJeP
+7da+9wTCmmzStvgENCxMdSRc5BDWgF3vjMaaFtkK1zOXTt/oLCiL3pEVW3jGODkW
+IrCx7nSO0NJBQTIME6zueRWOPMpERtd9++vsJr5S4xJt+QxNmBZXzCEnuNDIwZcM
+0YneX+P4Xm8rW0OSKHBXDfddzOAF63DnhdIVNiZAF6B2PlGhwpIkQQJO7O2hHQY7
+JpfbOShgkGzL1LZUWhcqrfssIW0pS1pcdVgPdLDTGNDY8KkBcHDPa4kEHAQSAQIA
+BgUCUZXVhwAKCRC9ApQkIfSInxrLH/4noQq/xGxrn+kevBZVi/NXqZXd4GmTTMAP
+ICFznkX6qUswdvba/EoPT1Mmj8qjNGT7xxs10W/U9jtBEzgqLguku+RQIdgVWr1h
+qCaGv4PjcX9j5M3qacQ2+LGJeLzAUif2/OesHaoFODK+dkbJQBhzu36d0b2HfRcC
+3Rg+/jh4dCIdTCKYBU/cWheAf5h8f6NnDEeAWnTtKPpCvTWcAUCSuFHqDH/D9izo
+odEG1CrDijVggusA+Pvm490Ncjmu0Mid9olzKX/WjdCqclOfgzNJpFCKTwZ66qrK
+BWMF2Kl3YP/G/jG9hO07B4Zcpz+1bOyKtw1b9VeOZIVK3GNpGbKgmAthTi54E/3+
+Evl2874q0BryYyRApiHXy8QFuLi96J9OK7LeTRNyzrZU+OVRPwnf3IwLrA7axeQQ
+M5PZ3HC9QeqT0/Ami96b0sdrQrcnVk7zYDPPPbDzt4zo+TclrWR5kc9tYBBPqndi
+8cc0mv7WFR+Ig4dge0/v7HdOv9hJWXa2TqA3yTdm6uPUNKqOw3D2HGtaEMRozVSP
+uT/cy93p6CBNid42cn87vDAnBvKTUV3SRL5Qj0OM2XlgAGsgg+1JOc5peWGTeCTI
+T2SQb4n2AK3rzdedGy/n3vUeolgEDQ6Lo8DpBvBhTjRihtGRl0NJaKpnN8nAs91f
+FPWI7ZEfhnx+NIKaooecn9on40+cA5rw5EJq1TBnd+N1e0uglbnxYG0Lz8puH4VM
+i/lkuBHB3eJNUxliOFgJv0wA7YU1eyER8AUhrEW4LwzSEekXM20N4+d5eY+0XmCj
+9ci5z8IjQt56D3sKhnqYcuoB9wY2ArWGbVauPjnjYAi4uX4ctcTQnqraOqkJW5rO
+4cOWCgf8ddkJ7HYMRlfYLrimIiRDht+wNKnZmDgZB7d032VpSwg1UWh7299Hhkik
+tNWh5iuKSSwBWFYC8P4IAY3oI+gMXZ6U+TUDPblgn8Gdqmt7wT2sOxWIY3Af50r6
+WfSOHQtRd5X3y7nIKYO96ejjuWlOsPedjIRgzCgRqL2xtobyGqrNUcGimTbWWXAQ
+l3yLEJxlNdS2LP98PHEssVhP9+R5b3l1uvmAVxyGmPJ6yQkB8C5ZkY+8NUV1Tgwc
+u+YlHepmFET2cmnaVX0yiKRZHXSBTyyj5ekJAcjAJ6OHVkv6f9v8XpPcwZ4VIQY4
+kPhffq2xdCuS7MIjCvwcMwfFFzl3rnmVxx9bwwgzgc6w4rfG4MScvI9mBk9lau04
+TJ4Uiywt4UXFiQM/tK0iedTsVi0twkBoEJZjDnNlps/iuySr2rd3mXrAU0BGa3uj
+KcV4nm52ud0Zyv4xZRIqnmajw1n68vNXsKsw51mkP5uNy9FfEFVXiQQcBBABCAAG
+BQJTuWPsAAoJEK7O9UbsiwJgEacf/17tkRVscYQUpl9OM5CDY2YhHZs9Cz36/U28
+u0pKaXn3tJP7P7dxMkQhwIyOlDhXiN86W9Q6I3s9Gy6wqr/vvvre0No2wT2tBowi
+NaTFT8/pyT632UjpFKYM2x9Agzgq3EDBRsgJGty+eLAtQHA8nvFJ/+KXAWf31ne9
+H4WzbZUiqo15qSOq6Lk+LqMMUikM43uX8M6rCWW2XGFsgHgH0XZAok9Rn+OCfbMT
+KPb0OAa0lJF8BGvaUfX0TsXAwwo7BzF4C/hYuaGEfTn1VDsVM+UxlgLsTYOzL9UA
+VbWjIywGF2R0ax6kgWh1g5oU9ww8xkUxI65b0o7YMMSNdBm5ONGy6S+QSJcU+QYX
+OaTXA561UImdYdgk3OoaQpsDz9xQuojhKgHAh+TjJxSIDRG/tf3LmPX9x4HG1wF/
+a6OdytHLgp6blH3Udrpu+uPMJ4CuGpszJDjG6NKhTzLj89lcbB43I1mypmYkChWh
+MYwsj5hryhCN/CQIfAQvqyROBJ4P80vfa5UznhBpxsYCWnhD/J5m649QYDcr11LD
+2S1yLQ/b5hvsbuvvcebIRukNi0UWMeTU+gg9fLu9Kaj1LLpa5lmaIZcs/4pCZzL8
+v0rSxogRUliGsFq2iTJftx22tVO3hS+taovWXyc662imNOjrXJG6Kgr7P+4sVoPC
+W8Whxim8/exlc3eNK7n6A+1OXSX3qjgc0azq6OA3E0RUYrc7JWj3ncxmj1kFbfiS
+f7apZh7EueV/K5rHUedfk3fOAwxtraqDc1la1T0cMlsb2AHTuWTVPJeguh4TqhFH
+mvlrRlscyul6q5HJhpRSrwmHeu/tXqBxYau/kpQMqiKhh/R1YRCYb66TlCUh+hId
+YwdMBCzhEnROIdQzvOpUJwgH0vfQEyIhuoCyNrW1FOfx2oFaLTBgwfNl372tCYSW
+BtneF3JbrvNu+h9EWWkBbbAxfVkb7xB9Q6Udl02eRIfk8QiOYA4k2VN3iJdmx34q
+56qZAj0e9xUSQa1DF223KjvQxRhT6LHHyy65JJpCPqL1FBo61zf0iO1pIuqxxHKo
+RhZFhMixCfOywWawfGc0h9gwPz54WzHhGOv9jehfS4RSVk/DS7RDrh/tCmg+jMB2
+nvt4a43Yb6VYZcg30943qz0R3b5IGSRCcmfIU75qrJrPVlrroh8LV2da3kT0WIqN
+oZa9eOXrCisECiiO89ak6ZebE/ZuBQlMbb/KAebc6AScaO4JFftOhoaNfB101+Jy
+btkP2c1ltph7QSYpmo1zVZgYMSXIL9r5xZ0JeJeJyoHAJq0lWPMchjRSUOcmTMip
+75Ndve4Q51zv3qxvVTrv8fuL8r8puHdnViVOhtW0+P0HI14v2FyJBBwEEAEIAAYF
+AlHwdocACgkQsReetzR9wQ23oh/9GcctkEep8L4wD7aXyfE+ZROz+2+aCRNhktof
+tIce6EoGFtROaXRFiQEaqdjlcngaaJTMFFymjViC99gbQjjoFyEoZgyHIL+sGZe9
+IDg25aTMkFQ7TANRACep6Fm1m1uDQdYowHWSwvPWsXFYrKHFmETAZkd5gprLC2oL
+DZfcRt8SAIySqAnASEFe3rnBjZzln0Y5IsyJQEpt+2zP4TR+qgtdNnmjAdYAnckm
+iubYNj9ph5y+HI4EsKIun+eyv8AaX7Siwlvt9RLpzUTG9KRsCKcq1zbU8kp6S9IW
+sb/VSIN1KVFQlM2dl7d6Hjg9WyFiSEMp0UloqwB3Iy9b5WSYFXHjjjNcx1qK9Xf7
+DJrjztLT46LLj9H58Utllb/v+o2AjHr/xWjwQdqk8H2x6vVWhuTI9DlL2xL2B4lJ
+AM08Kg2vCBoT2nHH5lfsoYzzRZ1Q/ovuN1lx/0CWGB2zK1daDrOTnOUYfCDqqJGE
+H87VZV/B/uJnjy1OoUxbZ9kU3ICr3M3zZr3QqZq3kr9jIOM7yeEIsCOR2W0PQebW
+EcRqzRX+7SOeafMpRq5LoFuht2A2oPrG/uahs2pyH4cDwsQLh+o8XyPuVOgQMxei
+spd+AbLi7OsuFnx0sBDyXin8qSsx+2urpdB6jjZjLzRTpmn8l24RQidZ5rPxLbd4
+HD6pHuGxyo4u9rOclL7WHoJi19ZEU9Qb44F2+8hObKp/n/MVZNorZPu4dycgidD1
+yvT0WVXwDBGFXMmNUDNtwHQs4S8FQ2tJhlVe2sAP4wcR3YtskyqseguZK8X7IXbP
+4sgbwDsrBW36DG6uy0ZUJqi3FuQL9+wGYmpZnX8GRiajWxj6kpB4FtOBa/5dOVdR
+5XiejyfC1aVTQsxHGK2rosP9lKVHMyX4PwL+13TVMLC0bUWwneRn8aMezid9DZqI
+O59qSK2dMKamF2YixsXJuOIYqdXy8x4iY0EfTZUCCRG9vCs1p946IDlyj3KkxMRX
+y1xWOkMT58j0Rx0iKnEKKIhoT6rmpucKLasuYy8vajy/qtaaJQvirbkTp3h0dEom
+/T0DV6Hq2r5KtW//5osO9LrfUAUkNpwo0WS08V5U/lsix0ZCArXm4SVjBlON+YJh
+ARbI641W2OF0oKdBBR/uKPSd5fCbFbMKDLgqmgbGlAWKHx0gou0oIW3yT2HCLyjQ
+ZhFJIDG3O7wKGu1Bna3kqgKiDhS75ecZEZNIk4o1+ONu37f9IIDSriHJfbAIEzSj
+/Np9b57fo9AXaOXPm3HJuI+kwwIQNvD7U+yvR8zrU2k0J/F+UUs4A9je+jg8+kVF
+IIlGWFx+6EEWsqEWzD4PWLfQBrjXVeFnpczVzMlGZE41RMKlW4kEHAQQAQIABgUC
+Up+JCAAKCRBkfzWXiao8miOWH/488WA0zBvsgIJ8FlD6KwbKMOT8wvNqo22s0vRR
+EPogvA3YFdp+gwarOVtozzoNzq36ZEy1TESVlpJ9fFGVFxfR7MyuWB35+SZDi6J/
+ItjrqYracq+bnRx3q458nP95Xze4qI7e0YWHqACWlqbnwr3xZGPoEYzKshTynga2
+MMooX7RSABk7ZV0j8fEvrmrSwhOjN4S6Ow3ej9LJBAwms6JdSuOnx/+VBdbQ7oKG
+RzQgD46On26WlV0jH74pJSDXWLQ2CrSxz/ftEtZzdqofIbDYhr3PMe7xah8UzJuu
+uIV/kvxZTHDxbubSTQHTsOFhqCJr97Mw+grT2IKokWyrHKRbM0W6yw5tAuc881iw
+F7t67C8/WbenkC/KhceN8JC8gZgWfDgKsxqMuXCg929Ps1KIxqH1uMIOuM4jo71U
+mKoLh3JI7Jyp6cI4LNq6nSbXn4DdDmMW8x9e3LU8HZyizoixW+JDY1W6LWWNCtpm
+Ja8iVg8jS7SOAehsc5lz5dGtUEiZc4fL1kOKAFsj424spEGJxIwrE8F4Y2DOJFz7
+lRcQ9n8WAT+TAFSfUoiu8X5qrnQAvppk1tT3TADbCFHMFdSFJ8QZMPmzUZPDmrBF
+FXrZx0vCm9uND6s20cJYGlEyZGAlTk7CYchDLHi6WJ0zztLGHXW/Xc8SL3aRWSGr
+2fjNOQt909QIKm9g2IiIFdbVNKmjai4ku8CVPSob9NxP+FfSko6oE8pk1ivi/9NB
+kJKuIo9V7eLDqpN2PyaQfTWmy94tWXPLnxlYbVdIV2NH+ygeBmJWzy5P65Q3n91+
+NxINBobV3tnMNIGOS02Jftgo3TzHijh3VMBr3zxilN9ysGPHDFuMSMI7dCWKDXgP
+05X/Zmvk2O63cUDts99mL0nCMmG9RK0J0pbUpSuFfw4r/rhiwSxrM3narbn1XSAA
+vuaiLrQtMvtCowWkqlMJNAtgFQqJa6nPKyFtcvx649minygO10K8/2lUy/QJDcs5
+zahEJ/lws99tqaV0RB8uz3f/ERw5jH5eIKdJzrC6zgCP6ZT3VC7RNlngoUXV0b57
+9a+ziVLu6kU7KGr/8Y5bLQo2qZ4XFEIrTd/gwj0yFw2NlejWVF5kifwVSgA9Ft1g
+SpfSkhqmNWEUfCWi7eLTD6DVb2gzewy6FfyB5Z9C/tPW6Jd4u3AzegK007wgzSf8
+ZJ6YdI5VWLVoFPZTO/zci1HNTWccDWNvKJeEIlyKnpZw7V749PlABjvDkjzl9zab
+0cjuQ9mJ0jqkyyvXOxW7o1YiLANx51l8dvqw/VfXgMzcOyT+M0/4VtF6M6/SYA+O
+/cT1ox4AutqDMOWavVDm4cPLm9SSNJ16ui6cFnzfxaoQsAUyiQI5BBMBAgAjBQJT
+r+DIHBpodHRwOi8vb3R0b2R2LmNvbS9zaWdwb2xpY3kACgkQI7rTUckWtn191Q/8
+CdIST264TvZRkkZs5i4zfTqi0asVVbrqXQdGbVaBIQeSVzsY4+PX7tt2yv8/31jU
+embjqZ2l3k8J2gtEhHL/kyvchxJHCFlrNdIelpo/gG+F8L5mjHcym9BooFE+UXKr
+zmk5Sra81DnfN1EMxuGvhrl3UQ+EQAB9YgKrOJqfKlTUILxhPrNLfujiBF79wYoR
+ygUqacjN8fPOc+8XwCy3QyEGX2E1/ccf9XjLaDbjH73GZ4vqXc4aXITcutcE2+Qn
+9vlPSqLDDrUk3SpAhTMlAREzq5i1yG3Nzme/lDmucIcmmfFUEK56lqvln7QDk4lj
+6cRvw7K2Nfrrc4WmIxQPGPJdNSPSZSofS0U4UIxq2A8fNezUlKkrR2VFAstOkIAV
+gsPxv/1JJsrTg5gUkGX6lfYgHXCkeJ4t7YFsw+tFkrBqHcLJaZHGz2cNW+qo80kX
+PhyyaSTRYvZO6sB+Am/gBzTXSIVsDrM1oTSsPxYsOixHwqz/zudblmn7nkENBezD
+L8Y/TCmx8KFDl+QRSJqptekn61fbeGnfvDWdPeYMACcUE1HcEYgFdVLl8GcISHPg
+6GJ1k0P5vllXbZP1nN6YntKpIHK+Frx4iwbd8o3hrsktTl4wV7PoXe744+Y+m6FV
+llLeHkFQSpKHluumpFddHJ8mvOhAHTHXEdv4b1VTrzSJAhwEEwEKAAYFAlRWppgA
+CgkQ6OJ4uo9cihHGFw//e8MkW9XDG1eTFyMY3rGIIbbfADCqe2J/z0onfqTWZWng
+1D8hZ+iAysZ5aEBZ5tOpF4SyLGUSV2lrSiNa/VOWoD8nvTsQbiv2t48F21skbhBI
+rkszctAvK1ofr5KSMJhO1UUWvSD7rqXFLoR6/Jesh8+vQ8+Kl4/B7PIWkrmALnqP
+gXD8zxWav3Md8YW/qUTKNkxpdZOdg4N+z+6xhwiOG0Q6FLJ2it0ZM2J56us2zrGY
+Ha75pxVwhoDHXjBO1iMZ5jBfmaDLUKUerj2RXYopiiJP0eotyzsMvgfDxUJntpph
+4dZLHPFlMljRXhrt6f6hFjzrGKNu8WKI9z1w8INsYqxI2HXWqkmRe/8uJM1zDJZ9
+rUNZBS3cpUpgIk93QGhLsb32iVRV066B77FDxeWcFig31GOOnLWoVEJO275QxBfi
+xfCr8Euc81f8FssiAyDcqBnt3yR+8R+QwP2MF8wrTBOZDksZZ9atBSvuBsUQYNMO
+rKmKcnHPcGb64+OqM+mZnKN4NtsQ/aS5DaXWGgfiNUnUGd3z7+cIdABH375dhFMT
+0cXd6ysgWlbnRpODUjII+5QnJgYI6DwpMWoqJmZXcNHACDV5wDZj+q1G2ZMZLGaf
+oXE5bbwKniZdeuTRAS79NnNwJ42rYDcbviDRv3YUxQSC0RTuL4te6dv6Z39lcPKJ
+AhwEEwEKAAYFAlQAyCUACgkQluKhvoHUeqKSShAAijtxj0AzZi6o/EYgrWZcQy6Z
+uKSX5O1INDAIitP/PTYBk4vy1/pMVwDgOJnYabaeB79En5f5yfInaGKzdwwcfX35
+T3Co/a/WwGoa2RTQ8SESM4uFfXj7g+e31bhH6RWk+hOxJDlVrvs1L33tcT/tuxr8
+vl8pIo/zQiX8erfgxOelBSqJbsxA+tj5ASlh5Oziu+uyCguPfhhEz+Kmhg4iWYsK
+dZbhzgGruA7uyoVVaY01ssknq749RblGGG6/bcdvJbjwMbJzZFVNWjCx1S+vrjsG
+IyI+xTEDSuNgUUGhAZP06NXtdaPnmVXmUfCthc07ky+S73O6XHQX2CfUxEdYtwWc
+IR2AjDoSVtnFbOcoNaLpBgWkSLf7RGOU6ddTTTgFB0VH6l+JJCOJk9uq/nVmUimK
+ZmkfTdlSduQLK8YlQt7jDE5Os3pWi1ndAtXzDSyAaxYDsmmMYu420WSclLJeRyng
+IIFRjuMfkE5yQ4/XJLY04RakucKYEy/Ifi8PdsszPCPJ2w4c4YkOM67RGc+9y0Fn
+HYRIhv6LakGl6072jmLcIHCzkmoubQPv/9e4lZKDM1YpciaFUSwxk/Bceoy8JO8l
+ylKvixXfakHMTmYd5RnJRXHaMw9oHzuIMLMXcFo/2Z7tSMU4VqkcxRlIGUxllzdz
+byuEKDcsBYMydfjAdtGJAhwEEwEKAAYFAlPFgsIACgkQg2UBvp8npyN0Wg/8CJTB
+6eKbuO1A+BMvJzKqJ5djscMnB4SPp/oG5fheZOdmWikP28u7vHVyLgRqYHJFVgUh
+jdtbcolOH14sm8ea4iCOzZFwdImX6Qte6hOVViwvxiD6P3vGk9ywxVXv9KDW3wpX
+UWuXJjeByMCF5VUhwe3V1KiLJI6SQHPhXxFyarONhmpkEID/D6leVbzS8c1r+IqF
+A+0fLrJOWcr7D1r7ZCU6p8PZwiO/M7PohpGKwaagGwuCAppA11kSTopnF0l7Zcc2
+cYev/vV+tw7vKy12ihWIM6pY/zVpDU1NZE2auux68pjpc0DVDTiM6XuPmdrINqhA
+EPSnlnkV0G1m27rxfzva3MSEfLNC8HezhRU3A2lPdR0UklUEYAuqE+CAcmZD4xI8
+K2cCYTzyTZOzqYUruZYvYmb5QfIDNRxR7R6Mw5dNB2fxDdshgFMFNrs+np3rM0Ie
+9pW8sxmS6a4AdjuFpZk2+sJSfZ1mJfFfxSoHuepHlAybnhmvn5kN60wN5xnVMhPZ
+FqQLxLqGrK1ellhUkyzhbnTw8RiPXfCoPEq8DGHQ8Zveg4+32SzpcP9bHjkJtQCb
+h15Wj6nnxvKxTHFa+7XQelUj6wLZhdrqgpKJh84Za70mysws/cbtiG3tP9hT1/2S
+8s9882C9oR/C6ZlSBzh+Si6BjcnU8C2choMs+F+JAhwEEwECAAYFAlO2mOMACgkQ
+FtVCxJ1nUejg4hAAg6WtMSU2pFsgEHr5rXHlQ4d0SKSsEPgFV7Fi5Rr/PtZQahJ5
+o9xVNg1okW84KipiFJaPH5dzBkRjcZ2CaN/61jlK8DNXg7+ApIXWy/blcRhR6lc1
+fYW/jerE5QU2ImTUSxKGUYT/2HCCdsRBk2EWYBbk5uDL+h6KWnY5ZY03bmazYvEd
+w0/AtC5/VtpQbdw4TUvssu2cBXUnoijMffXmETZvNuhGmyVf7uy/Ha8PDAAQR38U
+JkLjytDJhmdKNQ0pk8yzQ3z0lxjM00p/kmtv6LFRVvC36u9NmeNsmo8vY+WdeRWE
+M4mEhD8mpVT30Sp1LLpNuObkwzqH+vw5ejHh+NKpV2zSWQXl1MqGBc/kVqH7bM8P
+Qff5SOfod1eO5wUX1Xm5tdwnpvdfMc9tTosVouOWsf+sITyhwtvnr1Ph5pjbfHey
+rEKHh7pRJkhOPd/CS8sUI3VKNe0mzhvydCljCfq/pcfBcJxrKr6JhCo0NRihhqL6
+IM6YFYqEWP6dBT7aXtxAeOhkn5/oHmVmthhuCwHC2Q9fGNwaiYmnYGBCDYS+AOo4
+rbMy2IKMkyqVgK6b6/wT8RHGJaz69MrZvuotx6Nsy+UaV6Ce0MDVNvWN0vo2Sgzq
+PNDWq5yJTnhbUbXxd7ZdlDc0y88jVDKyfi/BvsUe8u2uWrYOROiYl+NlCXSJAhwE
+EwECAAYFAlJZ1l8ACgkQu+TMxPIvObUBCA/9EjvtluO2jxCXprTqJXsb8F62z4mk
+l3mOvcA9cQRMXOsq6icZ0vZ3RK41gJ8b17ZEb+o1S46zJLMeRXUw/R3DxVvbrNrq
++Nn1PtdCdVxwvXW5DRndDA/ceWewJXZkARVoExVdrVf+izJX75HJxJhPflyAxXz2
+lraZzhzPoAQlBZZzI74UR7OZ6KTCK61qx1EwMawlL7NBcqP6WB9l6MoMGdRh3TxT
+YEwSiIAp2FoTesIxgrrmPFWTub/X/Y4KKxDdXxnAT2QbJ1nVWIsNHMcq65aJN73x
+eEgILB8AagBqHH4Z3jItrv9lGiNbjfJM/GGx3s+t5bwN2aSrJg5jn0s7kEfIqvte
+kAwbqKR5nkmQ1Qwg4GfJTC348RXwiFspPakBYjul0kcVUMJeOZ/xnXreSHCxE93H
+4Jxtug5PgbkCfFSb38l3FTl2jgEyad+rSMnVus5V6m7p/nVuGlcB24U4vG0VMG99
+yILlpiKk90ExfOeVOQh1i/UsuurrxI/irE8CM61q0PtR6sjXfcXCPdw0eFYLplfg
+3aODbV6sAptmSKNMPJbE+WYLauPGezuAy/TLogO+74TvpgOC7UGH+whxEugNB2eU
+fhYg2zSao5Om6OIRz3FxHXYM2AzTn7rZ/nCbbGxUcUAjkJGTpQij544KvIG4PRuz
+9ng4jky/Oo0sn2GJAhwEEgECAAYFAlL673MACgkQwICDq15+pAokfRAAhx890VG+
++EEp2v+sEF43qEOh7RjVXlC7gaJv/9Tpwrh/gON0a74m2ymsxSKOIpi/s1uwc6l1
+mc/kuSEWrHa5FABtYla7l4ORfcR1b4hRfALwjbiAXC8J+aTRlkaFPWj6OMzhgKcC
+T3nEzQxK2bL8ZO/rDzagM7NDN88lQxNFHnPlecr4fba+ffk19jrqwOCphu0iusI8
+HxkwJiwHROf4LmalY3MGFSqfQIoaJu5zhDjpppalDmjO2l8tscV6+r3i5byZqN2d
+kQQ3XsOkDo0k54v4BmMTwXp24oB7tV6DvWHqffijRNZpYYJTKeAsbbJJSICNEklW
+REJx4NcE1tfXZQbjubOQH9AWjpkTub0A/Sv8hIaWFHRKAx97JeyNoAsYr8rrKxf8
+CI31RjbkPEbHu+1xWKrmff84bi2J/J1+zsNcjk/+cegNjwCQYOrnOx1RTN389Ahj
+Z7hV8QNTW5Czh1T9J1Re4AQupQbV5jeWV2jeZLZOM7J3Ef9YWtIQARO2BIFem5yH
+PnfObdP9fFpGkzp9S615AfK/XKDy7fsOG/PAZd+PLazZRp8bR04a/gnos8oq+ZbY
+cl+Cky3dkFM8DvUaF810HPlAGWvCSeLNmARMBAuP2GbnuClUf6yPD2FAv0h/HvGe
+0mPjZ0UMKu8GSJ5GWTntqPJ+LxCRuXOdj42JAhwEEgECAAYFAlFm1W0ACgkQA3Ye
+/+KdJEwxqxAA0ZCB4xFvte0qPURfDYtNzBOu/w6oKGAqZ4MG79zwozoFdO4SpaDA
+DW0hQtXeeVKeb3VyYmhNEfXLsEhRBRPp/PToRqZaXXE1fJv/hwjzNSxm9VFIGLwo
+sgFMRTFYzSt29wYnyqyklLB49FoN44b1wxfY2hihL8O2yCiKZBLvyH2PF1/FB4Dm
+jm7Ku4ZaTVj5QGcFc6kJEYnn1RPT6EMNS0J0IsAVvJouSb3WmojW253yzHvgl+cv
+BNxp46Mvwd8VH4IdHNSSojVPNbH2EQ0rEkTpQPcGzYoJXBp6E6xoHbJcDmHjo3oe
+6Kw6IBbYXolk3FPyV9olYFuYlQP+8x97/yu4c/aDcUo2GuyX6zGspr67I7P/Z3+3
+OHBHnFbxw4ugWNuAMJXlk/c36ny5Hlztvw44R52++YO0QoIGFJIOFFy+gIunoLH9
+N7iGOnjJ/X5mz1a1hQMozNRFDHpGRpoBMW6zEYRA8oFWJKX8K4TeZZer/CsegoH7
+nh6hcH+YgoZVGxs3OSL/xCYwmsPDA5wgashOSFn5e9XtpZaeyuTVM1QfGIeSJqQz
+frcQzs2nWlyYl+oBsCmsjeRbvft+3KjuBOtuj+Auacs33/hRPrBWIopI1DMAWwt6
+nI+SD4OGBc5LE/tUTKAiG3Zy7icnrMVnsoQEzjOt/Si2YAgw/oP6LkSJAhwEEAEK
+AAYFAlPFDmEACgkQXjqTtNTdzYsV1w/+JpNExrXU9x4a8LLSAOPdsZkzp7nbesAh
+z/LPZS8HYoqy1iFYQOn/pARVQGbn4ktEBnmN4HzJroXCcBMoQY04LHxNN0luut3U
+MEY9MmkGLsyRjMTkZFDIt691EUV0FXQooHI2FM2hmM181Hn/Nix9uHsjQwWoiawq
+PLPhraalLgMiyd5MWgsYzAssWXwTD81AYXi3fXNDQ5gUUrmgFcMql5Wr4ehOr0mN
+mP7Mgt2C76g1on9FyYObCVAQsH+ybuoBRqzf4e8MuLqekiKC1cEdaa1NX2VmiMNV
+9JsUss07aMegLAmYFp/wIw8es2hB671ekUMclVFDfwJpXx91mCACTTjkpZfH8CHC
+BLZ1pfU5axOLickgsnWVz1Gv/s05NALylrmjdhOw8kb5On1f+HTW/uKZ0D1M9KPh
+UI8uz1n9kf3iuWuOrLy1ZdZf03IVtCFvg+dkayD7EETB8/Vt+BfL708ejaQESMzE
+10DA2ufT7t7QTpmQPe1pe2X8EV6lFSGMH/NAfs5gBf/w1nu85C6BqyT4rPf2Rq4D
+aS/ouQsvg+LMuDmXyr3hDFn5dEuk6RuVW75hDsWvUUWzLrf0mqkAcUCFdv4EWB+s
+dYp41ncAGfJj4Bwji1w2ODq3oI/H/bXuDGkoB62GzPvgY0prRrtfIm4HjzLBPZwf
+5CQwYsoasvuJAhwEEAEKAAYFAlKfiWAACgkQpEw906VI2OJUWRAAqiAAhWdCR5mt
+bHpLNPKhqzmACCcXe1Uuz4JOMPP5GGqF3j7Phdi4mnr53dOmgsrSQcWt9skfX7IK
+D8KBdiOLUTAgZ+vEp5cP7XvUlOzPT663/EatNoBDu2tpKgB+mTXFB3UA8NlNEY+A
+K52ZB1IdhMuEycFVHLWc3l8ZaYKmEUwSzWicsgT+dzfAPpx7aXKiWHcQ2DDHU2FT
+bPHqb0THEXzv3Vp50ZZ3KNabYHt3MJuxNf81/ev+xkzw8L7VrHqNDxfVusG2lkzZ
+t3O9Yg1yWzW3FVnRbQRCWQYR83Isjd7MrBxCOiMBs5pqQCqUCdn6F6WIcctS7hwU
+95Fu3av5jp69c8o5CHi0iuHqolsyAHj6CX3kFG1pFCAHUkgmF0zQG/XVdK3ZJ/L2
+UWb1UvrLhw0IDGLTLqatzXuZyQlcK5n58wY/FlSpD4EoTIK6Nus+mxVSEF9nb/Ae
+xFyBG7rdwzXskmYml2KDGUQAzx4cDvQS4RcJZUhFtLhyGUmz1pELuHuXG7zD3NT4
+SAdO5XD0j91SlzUhBets1+q9abik9OFh4sDmYHltohpSLxiDWsJIQ+KtJhpdoLJg
+/XVBKZLJACikCNQSJ79asRm12Gd5maUrX/sOxSAzjgOqUGqP4fMi5HGeitgcmttr
+6ePKQJU+KBMr5txqQNV/f+Fu8KhthGWJAhwEEAEIAAYFAlMt3FAACgkQYLQxcdi6
+X0GXsA//ST13om0oCWUCQAJqeSZdaM13OCoMkwRL2uqJIhOfd7mXRjPov07rYTqO
+DqPqoPxgC7yrEFwc0yNt9XgSNfHEVW8z3IRx0taiCsnND9lO85qI8qrdAxf3Tz+D
+uAJOyOnjNa2nfiZ8MrxJ6VYC9uhNs0RdkhB7xiVHXtZ/j8MZ4k4wWKGYXXn0PyyK
+RdXmT8QxRewvcwH+bwx8Nwe6YA59mJSGYggteGVPdwLDQA6Qn3v+7Z6qUzoLu3l8
+sYLmT20zUCMDvezxsoGivUfGOVy3X2jnj8SnOa0uOD9RV0knJeG8AU/FdrL9Rx/g
+qN/SBQ0ZY2pAlhY8g0EONmY8++EUeeKK2AYU1P+Ro/geeYNFQ9PWAZPMCVtVIySc
+GnscrEq6L4QdOt3r5QKHyJyFhMZoqGrXIIw2MILUVOpsttjajfSlGfssJCh1bC8d
+lv4f/cs6YDuiTYgztKUZh8tkBD8CP1SC4JpvUf5hoZlXrH9JIhXBe1BRE35zUKvY
+lW2R8Qjd3OJvHzVNK06HrNaWEtVhiWitgzXWS/V0yk6WOiQ0Cx187I1u0QjwLkz0
+G39W4IZixyNQDyCrZZf67VDoB/F2DyMYrawzFkXaKIn58bSq8tfRn9YhLmNDGEwD
+px2tecnnrzselcOaVpSD2R2gSiEp0sfsaDrDU1ZgXP6ba1vaCeSJAhwEEAEIAAYF
+AlMicHIACgkQwhhSWBn3hFEI8A/+IbC3fe++d6LVcvthTyWxDYmrIGymhbb1kJdK
+mdKZJJQTUKjJt0Bpru1PG59O8Im2pRA8tdVa7SgUUfB0sSb80Y4Sk3RoUqP2ne7t
+vxGXDaxSb9r/tDh7JetaG/j8mmegg3sKrjC8ju2JcTjkjxWnOzH0buqoyAbLZhFQ
+4/ez1YFsuoV/bcC9T8QVbYD4cG+a5OwSXv9WVWLmj4HxC5ANeIQGS44t0StbNBhO
+0lYE0SXkOl4kq9Nl0L3SME/eOC0D0C8JWuNAFpusQ17PNMXb07BhVW4Kg/q28hGH
+J4+hC3XWC5Py+LarihiDCIqGZHRkBpph8henjM+SBIKbKFyOTBGr8oDI+F6ZZxBR
+12tZGmSJFnWPUOKLr32botKpfu4hKNFoY1ZMTpEax5M00xPxfXkEulrQRn6EwvRx
+UXNT3ZYI3IxxkzH3Pr6iLae2oaQX8JCT5VWrgjVlyInN1pVK1Pso1SMu3+9CWp9l
+tTPDs/uQbxDqKpFHOQrTIOAQoenGxmQah6gf0OL6xvxHGlL5CUIjcjaMxwL0RZ+W
+Ea3F73i5xsD3x2szpkzHMQCPkTn2degP8raLw9VV9FJ3asMsvuUvno+U1mnPUdd4
+fzqQZdHMi5wzUmVpszcj4ZWlkJO5wWIaQVoDElgQjA04zPjtt4/b/gn2206JnsTH
+j8dDpDOJAhwEEAECAAYFAlSF5JsACgkQVyWG3o4TRSTMuxAAj5X34gkUykorXUT2
+/Cv+6o9pJ5fvY0Y14AkEtiLPnA/po3Rrij7awx1f7gd8nOmvN3Za8M4m4JN+FfHf
+3ZkApzNpVC0JwKV16Ey8wa8EdX0OBADli5oa2HXyEOnCj8yowrtB2NZCgRhMfh0n
+jX8f3NnfQI7HAuQDKCDHAgrAkWVn2vAnliZMTQhUL7SJCXZdDmE/NptVRVUzTWi0
++GdoynglfaHSggqosSZyBZkCyr6xQ1GdVG7B6srPZ628Uv4z66SnwF7xDymYy6pT
+Rp0L3UY2nvFm5jJf6n4arbRhkwYMNQ8pzZbP7i5OcicdYwUSPEwYij4fSjMnOHHr
+OfUFnSnDAMdlUVGxf9QTlVbnWhXQAQMy7OygCUkK1DwOp1Yfy2KFps5Qia3pEEwM
+OTM9mHLZXQHLulfAHRpMzwfMVtEmw0EwlUoEEElDiSSpH/Yb3SmQtiONzisUg96/
+aFubN43IlQUVj4zcOAD5Ug6P3AOfKtag1y/P+17qhGM+2EroA8f8X2AkEGl6mjnZ
+U+vNX43WRutQaW/1F33JRF1OQh1WLNkPgiYD+kOp94VKCpSNZgaxGN1zaHBzlrR6
+9eAfoFUpVN7zx0aml8FH4Rdpy0WnOROCg5fi1sieVqhcJf08g6UjeWRgePScWHXe
+YclBb2n3lY3iEJP0DPHccun73NaJAhwEEAECAAYFAlQR7H4ACgkQ4eSyoShroyNU
+8g//UWIwig7aKTBiL0vdeE2UnhKOzvwYUGt7yr1SWTEjiW5WVg7Fd7dUwxkg3rqp
+FVp1blixup6DJihTbBaz2sn8RaCa5k83HX/V7tB/cp29W0Iq7M41DZmiihA15t98
+iJ0DWPURxo+cRNjVogrOF/xANjY49E4sp1jbvfMH1bKtJkknDJaD5q3CCktbgtcE
+oC0P5KU2jf357biJKUgvHtr32gp4qtjjkZSzg9u0knkjetqMusxmzv4qcPsDY/Ov
+5Xy7UV73ep3wlZX/Ghx7XAahUJ1fk834v5j9Jbtnb9MXakhwqhRoAZmqqy7bGY7y
+GI47E3r/ugmNTsUwT74IFiNkYN0GABr4J5dlxSQLoe6nc6iUuMQ1K86wmzYtgbqY
+RtKvMxYfKNQyLR5Q1tFo3tVWiQWjDdgznUCvdFIF9ZMrxsNKvJa/i4yxCPUPm3qq
+ApleFZPMtR4OyNEgBSQBjzV02hEo/PtZQ+qm3Y1spj7Llmrcszl8g1Gkgb7LBG8u
+JYb83jVOaQnW2TJzrM8x/OJCAnDq9FDAq8IHCjBSK1cLgqjshfWjY0pDwSm3XubF
+Wff52hjNVp1sNT92JmwPG1+vt7aywH5ScKxxyyjgcEitReamJoiKVK/reRAAe0Hh
+EhR1Ly4bKQ7bL9sobc2quyPfB+ql5/brRUnQhWlHfzRG9nuJAhwEEAECAAYFAlPa
+dngACgkQi+chBy4YZL5pGQ//TL87RzgzJYDVhCVCIWkc+PH+9L/3UFu9MrmFN//k
+s3amHJCErWPlMMDww+3uHwBS8Dv95MlQsojFDj57XaJDyv+xABpJ00DlQiMasVX8
+NKvYJ8XOavf0oTza9NRbcJQOoBcaZSj1MR2D/QD+xO+on/zPiA4IF4+rUKdJ0W3n
+mPvguGbUDehncM5cnhwOeRjnDOEY3qyvq1qcGUgRQGHmWQdb9MPqpU7ltuwlu2vf
+GqZgroPm7YOjQUFeTSXNWUMXW7y/W6L0c8PwgJ1jx9e5InqRTo5mt1p/a0lkVgSY
+4Q5k8BMe7GSYYfKQ+bLtB/aZ6pm/HLdjTrR+4DjhLC+q853IiBK3flCtIGX/Dqse
+C/SWzsE5InQ6PO/KUUGNvQ5OeoL7C8eWtudYdtnwU462RwRXYZvR2/WpH1DoTMhi
+s+PfHn8jZ6oms7532AN6OsMgShPRNI7xxKaxQQAG4DULCOUT4hV+lDEzWIGeQoP+
+Y+XWrmPkiwszmkk+FbZ5rb0t8o7OUQ7lqB/I6mFKy7JzC3ISKUogc/nUw2D1i+1e
+bmnQxEYTKavLWqfVvKDkY+ITE2HJKTkzQ0saZTQYIhyge7BDmn7ohRIZ5GQtr/ZM
+fBDkr1xUR8xaBKXEsGcLn3gC1y/pJyq4mt4EVQEThKHR1LqLgib1v2LgVIwe5QvS
+TUGJAhwEEAECAAYFAlPCjLEACgkQg4LJXCkCPflsHQ//VeNEPvuL7bnfPd0QzLnD
+B30bKJZ5CNkDfN6i+baRB50BZ1jLkpbtRhCzm2ekMjXWq1h71uE7w3u3Wxeh7LAG
+ivj9waGb7wsZO6kGu/PQ1u0QZGmqL1uXSsltld3vIVyaw5eGilytmps6QZF9NpF8
+92QfCP/hlJ6GWSBwJTWJv+pZDGwkAXyHaj7pLiTZV40fL3T2fLi1STtlXbXLT9p0
+32iMUkEw7g/u2C8OQVqxhF0pCgbr0yC7bYDJmaW3zcvZ5Ho7wfTbZWp3mcDqs1GY
+w7oowU87jF+bag9hWJEIMDk10Dkmc8ovDnTylUtfv8DmOUcqNYxJAMsw1HxBFyzZ
+ORhxrzH06nMTwfQlIf6yDfeCoiPoy+p3wQ0oZ4bgmZTbcwA7TcvZ7pwbe9QgSFki
+D2M9h+63TfihQj5j/Z/RTU9wcfnrDfWXPmMS2f0792hmsXYIn2EenC43ojPPuCmO
+3YOPogZ49p7pJ6pFUBkyww3wt+jpVo+fnAU1DrKN04XBpcIUbA9ULbLVZIdc637J
+xHegZWWT2nwLbKraYQRJ1qGwXr6J+tJzil59ll9bkzSTL1ZI/txtv0SThs+iTFFO
+zVy3wy8gi/SzVHErLP4JKp/TE29zcmCXx4+X2x/x2uKSHle5pqDmbvXkgjEDqP/V
+KPkNfcYKackoLHBsMlRSSKCJAhwEEAECAAYFAlO6xH8ACgkQogy+sgAMZRXYLBAA
+o3MvO3yCD3gWv5mNPSpC1KrmpcIrIu7gUDEgv0YY6C5mezeRXwpLiPNZPeewg+gl
+W6qr13nRBlPiZaIQN5JRNDESPkTBC4k5c+QiV38zcqlggkzCv9sMP25wxoayI26w
+0GlO3/X0wsVZk8/x+corjT5ZAeT/9Go1ZUGyn3hYVp8voxbZoOfJYTOtLXjQ1i0J
+rDulxp3DxrCE8OGMIVGpzejOxQPNLciEUtq1NN9QESHpXTaonTWjP8ubT019fO+q
+Il8Uy1h/ElzAztTZq2gDuQ7//xQJ4R8DbDP7j0Qggpsm2Hso/Rg5ruSiX+1qBF+C
+Ohm16Dl7zoxRIO9+5RpanXm7g0qBcALCuIn2aQOMTtB9bA59I7fXsBMv4OuHr3bp
+xbcktqA1BpHzy4K7r98opgGpfZb1YyiEw6pAaW/VwQoV/cEQsqopuSmSngXtvFtX
+LPqAMkODi4WdS6/YySiEUkKdpe72jHamZUQwWrXc0CQ0M+YONXlLizOVDGCHj+it
+Hx/jqsA5KGnZ1X6/UqpwZLBlIJyO3JSXEjofIN0u7CyYspQZRpowhJA7EuGYCTCf
+f5BJ/FWvM0yVTk7yw1LXYvSbGWMWvwdbExADiWY4Nd60lVxFkopID+jqVF4ggCdG
+tSPMpzEZvdx3RnaCJS7A0Bq5zGKbf6or5u1XL9tf5tCJAhwEEAECAAYFAlOIrTMA
+CgkQvCNjVtBL3NbMAA//TmOk4SajiaXjGkFVSFseSJNWJoRbvvRtp6yWRf3O0UCP
+etroG51Rt2WzoxTNoXDpxPjhZdCySY67TX4anOKOZ/hz79MrK+zNDer4HoB9STfJ
+1IlZInqXxNhmJFCuTZM1jAdgUXybOyV3mLXmdAqtGOcZ/ElBWJSWWd5pf2dr2rXK
+JuH6cb5CzBv3GXc0euugVVm5kLgtlpNrWluLle+VcjfGyNtM/bgGDLMyhjV9CVia
+nBm2CxH5pZrt4Q+jYrl+yy+tYFV3OcIz9AzmvGm8AMp++daXmgirPTgLMVz4OMDr
+oeK2P+XQtKXwPBud2wmnQ4mahvbzyj/6elraGOtmC9tcFWZl7qTYlXiAwqKQBMCJ
+L0ktSUL0GNeO+FRUYR3op+iQu3LGXx9+1445Z5JyOr0ALp4XHCj2vJKORL7vHksb
+FxKF9cQMWFRYrvyPEnWChljM9GMuHPSzAFvzrvznXD0UWw66AI/VRGLD8obkK09Z
+BGOGCQnkQTiu2aWhuSBaDj+5YF9IXCulVhh527zpxfPjXrq8iBUAaEle5mjYQ2Em
+r1Eps8IvYI2RZ6egkf4Zx9tJWrh78M06dnBgRkvlDB3yNMjeOi/iY6Na/XVG6Kpk
+f5GcWEHd55ahCQWFv+3ohA/7LX/xNNjR1vUF7NmXxzog3Q2TCBW42gIYNWLmA0aJ
+AhwEEAECAAYFAlK0eNgACgkQhvvFGwuj4WSQGhAAvAq9Retogx1daVFgJNO/TOVd
+jHjGKwJJ283zN68BC3HRlXmjyDDHC0D3/Wevw2pZhlWUqMYTgEOjWVVqeZeePx6O
+qs/NAkAqM1+K75WifF7ccZPP5VWGapcZ2vTT0wghr4w2wFdnoaWBZ/NEaP1AZXcq
+HT4LkGX/Z93PLMqeXAoGkA1aLKcdLIlDL6ZPfVplMNlox+YQ+KprpiyvAkM/iwyP
+OPJvhdV7d92hFLL0xrf1dgBZNV6STeKfVwqpeM8O5V+hUpGJU2GsxbuKjb2tqwbF
+blsPHTSz7Vs/CxSZgApH7YOeybHHfRxM/8ucCVsWtSVpCWUz7DvBkGLlW5atRU19
+Wsl3HhJ3dap//k7qqpt7vANWiILtwH5Z2qy7qVrzcMvLzUKDCctzSJmoUvsq/mCQ
+oWz5XA2wcVbbONrxw1qny50Xha8WI75lK/PBQxw+yAaUVH4yr7g08p7+Hqa69VCR
++ihSQv8heTluMfZxsezeBpkwfEJMTrZC6j8R5or9D3vGd8AFX7tLjETpzctJx275
+7UHmY+QRyDwdog0laLzjRLgkbf+FQUOSNnIdfp+l9sGGxln7Lqyh7VTW3IrkDEIl
+8XsAdGCdxmRorErG9Z03qpL8v32/3MhkQoUcQOIyz/DbQWe3V+aajrZj/isIZoa5
+hMdJbOs0X1A1AlrQjT+JAhwEEAECAAYFAlFKdFQACgkQDuQHzesmWwa8RRAAnZGn
+mCCzBhRaDoamlJJWprZYnilvqi3IRoQTOMZ8mCgUBWoFkdb5rgLLPfy3N8hA0SAI
+QYzFeG6VxmxHO/iM/6EptIrivkedQXpTDEusz6l8/YSkTQ3Y2JaEf1mnvyo8psAJ
+esSR66QyovyqRe61RJH7jABcso8A3EJ/lRqbKu5dU6I2/6wiUW9h3lhxZ5SDv4nr
+VbfRChrjnE4ggFfLSFo/ZyWEgOr3vk+KsOrqya6mipI6WJAcoii5egN96Z5wHbqB
+4rPh3u7Py4TDGBTQmZZSkNmwpV1qX/pvrYqaJ9z1c3ROdqNxYbTxm4fGMrCvWTYV
+t5v6o/yAkAkxXQiEl0rlyhpNBWiC/WQChaNsaMpY5ir48t7AkXagLt7gZYONe6PT
+MEscr6q48alNbi9W5s/E8jnLTuXYwlkuCFKOWgSCJC5kRARgyAU9XwMgE0nqmHMr
+goYNIQOOSquW2M4SQTbcyYa2TPDTQAsr3soPG/qxeKNYWE1rF0j7EYFSL7dv6ini
+yYGZ+kD6r5Mr9W1sELkl4S11Oct59GlOIapOb81VhN8FHBl0GW9aPk5XVcsbyEaE
+uUpISJ2Gb0vhQfXQIbmrVDwo8IGksInSP+Lu932fcsmUYWqMDOCiaqfsNIeHHaqD
+EIRQ2pVRzoCVQ4CFixHPY+C6IOnKheTWTIaJh4aJAZwEEAEJAAYFAlKfX8MACgkQ
+jpm5z8Wg3wZchQwAzM+hqf0h+fvemcSGWbH78T9kGrId7Rbyu+/fgJMhMfLFJHmS
+DYeOS4uTP6v/9p9r5gkOSXT5NdOo44CS4Af/9CtOyPz4U58FuFM+RCy8WqLAswDg
+0GGR2XqhCIDOU6NRqfQqc++EuDLVfSEvkoP4iqJr9aeK+U5Xt6ieNorZtld5Gyyf
+VnjPqXWxXrKA2oCBYzsIy2La/4FDqTOTVVWWKmu7z62njLdWAnTUbYraJ5v59bSp
+arCKlzR/ZxN6gBWNO+dVUUJt/tLcOfkKmpvC2zQGKodAQkOyHng0rtFTTgjPmWUA
+/5OMIMqFgO+Dogh7ZU2sXGvvERLVZxPln1cjBQ6EeFm5H1UCkVP+ZdsDbCwdKsNW
+QWFKWGkLUt2hE+R4gBg0G7py+DetDICKbk6Z3AoGdZoQbQLqXXVv0Ox+o5Yhaz7c
+BGhaM2+Lv+AiMszkxDZe/8LCrWhAkLE493Y1sPXzxacmTGAS7h2UpB0BkT/r7/cA
+5ooOLpizAsf42aUciQGZBBMBAgCDAhsDAh4BAheABQkIbiygXhSAAAAAABUAQGJs
+b2NraGFzaEBiaXRjb2luLm9yZzAwMDAwMDAwMDAwMDAwMDAxMWQ5ZjY5MzFlNjVm
+ODE0YzZmM2IyMjE3MzZiMGM0NWYyNWUwMzY1YTNkMTU2ZmEFAlM/HUYFCwkIBwMF
+FQgKCQsCFgAACgkQf6sRQmfk+gT5Bwf+N2EvwI3crJ6MfuEklzrVsuK50gsDW+Jn
+Rgj3RR6jIKrNvRACUD+14l3sh675/X6RfzjmuAgJFgZmPenwckjNz6rakOGVhiUH
+e7l8/9TRaJLo/O4xW8cSjuJ9bnozrtwOH/5vFs2zMycxpgStl88v/jc6tp3mWlI+
+O/DEIUMPpYBDXuoA5GD90G/WuPu+1UEW8yALlKnT0F2yi03WuUPK+/hLK4IrYge+
+6nYESH7e1cubkOe6gO7wLyN0KA7NHGoDWfhBgf4hOXYMtYP0usOAUgARQ65YDYzb
+hyT85JIpOlDDVjFJMLx/c6mlgaPBV1bi7JG++v3uzyr0424QjKXcNokBOAQTAQIA
+IgIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AFAk+XssMACgkQf6sRQmfk+gT0
+ygf9FF3qxEEavhrvRigteul6ZmYk5JY2xIMDPcEtIO6Vu0Owcp5R8iY8FtWHxSYt
+4qISvEktu4S5ifrQDmipyG7sw/cuoBAGwZzzGkQo4L93p8ZWeFgaS7WMvZ2bhMf7
+JSD7P4zHGRsNtfyvAIm20ZYy9nisihqDwsHopyBwEWj8dUHi4Csp3FgNzaNBDKlQ
+MaePWzjAuqZx0KatZbOG2TVzC1J1mL88kts+9XwEkT4af+uKdULQebCMHulIKevz
+Lg1HEm4HszpyBzGKE9Y9zgwYfpcZQT81AU1L8slizHnOoPdiZJAqJXP1bfLBLKL9
+U2SsTgUAXL3GANeTM4N/XzzPXokCHAQQAQgABgUCUy3cVAAKCRBgtDFx2LpfQac8
+D/4kXKRRhtT8U+ViibJHXE8/MpGIqF373wbfs2y9S3D+kd/JOxC6ibnev2b+Wq29
+qdMk6BcyUaVzP0dxcnJj2CygYl2RD5dfIp8PzSilTHNfXGbJr9xPTcAjamXhUoJZ
+p8/C1ODwf2y11EB8CLDVVZmqgtxUOJNfh6is3cfzbYF8O2CX9ai5x9UykV9g////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////4kBHAQTAQIABgUCVK48
+ZgAKCRA82MB/C1zhTgoVB/9j6/khep6CXjyIoghxycm/4qhuCs2M8kM6G1B2W0sv
+lkaeqha+A96lCS43YoaRWkto2k496rrHfoC5f/8Vb36nQS7hd59DYANbtr5KJzwf
+yYsP/7+bkaiuC1E5SqmHjFiYYe7enQWdrcbsDfj420ScL9t2P0gO3vKJ5S8m7hkc
+a4OdCmYJkdaYxJcHK7BC4vkJmbxfnmmyGJaEPP/oxNCeZiyL37Y62N4DqCQpDj5C
+Ngk5w93+6H4oI8CIMzWEQZt9bZ2k9ipGobYhaLgVk5UMWkVJ8CuZESCgHLCuz7hG
+gDoDmXTnz3zbp038QPusF9zb307DEsWq7XwJB33/ljm4uQENBE+Xo6MBCADB0197
+HdK48SqvipyPB49vlzfP6KHfcACZCg1JTqOt8KRJFwTP3PTi/GJuUvt4io1UVG29
++3e2X8eDbrxufP0YPr+0IbTE/EMgXizNN28Zf/VIR7bEv9oFXfn/4L3B2L8rf61v
+w/W/u2b+z6MROC1qgWg3nOG6FwgiEeiBTlaLWhuwqgIdp6mdoOled50ym409o5kD
+6nXM0MkqLOTMJTKwrYipoo0D0acLtiBLzxXdYgrqxT30eIxvMdkaj3mC5mNd7pHY
+Sf3jQ7/BWAVkccRm3o2e5F8oDEe6dkWYODjbKAAKkn2B9GoHsROaqeYdANd5VNiF
+JIzGWTCGkN8GjNEVABEBAAGJAR8EGAECAAkCGwwFAk+Xs5AACgkQf6sRQmfk+gSD
+Wwf/d9jJu1Ccx2SYJ7tlJgumKiHEpcxg7WIn36d4u/HHtMSLytUEodOCqqdiNwOb
+cv+oVs+KftRXTNfcnAvlXAe1CyVED7aElAq75Fj9+oMVcFMwwFxZWNpApDErnahU
+WbDI05+Pb152HIO3WjqGPEYDYMtsLM/RhzGgISOCup7sghCJdtnlDURq7GRGe6mC
+uAwPU1ymGsMvLd9ItYOuz4ahK6mgpE8qLfTG2J1aK5tOQKt6UdwHgmwQHMjZdc/S
+yzJdCGs+AJl6K/KQsyV1P/Yoeje516oqAY9ry3ziyAUpK7s69Qf9+d1NQ0pfub5b
+MnnKviCFj1rqPteRl19IakRInYkBJQQYAQIADwIbDAUCVNs5TgUJDqmXIwAKCRB/
+qxFCZ+T6BA7iB/9CkFOtlY+bVc6Tz+B2c2pvZ96qdE4BBGq0g7ECWwRMMBB0/YeV
+T2ZN4m4nRh/OsWNMAYqPd/D1g2fKe7fYFlUPa54iEaDxtbKEism0xgHBIpDn+GiM
+aXNT3Wpd39UDFOw6Z4heBjIvuyJGE1ELIdhl69EdnwYsnteSVjFECPyjZ207/CaF
+RPGNrHkZEyEyQlS06GOE+qYB8T6XscX9MP8IJbIvlSPYgt5YdJ61I6UCoWPQClwO
+9mUm0cyZ8CIKMZjQVLE1xo5hvZpQqsLsuex+e8A/F3ldlLss+4uZn4Yab6SbG4iH
+xrTHKTHDZ4IYKeVZWCdlQIxitR1bL3ccFhPyuQENBE+YwLcBCAC6c+HNLWxxCvPa
+jXPG8qEVJUd6Kh/pc6D76aCNfB2OyVSivEV/LfySUdhvc+a2kilQ0kNPqv4yNJBn
+wQP4JaKpyR9oKe06EPcZLVTA6xqbSltr99br5bErnvUHFGDBaREXNSRM5sjfrHrF
+5sazDIIKrtbMbukd22yZjYsqnR0Os0wH/OlaAFTDu57jwTab/Y3CMLR38vt58xdi
+btiwnvxtzRihnuvI/NXCASOW/tPAYFfwQocDzYwyoTkQYiFBi1x69pw3f61f1owS
+Buq1WGX5+OptYMEgI3o4uh3WViRe25Lq8M61dOvRIJeHy1kl4jraF6zw425HqxnF
+Zdl4dtoDABEBAAGJASUEGAECAA8FAk+YwLcCGyAFCQHhM4AACgkQf6sRQmfk+gTl
+FQgAm1AunWt3iV4Kj5SqBv6hsTTO0XTaakeEmBVsnmpkYzJtICxDHtDMKZmsRm1Y
+snouXPJXXqsiEldNYBSGC/OOHAKniB0Xk9CdFRltacfGRNNCX449PFj3McwnoQoN
+yWcdOb8iUqgWKK7GVW6Xu54PNEOrTjjoURA+zM+oMI7CWjnpPxikrCQbcMTTWbWh
+DbpensTRxugTjNhXi9LxjD+8jYh4ksuyr1twv3lziG/ANsBd/o93ijfAnXihVVOr
+SA15aW4PWJ/thFM48dFHq0K5DYGt6sjomAAbtN8fAwQ+1vUVqEGXU4Eo4IFYTOnT
+hCG9sJPxroMUEc2TPBnmmZB9TrkBDQRQj2+7AQgAvJwa6bNlfgsk59sFherq9p2v
+LMuAIAaf3e6S8tg9HydSkCu6S9amHFtBqapAAp/eIM/VSvkFRnchwBNn3kL4KbPR
+rRTX7dVzEyyLMz2NM3s7CXDe3VlzEo957ux4KRCsKozmS+0gzEqZ5FmMw7ykeu/G
+nS0WOKtPzCfhDgmN8Pdvaeaj0lboIkjyu/5N83MXWINLJlnGSKexBvQKZnrRywZ7
+c0+5R/eiGQtQrBIZ04yORQlqZONaNEf7bz7oVvG2DPHJLx6hwe3TBM3/6k5Y6bnU
+MshdX/Nn2hy/VrCvgMH2teq9ty32ToQ0p7UKDAn3BXzbZKq6MLDwe8cxsmF/AwAR
+AQABiQI+BBgBAgAJBQJQj2+7AhsCASkJEH+rEUJn5PoEwF0gBBkBAgAGBQJQj2+7
+AAoJEPtkWbB8tOHy3jUH/3sR43msmX1KzodWhGZf0SPUTasRMfjz5c3nyBlNcQHC
+8v6a19TCuYaKLHQI4Lzif8VEoraG5U4ITnQjJbK2QOPfuql5ICVx/S/c6k+we5uo
+ZoJ9W2UqZu6zeXLOYegCGwhdQI4GSmN0dvT2Yu964KNpYf7HxLMkY5Ra+fVxUWpj
+0E27ngJBcWSXmHEtMnKhoV06H3wAOiEOJ/KNkgIbjjmHTN3wiByb/4wItq9c8+gA
+xUKwA4BTsTADZexsRh6kL4B8IEtxrLiSdeFvoRyL73QUMKeXnzkBtQ73Gw5h7BC7
+l7HiYxpCfkcSDHYOBDIQymtL9qyQehZr/2yAK3/sm9sN7Qf9FSoq2b2W2/j+MyWZ
+yRxMdHXi8gye1v1ITSLXsK+CH2svOGh1DLSpkImn3ABkOhgxbtDCG6dr84omjbkk
+vRqGgi85AK17ykTn4lfqbtC1w9BJCmA4XRxb/fwQ3/OdcNr/OI0rvEk8G7JKlKfx
+qiU8hFImqEIRWexsZkUg+ycssaV+iI1esmzTIJ83zCYyt+7EhVI2z4+mpSa/ThtA
+4MX5Ukoips4pquYT4cRMnMT0Neox24bbFrVnCj/pO5w3K4HbJDUKRXfdbXJzlq8i
+nq+FhFzPkN8894bfG0mwiGMw/GUIcBga4ra5lC/MyJ/9jUoJih9DgawnUAjUkLRS
++bqLG7kBDQRQj3ALAQgAsc/av5+YYXnnPaghXfovRZ5sq+MnFbXIId0z6pIQM20Q
+NR7EOacZKTDEEIo3SpQ4lVQXN2Iu1+V0aMEcy82mZIc5dApb2FaEbY1eBU2BtI5V
+D6SMK+AEtu8kJSql899fgOGMtwkgCyL3MVV5nKadsN9fCbK8qtpuZvelH8J8+STS
+x32+SGxTbRcJe2ubmLlnBM5tQj+iO1AnsRCLu5v0SmlWmG0Jv0T9POm6w7+DdYDH
+1FwrMbR4vAukcvOXCcESqG1lV8fsbu+067rkYvKKHRsCP2XFre6wFUseFo/xHdp8
+kxzpRMze/X9a3s/utNM/tgaC+k/HrTNK9sJMrhNhPwARAQABiQElBBgBAgAPBQJQ
+j3ALAhsgBQkB4TOAAAoJEH+rEUJn5PoEEg8H/0r+OtuDsx5P4KK/Y/F5lQL3/QT+
++AG+abB3oviFyN6QlIpuWQb3Qe0oY6x2l9ZOOyMw2ACXHTBZrSCBMLCdbEs+0hME
+ktjYytG13IyJ9plXiJw/CcntAbvGL6hrCNaDApht66EVymODhrbFRF4CJ2wrOiKB
+rn039u1FOZ2pnngJWvAQM9UghGegSBFtQSYVhNj3KUrKEvw76f0wT6KACfUXutKW
+yQPQm9oKmxGloNQHJCazFP4a2FNNdJSYpkAFYWJqYK7k1YYGqKf2qP6870H/fjCE
+X8rdwXMcAOo2VGgFL2ZCfDXyDkb+a1PP91EMp5V0VXhWSshA+JGfRQb0AfO5AQ0E
+UXc9XAEIAJqmP8HGUdTYvSpUAfRzUnEMmkfIyXe6AldRt9276T61WcqzzG45/v/3
+JFguDy4kDHbrX2YlUST+1VJu8S/Ym3LYon5T1DaQkMmUOM49DBx2p+divtQK4wex
+OE7hn9MCHI8xdSj372DIyxfAa8OIU7zHNgQWUI4+b60BzqLWq3eRc5Hjb/aXXf2M
+jjbxkl/RBZjgMSyjQLz5yD0ChjEo5RZ+0PiRu1W5qiXZZ1xns9o+LURKiwBQjxD4
+BsQHO0VJf1NSp7YMDBG49zzOAVa6/MoLHvE2ruLIeVW8rCZcpArwW42apypxMuKg
+aCy1f+3LWJQFuolM3zdRm3B/RnWmmKUAEQEAAYkBJQQYAQIADwIbIAUCUxvy2AUJ
+Cwq2+gAKCRB/qxFCZ+T6BIjjB/9YEVYkkEslEZYu2IVsIuwBv4Yr1eytomK0clHc
+GSNTrZxAUFKQ7vrXShujxZLXUiMh4cSN5OM7JBeRli6kPwcVRIT4V7RT1yXyO/6E
+F+antL7Q1ZW4kGH8pGP2Mt1q7sBqQbAINXdOYrTEv3oyZF/HHrz/Ydc7Cg8dGlb+
+fG2s9OtgLMN4vQQcTeXZOvGHmBoWXB86RqHkRSfyAhUejfda5GhPnPDauCOJ0A6T
+xCSpiaz0bMX68UyeraSvNASn9Arp06iNkqorX7PRffAVt4jkmOTSxMHqzLWF0HWD
+ijMlpoR/+QABJc5XTxJ2JFHyYmQ+2jq1BhZVjCKrHq8SeeA8uQENBFF3QaIBCAC/
+/Wgm1yb0YRFczK/eD2kfCpU1a35qr30LPl/wCoQcpZ8UyM0V0waBm6yZjXWXK6DF
+wKhfHog6glGxXKLBZ2UM8M/ZQxV5A6CRhDjQta1uLEGMFY9Ju+52cc8OGnKASaDP
+r5dJXfzUtjoThBQtsV4zi6MfW8F4x6t1qAw0Ksnth7llS/xDbAn+iZ7RWfKwnVxw
+paVykvWrUnkjKY0161mGC/Qrw3396dZRyVMtf7gQ5meL8VjSDLb7Yl3FW1zcEx0x
+ipZIQgziPAkSsqPxuSXIjvVyzj5nn7zy5ERZ4LHf7PJdeT3OUUk8Gdc+sMF7TnAD
+tuGh9R9vxpVQ99ebXI+zABEBAAGJAj4EGAECAAkFAlF3QaICGwIBKQkQf6sRQmfk
++gTAXSAEGQECAAYFAlF3QaIACgkQJIFAPaXwkfv79gf/ULdjmZw5G9ZPeSHehuI7
+ED52UBa+eJEuJIV6bdcnqt3YxE/rXrzHfNQXU7OY+7kI61uY14igPNRen3kyq3kq
+WkLHb95T4sI+N2A6s1OMLx7DHPxNSQNiYi1XhXdlbvJvgayU2140Vj23dpoL51nx
+3yfjkIs2LAYI7N+iIDKOlFH6U/JjBHFym7vOr/83ntfeJjJ4HTBUnGqjGPpMKuN0
+uzPW0eK3seHJ8Lrh65gNr5Bw/Mwo77MeVpIXQZMjELcX6ZK2QnYFRQivxV4iQ24u
++DqCJcmEb1mwibMbolZ2KuQu7uPIasC7+niMHBYlDdlOavEfEPMzY5djkLEbHEXP
+dF/TB/4672k9hootVEgxdupIdIdZ2zBvDiQY/rB957AJQgNp0Vb7KT/T72r5Kulh
+tVdGSeeFYiVUOdSV7JYBPBMYHEXlHJXSixdSzyUqCFCGSdigzuJ9meWmq3OFpPJd
+drHjrEwB6INVPnV75cjnpNDVnmX6xtwdJcVaKQFdt3+W5GiKUDH8waGJ+G9aUKhk
+OPBeCGdN2eld2WbFDPM3XnIxZknYqEJOwwYSCwlcn+fE6rNlBQLtBacVEYK/q7zA
+hLTZEVlXuNLI8SNKn7+44RCWnY4KE8/5gm6w445T7jEX/Z4D8hQkRabTIOjQk23/
+84o7mLcSW+iXTdnoBDjoCloqgZ9/uQENBFF3QfUBCACo1cRwLB0IHW9OX0eKHSCh
+KO/xJ5aKUCKBJYhfJz3/1mVsZQOIdox8nZiYPry8sQNfcXGHd/luWPYr1DA6cxdf
+zpkGtTZy3UptTY5JdE4rs3GYpYhNmA5qwvrfqWODfZtFeJyKr7KBCrC0Sdnluxh8
+4l33Cz1tOpkXBQB+RUQZQVUp6dKxx5Tqa3OBgIgRSav4xLeGJPLWWyWKHSaVmbmP
+UkKXHQ4cx2LsIrSl3O/EkdI1izgXegjrqsKkqiruwCuhJGeBw3thEVaOVXsRDCM/
+sQ5lU0TkOBdpt6TVAZCJsr8f86V5s7ZxVL1gVy/rXuSBOkbW4r+XE2pYwfC6ViUj
+ABEBAAGJASUEGAECAA8CGyAFAlMb8sMFCQsKsj8ACgkQf6sRQmfk+gQIHQf/RUIR
+fNLXMS3+In/8FRX0Ilc+gOivpnN11TlZgxvZrxIZKz5nPh/cYgFumAFOP6bFY8+w
+IemulKZaOJ7LLNmKTjOZnj12+S76emwpNEduQajYMDXPtHnc1FpF2jo4tfOQBO5h
+7z+UJzsGPO9O0pkYPxO3h/RS12R3uyvVE8Ej0w/8wiPFA29QgGf3zBRJ6GK2rAV+
+N/qhlMnE0agSy2+cmZzPDe33gtjLVZ7YmVp0YxbKa35DtvukhliGKH1cqkLKUt6Y
+ytvzuckpEQPEtI/7KTYmCfaT2hlOo7uSfGn9FtV0xzlcVy0dMk24xKllyeyeennJ
+jOuudVo5CQFRssnBDbkBDQRTG+drAQgAlo+QtN3XwYnuaRheTFnOLD7h9XBqZapO
+DwqQbod7MXZqp4jEfGqfQKleL0Xs9Dh5I66Hhwr9GIuciVSQbSEcqBEznHJGM6n1
+ssG662b5a+W3WC11SUGpuZJOUgOEHVLgVqSe7td8w8bFD841kfPXRTYmtNgzki/K
+RK7FFR1M5C5fBaQb7KGH/Cj/jUKKS9EwrMTW4jQxdcz881MFOGLM9hB4MCRXv+W4
+yUGqXurvFaEvYzVrYF1XNJFHheQ0Iw5GNUGxk0+F01kTBRNjJ+fnu/G/rIkHUYAc
+E3VHqsd1l6NStMwn2o2a+po/xeS3CIdxsRBx4NYepBrZdRjUrRzNiQARAQABiQGE
+BBgBCABuBQJTG+drXhSAAAAAABUAQGJsb2NraGFzaEBiaXRjb2luLm9yZzAwMDAw
+MDAwMDAwMDAwMDBmNGY1YmEzMzQ3OTFhNDEwMjkxN2U0ZDNmMjJmNmFkN2YyYzRm
+MTVkOTczMDdmZTICGyAFCQlmAYAACgkQf6sRQmfk+gTTNwf/XK8IGaPMASckFU1c
+EHM8ruYAC4b1wzzAY2733geJJlIMd4pYVhPWcczwMozc2AWJrhHzMS6Ho/r+FmAQ
+H+s0csYdhw0hL8w60bPXHSWu9wu6zlUJEY8G4pKjisEokYY7Aje/oEGfg8KJLHXA
+hYrPauW++O/NFCZ6ZNimFf40JRSjSUGzTKuBYW0/25dfV017De1XZvD+Qd198CfA
+9ojvBP2Rn7PYQkCMYA7xsViNz+tD0eC+BRdyO0cffCzoOOHHXy/1KSOnCry+JReA
+jnpviOsUyfY2bqGsmOpxyo5VfZ3OoHOOV7nucBEmQojuhl/xvU+Lc2airaR6UIAm
+jWDWrrkBjQRTG+GcAQwAk8T4liMdVQMjh6WFsmY38lEGu5FxirVSrMKjVQAq52XO
+l0I2jc6zTdqzyinW0sEswcQhmkTANzCspaU2kIBr/QVbdtPxPakwysV3RsqHPlAI
+rVQIdBU7ENnE9uzRzJtZfc5m+buknQ3MBjMdXlAceO4w7i+uhu5zXW4tSVwgKzhU
+uy1IexvK7ni4EZHzsOAarFbZpHozUqNZol7ALJrWkpQWqjuJZEIN0vefgSf3AV/r
+vGFlbI/PwEWDZlYlwDV9scuHRqqu0S1LArcLDmf78vnnclZYVUNl2kaVgRKmu2ra
+CWCSctmkyC5rqM9Xj+6B0ZVxhXReqfCnRn06Zwf7WwJuMWMfbAfZjDbksIMgKWpT
+/8UrH2RrI/6b4w5hXa7/C8zp8H109f7xcRgdLyj748P0bsrrVSfUWxMP+XRRGPY0
+4spkhNUVFlYc2BroIRXS+REKuI5WfWnUeSNWfAqbexaHRSgQQIydN2qp2sSxAe6Q
+FE3aXZyCHC4DMqIlUml7ABEBAAGJA7IEGAEIAG4FAlMb4ZxeFIAAAAAAFQBAYmxv
+Y2toYXNoQGJpdGNvaW4ub3JnMDAwMDAwMDAwMDAwMDAwMGY0ZjViYTMzNDc5MWE0
+MTAyOTE3ZTRkM2YyMmY2YWQ3ZjJjNGYxNWQ5NzMwN2ZlMgIbAgUJCWYBgAI4CRB/
+qxFCZ+T6BMFsIAQZAQgAlQUCUxvhnF4UgAAAAAAVAEBibG9ja2hhc2hAYml0Y29p
+bi5vcmcwMDAwMDAwMDAwMDAwMDAwZjRmNWJhMzM0NzkxYTQxMDI5MTdlNGQzZjIy
+ZjZhZDdmMmM0ZjE1ZDk3MzA3ZmUyLxSAAAAAABUAEXBrYS1hZGRyZXNzQGdudXBn
+Lm9yZ3BldGVAcGV0ZXJ0b2Qub3JnAAoJEGJeboN5AaHKDGcL/R3/aZoKC3OgtAkb
+o2g/ykbMt8pIko2cofAB/3zwl1p2qvwO3QV/vTVt6y4uEPEHItaFLiKTSH2KpTVl
+YflOh4M2/LXwXQmOiixpyDY3w42R6AZqY4g6q2SLDpNQLWaxVOerPgvDpSkIbcwH
+j8Fvai3Mrxtr2J+Jq3KW6TQnW9m5G/j4SqmQ2sRfkl6EEHiGcZp7pbKkE+qYGsmV
+HEirfCjlf03N3c7zcs6Nic9AEq2ghcnLwRAqmyRU59wOvIHlbQtnpJ9TI2zaOp2n
+U+4wOVkdolzN6TfPPLwATXsUFlQRS0ygarQXF4ifZ55MGZ56pc3GOR6fEH0FaUbr
+AhLvdN/fKOpRkQ5ITzxY8rP402lP3V1gAInRaEEsXKFxnQn/sCbLgi2dlaiqeErw
++Stz8bANhaS7uja4KBG00aHH87IF22tKsC29q5USR0axfEAaDMEaEJxtE76HoIKR
+CovUoS2TfBJHlJOqzuQR76v++QAjqgELbHqUudhv05yQ18t2otJ8B/9XusAN7sya
+dCI/Kkj/A9WL5ky8Jh14oSeuIq6G1Q4WN+BcYAtGroTHlo0zMmQlkBfOb1Ketu4o
+KWoDQwPUle+WsdRv2GklAURakqqjZWCeV2JmjfNML0MAQ0iF5g5W6BeSdnTVfBNG
+Zjq0lD8d1+fVuyWQ/Sl9Za/dfGemi07X4pN2+4AWk06b5XmyPyreoheFCBIFRNxS
+UJuB3HOHx96seBv0JPyYZyWqomJ5TAxubK+T+l4IPebMEM6cEo1+Ut+vS2xG+kuV
+U0hxDZFMkgjD3a4Od06MfUPNhxIXGFoPTdESXdKDsiSykr6B3mkFX0XSPtfrGemY
+SLuZHeehD4iXuQGNBFTbQXkBDADPxI2gCAy4SYLcK/I4hoydjmsXBpWHmHZZUKvO
++6GS8tXX+IlzxihQy8Nc7M4hL8RjBBMIqiF4ogEqNvIzD+LWYM3+K/Q7Zmsaq77l
+iNS4BXUn1O/3n8WPNCJIAPf2ULzZi1ucVnTCj3AWxwikhIZnqV4c3Xy5pGpLRbaI
+pg3yfLsQYHlAW+Eg3VqrX4YHgPGY5p42Qo2VejxO+7q7crkDd0GsCcGyL6MEVA9F
+pnQ1WugmWZAlNfDNeySdYxwaISIvesVhDG4LvU3o7yk2rTOL4iDNGfRTipLuZ8D2
+3EABz5QvBIOqrV0o0pMfGjUMXSWPVeSuxnvL4+atE8bapOJIZtxYwcYV8cXG0HZw
+zvbw4+wIw2mSPBTpKLDMc7m8l+yq9KhOzILRHDSPEt3z2TGtK6oerKizOwKhX8dn
+2PspUlY2RmTAauvqWOYeg7aEX3DmI03Xu+eVpjPZ0jj15+JvXsa9yI0Z8gEggIbw
++T9KzGrXv/nSjTZ2630HIa5bxI0AEQEAAYkCxAQYAQgADwUCVNtBeQIbAgUJCWYB
+gAGpCRB/qxFCZ+T6BMDdIAQZAQgABgUCVNtBeQAKCRBm5IaDjxmqELvbDACZfbX9
+W5ZwPYRbI9J4+es5Fu2WAFe8WcDNZLfyFZRe9cCbWsxtKicmmTkVpVSTHSV8+z16
+WeOuaGh3dl6Sd3sfKlBjVSMjTRWKEGJCSAAeTfL6Ag9BR6/r6Bj0nYQzm1Cga9/y
+j63YZfmSiADS+BGEVtBVFkspYHXLi9U1UeCjTj9qgbN5eWGq1fOIJ7EQ6IVMJpgd
++/PbFd5J3kjeFl9Lageu7PjHgH+vAnmw4jy0D19DwO6pQduc6tWd/8WcWZHVuFf8
+CsJA82sk2B1R+SdYbTU0vljCv/vRUPOKM3zzap7PADpYLf49xQTYp9uYmLvMv5m2
+0NagUXggdJ3XN9QipBAZsKjp8c0HdW4E0YOt0G1oHdUc039Y0yyMvifaIPoHhA0B
+cS7xs8bmrn+IA/oFiEnB/PUsFEL2fPSA8+2zSVoFGZYoGqbkPScNA+uRZmvqL6W8
+hSMXiE6/ekZL9+AbIuP/BRgcu284rrmu+KDPbz6WlWEtPbshfLWbFwE3YqElHQf+
+L7g/C9tTZrb6kuYOuKC+JsTiYzz52gniEf7ZXJswxnXAkkVy6tvxn6ASms/VWmEz
+h7FCncQRbTFqy4+4c2fxSWGhDBp1u10/HNG/66sd+9vhMBAvLBV6FeLhudDHHPVV
+UvzN0vlC+FuhIHkqGITkSBgXGAgCR1KQr1ixTT6vHRtbBQLqNBR7e+fUyzkFja2i
+ynM3UfDg8kwaPDUNTTLRrACPsTq7iGUHmnUiLUYK0wKCqXb6O17tiX+qozcholyz
+OL8TVeXVFoWmSozEgVn4j5rK1WWFSwa0ua5zQC7h+TuP1+Se/SYqn2ii75eBK9Y7
+/5WVebk6ur71eH7eIWk+XrkBDQRU20HWAQgAhOI61Edm8YCDU5ZwUy8FJWLS6v1C
+V1y5fEdne3RGH0iyP1klfnLkF2CqVZmaa2NR6UcT/vAqbUr9JKPBDcJvYUhoifIJ
+3lzG6tOfTLTfxongUdzE6WlNlMMjvxDDPwQgheECP4f4UFl8Sy/EVn1akJ/TpVoh
+cDceCVxCjLPnJPAbTu/SgEo0YbJxMEb+cv80fyJXgMc5uUEfTVIbu6/pR6A2NHFE
+Mxh0F5YIPu5IXH+by14ckydIOgJzOjp2usZBkqraVUOxzeE/U3D5HZ8IBs0znsAh
++xg2zjR1ppu7WQ8nKK3N/pMakivh7x4Za1KXq7IB5wlIR9Sb0J7kABZe6QARAQAB
+iQElBBgBCAAPBQJU20HWAhsgBQkJZgGAAAoJEH+rEUJn5PoE/8cH/2ghYCq4WTjr
+n/go5mC+USMTsdj0haMcZRoOs5+PP/eLpqWJTXNbFGjyHIKLGUvUZSsLN/V41RJK
+HPuPdxNzvo4YndA/LwLJPl+MLjM+0bgiIUJytdui+YonmfS/TNkPajCrwE2KqKVs
+nIX/W/w79o+fWxppwLlEsQ2kI+zMqFi600azfCDUwfy1ti+sC5F/ZDsGoDgFpxV4
+Ao3RaDb9ZxOLY3XPERRjtczwFAj1bw8ZCNyWv6DdeG9028/r+fAjZqn8kz1Ziv4V
+WvnBgkkOLTkNmIkey+CJyYemo1ks+x1sgQYspmnv7rkDRLBL1dg9UQmeRvqB0FsH
+vOq9VY4ZxTm5AQ0EVN1LOgEIAJBvsHt8coDvBL6bq7A0QROsGEOGE2/Wd2TgEdCA
+eZeKMseUCwS7ssJIeYciRbidxbl21fyNVGuKuIz6JMCbS+m4Uv0LKYhXKdVkfkgb
+9TNCXm0lKbu5GjOOYsfhdRc4FJUbrb8ObyfDoySKMEOACQY94FdR4wjLmdvvmyb7
+YICxar2KFaYSS8joKXYC5PRPZInHF/jhI3ODWjoZSn2Rg7ARN+tR55jx10Ex/4iX
+zRd5cax418fG5rMcv3Er8kOmFyremIsASH1E1oBm/We6jyowfHBrp2dy9aobR9GU
+jwPh16GBaHYQeXt0uJrr83RC430dFHsrmx8svbYuYevtwvkAEQEAAYkCRAQYAQgA
+DwUCVN1LOgIbAgUJCWYBgAEpCRB/qxFCZ+T6BMBdIAQZAQgABgUCVN1LOgAKCRDA
+hfIc5/S53Op1B/9+JSyXipINM6qEMEAj46ea8EpF6p+vFFHJH2cq67ILc/Doznyd
+7pogxn7QFCrSDfwoxEU1ruDM+hcoxQBjYSQ1sxu1fCVBtSD55V1AQBp6xz+MJb33
+ISTEBpEqoAstxW3WxsUOa/zju9q27C/GsX1uU6DW/6NE2FhZHDFwxqwEq0ouRcIU
+58nOkQkOUEfC6FLfU0H+kNAWmUQcIUPdVwP7J5vxTqnsXnSs81QHdkXOY8VROSfD
+uIHTW9ieTe6jaZ4NP2IjsTRCbSoDvspjwg/KGPG49b0Z5XCvo7p0YtkNgYXjAlRO
+mGRc68/xTacMEb1cfiSFpdzTakbrrMBpkV23PGUH/12R/oqjzkYJzMVLlhdgv8NQ
+wII8mWE2FJwFzC8w5jL1uYSE1wjuuBQcf313F/KdiTq0thw90Wh+mIHJ+7vTQhBC
+HFFgpxfXPxXu01J0wCl9XqztV20s4WBXltbubPX1xc2QBNSPIqiB8s32mMiHKNvZ
+owxFZMq2PyZ0hB1W+FK2qbf8pZf+2vsEuqLj96ftt17jr2BoyytQeboYennOMgYZ
+UtzuhpOAhyzzbCOxc8O5+OJOkYbGtCZpl5oH94fvKD9BV2hzGm/SemJXtBUAIu8I
+cuKonwxwerdCP3ftxT7iZNU1op4sZWD3qA0jVs/mbHhh40xo9ZhKPAaI/Le2nS65
+AQ0EVN1LrwEIAKHTFbesEf27YWIBN0ZDphhLp/jHkFbDhx332zPefH/WD9QRwY+w
+F3CHh0IYDaa75cq5LCHFRdXCbZ4jXGnWomNlKtfs4XokWYElDL5MQpT4zbtFYhSK
+seAflHf6Z7TRK/nplmDXs82J/NNen8Ati84Sqb2CGCkD02SXVBrWJBTFyGzkJl6O
+onoZph/RSt+rXBKFYI8m5csHwwQdZRYk7FNdIHmvb9SCVPq0/FD4x0i8xNrGws1E
+EGBp3lbaeuAPcFoWUnl9NNckp7r6hX8TKOUU4z7+FwXY7xnZd+h/I675MZ8typ+r
+PSpw2hgp4s1LXNZRBer5K+4VGPdfRH3sBdUAEQEAAYkBJQQYAQgADwUCVN1LrwIb
+IAUJCWYBgAAKCRB/qxFCZ+T6BN3LB/4oxQk1UUxIa6mKdRUFjk0BUc8pQsNWqTAw
+xL+OdUSgZOgr2JCSICSNAShI4226tTkfGhJyp+DtzlF2bm78LibQI7PArzxD42l6
+93XtkHdG7MqBxsjf6AGTm5c5fJ76jbRMAXu4MBvdRe2PJDCCl2D+YEJzcu9lfW44
+8CHdy8ta5njgtdc29+S+2V904bgc/tYRn/OscGe0Hm1CeNn9Rzs3HrOG6Of0kJ6G
+T0ipHSIhttHTekpYFlekpHjhSxvkDEb64BFyj2YBJSmX4EhQVnTeQUIfz+mDmgQ2
+w0qGnckIQ73fP9nYhlsyjiqbxkzOELDKt73ZTI+tIyOYW/sbX2tP
+=BHZ+
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/contrib/gitian-downloader/prab-key.pgp b/contrib/gitian-downloader/prab-key.pgp
new file mode 100644
index 0000000000..0940d15c6a
--- /dev/null
+++ b/contrib/gitian-downloader/prab-key.pgp
@@ -0,0 +1,29 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v2
+
+mQINBFI3uQUBEADRjbUQb65n7sfjT5OPnjPO8oUh5onKjNALRGHGJxWwNkwkgmT6
+mZFWjikM8B3ONEp8MfTyoOzv+MbWuBDS1GZxi0Tcb4HU323/7hhwfXV4bcHif7vq
+Sc1ahN/5LIHj0htC6Uj78IWXW+kPWjX9biRJnZ9eerfA/AatC+4KuvYTjAa9uAfa
+BnAs38EG/7ryXzxdz6M8iNB/YjHE72swSH84uTtA3LqI3huVY41eFMK6qXFBMFiq
+H6bMx4pjwKzJj78bibXEQxq88yc6TLxbURs2GF4s11dr7Iq2Y+6FHqX3PfUByZBz
+PQfbEy1Df4RbB3htCBv5puETlqZ0PVe9/B+WrcnaobxrbKEAqt0DspfoveRTIL+z
++YDs7FuW9TFBmd+5d2nmblHrNm8eEig3DpOoVetuuXsmDy03Fwao7hGkva4P3xbP
+H4/U8GaxsfNzuLvEyy+dtd2t2C1HIxS+56r41/vdb/9rvGgEQuSr0DVpZIW9en0f
+3bek+H7/qRCbXuaiBACBvOKNror5jtTeXTvnHWMkrOItyGH9pwR2Lhhv68JQS1jk
+e3pwVRzfHBz4wQMHeLIh+blsVKCIjytBR8Rq36rsmN1q44/3HwuPW/XP61kPP90k
+dKyPF4Qa+EoPw5ON5nr3lWy8ysklM79o1NmpyqNT4UjtDDBSfJtX82ct8QARAQAB
+tB9QYXVsIFJhYmFoeSA8UFJhYmFoeUBnbWFpbC5jb20+iQI/BBMBAgApBQJSN7kF
+AhsPBQkDwdj7BwsJCAcDAgEGFQgCCQoLBBYCAwECHgECF4AACgkQ0cuiohvNiPaB
+KA//Y6h6r8vUkA4/Gl2ejMgH+/DAolg9dFD+KMjQNKw16g7WzFNNS05T4RhcfZDT
+mapAW2LOUiiPVJTacmblyFp2hXCv3S+DESQjVdz15pxMHkt9fFteXGyJyrcTY5pR
+rZmjMD/9Twy2mLl5IH5ms87p0TN9HhM5Ux+B51la+Uq1wMdc1PdPWvGDeBVxCnRI
+w0224M5u1uHaMwMDGdz6sXuCuonB7CDGL9Z2+m1Al7t0peL2QdKHjv8S+SKM2rZS
+bRJyNmmTSKFQOTb9e2Ve48NNeaC0usEf8ttsygclps0mDpoa68YSY1LiuwVoIxvd
+S626eDqgmq1yyz0l3gQbYKIUv7KvRDnYhqIEkPZLCOwKirm+I5vzXvVIlfoNRoyJ
+VH3K6MJDSpBEerYNWHmUQpp7cLXIqVtako7IgmglOXQ5XVRnPvlOt5VOqQnNRTdM
+nd/FK3n1TbUyNRverODSpOS6ZxdSSwLkTycTtj1SvpLo7laW0HQ1ofJfwzVmOq8s
+8aWWTwBBC/X1UNLL/rsZMoHeUpaKHF2HSK5XzLcwqOBPRTMY0OG7vtBvj4G8clht
+A3uQmmCMr6RxsPPYPHPO3MnMpY2AK6RRnNZg5Y1Fu+/71FAuUDVTxmI402yE5XbP
+ILbJ8RgsrTVgeHdNhp9or0BdsB/wwMT5intkCaNqwb6eJag=
+=y2Va
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/contrib/gitian-downloader/win32-download-config b/contrib/gitian-downloader/win32-download-config
index 06c164180d..0ad3bdd4f3 100644
--- a/contrib/gitian-downloader/win32-download-config
+++ b/contrib/gitian-downloader/win32-download-config
@@ -3,7 +3,7 @@ name: bitcoin
urls:
- http://bitcoin.org/bitcoin-latest-win32-gitian.zip
rss:
-- url: http://sourceforge.net/api/file/index/project-id/244765/mtime/desc/limit/100/rss
+- url:
xpath: //item/link/text()
pattern: bitcoin-\d+.\d+.\d+-win32-gitian.zip
signers:
@@ -40,3 +40,6 @@ signers:
C060A6635913D98A3587D7DB1C2491FFEB0EF770:
name: "Cory Fields"
key: "cfields"
+ 37EC7D7B0A217CDB4B4E007E7FAB114267E4FA04:
+ name: "Peter Todd"
+ key: "petertodd"
diff --git a/contrib/init/bitcoind.openrc b/contrib/init/bitcoind.openrc
index b0ac5e31e1..a94f03680d 100644
--- a/contrib/init/bitcoind.openrc
+++ b/contrib/init/bitcoind.openrc
@@ -19,7 +19,7 @@ BITCOIND_NICE=${BITCOIND_NICE:-${NICELEVEL:-0}}
BITCOIND_OPTS="${BITCOIND_OPTS:-${BITCOIN_OPTS}}"
name="Bitcoin Core Daemon"
-description="Bitcoin crypto-currency p2p network daemon"
+description="Bitcoin cryptocurrency P2P network daemon"
command="/usr/bin/bitcoind"
command_args="-pid=\"${BITCOIND_PIDFILE}\" \
diff --git a/contrib/linearize/example-linearize.cfg b/contrib/linearize/example-linearize.cfg
index e0fef13886..38da02e66c 100644
--- a/contrib/linearize/example-linearize.cfg
+++ b/contrib/linearize/example-linearize.cfg
@@ -4,13 +4,23 @@ rpcuser=someuser
rpcpassword=somepassword
host=127.0.0.1
port=8332
+#port=18332
# bootstrap.dat hashlist settings (linearize-hashes)
max_height=313000
# bootstrap.dat input/output settings (linearize-data)
+
+# mainnet
netmagic=f9beb4d9
+genesis=000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
input=/home/example/.bitcoin/blocks
+
+# testnet
+#netmagic=0b110907
+#genesis=000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943
+#input=/home/example/.bitcoin/testnet3/blocks
+
output_file=/home/example/Downloads/bootstrap.dat
hashlist=hashlist.txt
split_year=1
diff --git a/contrib/linearize/linearize-data.py b/contrib/linearize/linearize-data.py
index a3a1173b1f..7947c6bf72 100755
--- a/contrib/linearize/linearize-data.py
+++ b/contrib/linearize/linearize-data.py
@@ -205,7 +205,7 @@ class BlockDataCopier:
inMagic = inhdr[:4]
if (inMagic != self.settings['netmagic']):
- print("Invalid magic: " + inMagic)
+ print("Invalid magic: " + inMagic.encode('hex'))
return
inLenLE = inhdr[4:]
su = struct.unpack("<I", inLenLE)
@@ -265,6 +265,8 @@ if __name__ == '__main__':
if 'netmagic' not in settings:
settings['netmagic'] = 'f9beb4d9'
+ if 'genesis' not in settings:
+ settings['genesis'] = '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f'
if 'input' not in settings:
settings['input'] = 'input'
if 'hashlist' not in settings:
@@ -291,7 +293,7 @@ if __name__ == '__main__':
blkindex = get_block_hashes(settings)
blkmap = mkblockmap(blkindex)
- if not "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" in blkmap:
+ if not settings['genesis'] in blkmap:
print("Genesis block not found in hashlist")
else:
BlockDataCopier(settings, blkindex, blkmap).run()
diff --git a/contrib/macdeploy/Base.lproj/InfoPlist.strings b/contrib/macdeploy/Base.lproj/InfoPlist.strings
new file mode 100644
index 0000000000..b259ea141c
--- /dev/null
+++ b/contrib/macdeploy/Base.lproj/InfoPlist.strings
@@ -0,0 +1 @@
+{ CFBundleDisplayName = "Bitcoin Core"; CFBundleName = "Bitcoin Core"; }
diff --git a/contrib/macdeploy/DS_Store b/contrib/macdeploy/DS_Store
index 099960712a..db9d16f1d7 100644
--- a/contrib/macdeploy/DS_Store
+++ b/contrib/macdeploy/DS_Store
Binary files differ
diff --git a/contrib/macdeploy/README.md b/contrib/macdeploy/README.md
index 0aa57b4777..6163734e62 100644
--- a/contrib/macdeploy/README.md
+++ b/contrib/macdeploy/README.md
@@ -11,5 +11,5 @@ This script should not be run manually, instead, after building as usual:
During the process, the disk image window will pop up briefly where the fancy
settings are applied. This is normal, please do not interfere.
-When finished, it will produce `Bitcoin-Qt.dmg`.
+When finished, it will produce `Bitcoin-Core.dmg`.
diff --git a/contrib/macdeploy/detached-sig-apply.sh b/contrib/macdeploy/detached-sig-apply.sh
index 7b3eb1b197..781fe315ed 100755
--- a/contrib/macdeploy/detached-sig-apply.sh
+++ b/contrib/macdeploy/detached-sig-apply.sh
@@ -1,11 +1,10 @@
#!/bin/sh
set -e
-UNSIGNED=$1
-SIGNATURE=$2
+UNSIGNED="$1"
+SIGNATURE="$2"
ARCH=x86_64
ROOTDIR=dist
-BUNDLE=${ROOTDIR}/Bitcoin-Qt.app
TEMPDIR=signed.temp
OUTDIR=signed-app
@@ -21,7 +20,7 @@ fi
rm -rf ${TEMPDIR} && mkdir -p ${TEMPDIR}
tar -C ${TEMPDIR} -xf ${UNSIGNED}
-tar -C ${TEMPDIR} -xf ${SIGNATURE}
+cp -rf "${SIGNATURE}"/* ${TEMPDIR}
if [ -z "${PAGESTUFF}" ]; then
PAGESTUFF=${TEMPDIR}/pagestuff
@@ -31,21 +30,21 @@ if [ -z "${CODESIGN_ALLOCATE}" ]; then
CODESIGN_ALLOCATE=${TEMPDIR}/codesign_allocate
fi
-for i in `find ${TEMPDIR} -name "*.sign"`; do
- SIZE=`stat -c %s ${i}`
- TARGET_FILE=`echo ${i} | sed 's/\.sign$//'`
+find ${TEMPDIR} -name "*.sign" | while read i; do
+ SIZE=`stat -c %s "${i}"`
+ TARGET_FILE="`echo "${i}" | sed 's/\.sign$//'`"
echo "Allocating space for the signature of size ${SIZE} in ${TARGET_FILE}"
- ${CODESIGN_ALLOCATE} -i ${TARGET_FILE} -a ${ARCH} ${SIZE} -o ${i}.tmp
+ ${CODESIGN_ALLOCATE} -i "${TARGET_FILE}" -a ${ARCH} ${SIZE} -o "${i}.tmp"
- OFFSET=`${PAGESTUFF} ${i}.tmp -p | tail -2 | grep offset | sed 's/[^0-9]*//g'`
+ OFFSET=`${PAGESTUFF} "${i}.tmp" -p | tail -2 | grep offset | sed 's/[^0-9]*//g'`
if [ -z ${QUIET} ]; then
echo "Attaching signature at offset ${OFFSET}"
fi
- dd if=$i of=${i}.tmp bs=1 seek=${OFFSET} count=${SIZE} 2>/dev/null
- mv ${i}.tmp ${TARGET_FILE}
- rm ${i}
+ dd if="$i" of="${i}.tmp" bs=1 seek=${OFFSET} count=${SIZE} 2>/dev/null
+ mv "${i}.tmp" "${TARGET_FILE}"
+ rm "${i}"
echo "Success."
done
mv ${TEMPDIR}/${ROOTDIR} ${OUTDIR}
diff --git a/contrib/macdeploy/detached-sig-create.sh b/contrib/macdeploy/detached-sig-create.sh
index aff4f08da8..89a2da32f7 100755
--- a/contrib/macdeploy/detached-sig-create.sh
+++ b/contrib/macdeploy/detached-sig-create.sh
@@ -2,11 +2,12 @@
set -e
ROOTDIR=dist
-BUNDLE=${ROOTDIR}/Bitcoin-Qt.app
+BUNDLE="${ROOTDIR}/Bitcoin-Qt.app"
CODESIGN=codesign
TEMPDIR=sign.temp
TEMPLIST=${TEMPDIR}/signatures.txt
OUT=signature.tar.gz
+OUTROOT=osx
if [ ! -n "$1" ]; then
echo "usage: $0 <codesign args>"
@@ -19,20 +20,20 @@ mkdir -p ${TEMPDIR}
${CODESIGN} -f --file-list ${TEMPLIST} "$@" "${BUNDLE}"
-for i in `grep -v CodeResources ${TEMPLIST}`; do
- TARGETFILE="${BUNDLE}/`echo ${i} | sed "s|.*${BUNDLE}/||"`"
- SIZE=`pagestuff $i -p | tail -2 | grep size | sed 's/[^0-9]*//g'`
- OFFSET=`pagestuff $i -p | tail -2 | grep offset | sed 's/[^0-9]*//g'`
- SIGNFILE="${TEMPDIR}/${TARGETFILE}.sign"
- DIRNAME="`dirname ${SIGNFILE}`"
+grep -v CodeResources < "${TEMPLIST}" | while read i; do
+ TARGETFILE="${BUNDLE}/`echo "${i}" | sed "s|.*${BUNDLE}/||"`"
+ SIZE=`pagestuff "$i" -p | tail -2 | grep size | sed 's/[^0-9]*//g'`
+ OFFSET=`pagestuff "$i" -p | tail -2 | grep offset | sed 's/[^0-9]*//g'`
+ SIGNFILE="${TEMPDIR}/${OUTROOT}/${TARGETFILE}.sign"
+ DIRNAME="`dirname "${SIGNFILE}"`"
mkdir -p "${DIRNAME}"
echo "Adding detached signature for: ${TARGETFILE}. Size: ${SIZE}. Offset: ${OFFSET}"
- dd if=$i of=${SIGNFILE} bs=1 skip=${OFFSET} count=${SIZE} 2>/dev/null
+ dd if="$i" of="${SIGNFILE}" bs=1 skip=${OFFSET} count=${SIZE} 2>/dev/null
done
-for i in `grep CodeResources ${TEMPLIST}`; do
- TARGETFILE="${BUNDLE}/`echo ${i} | sed "s|.*${BUNDLE}/||"`"
- RESOURCE="${TEMPDIR}/${TARGETFILE}"
+grep CodeResources < "${TEMPLIST}" | while read i; do
+ TARGETFILE="${BUNDLE}/`echo "${i}" | sed "s|.*${BUNDLE}/||"`"
+ RESOURCE="${TEMPDIR}/${OUTROOT}/${TARGETFILE}"
DIRNAME="`dirname "${RESOURCE}"`"
mkdir -p "${DIRNAME}"
echo "Adding resource for: "${TARGETFILE}""
@@ -41,6 +42,6 @@ done
rm ${TEMPLIST}
-tar -C ${TEMPDIR} -czf ${OUT} .
-rm -rf ${TEMPDIR}
+tar -C "${TEMPDIR}" -czf "${OUT}" .
+rm -rf "${TEMPDIR}"
echo "Created ${OUT}"
diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus
index 0eb6b2c84d..2253c40af1 100755
--- a/contrib/macdeploy/macdeployqtplus
+++ b/contrib/macdeploy/macdeployqtplus
@@ -155,7 +155,7 @@ class FrameworkInfo(object):
class ApplicationBundleInfo(object):
def __init__(self, path):
self.path = path
- appName = os.path.splitext(os.path.basename(path))[0]
+ appName = "Bitcoin-Qt"
self.binaryPath = os.path.join(path, "Contents", "MacOS", appName)
if not os.path.exists(self.binaryPath):
raise RuntimeError("Could not find bundle binary for " + path)
@@ -596,7 +596,7 @@ if os.path.exists("dist"):
# ------------------------------------------------
-target = os.path.join("dist", app_bundle)
+target = os.path.join("dist", "Bitcoin-Qt.app")
if verbose >= 2:
print "+ Copying source bundle +"
@@ -757,7 +757,7 @@ if config.dmg is not None:
if fancy is None:
try:
- runHDIUtil("create", dmg_name, srcfolder="dist", format="UDBZ", volname=app_bundle_name, ov=True)
+ runHDIUtil("create", dmg_name, srcfolder="dist", format="UDBZ", volname="Bitcoin-Core", ov=True)
except subprocess.CalledProcessError as e:
sys.exit(e.returncode)
else:
@@ -772,7 +772,7 @@ if config.dmg is not None:
if verbose >= 3:
print "Creating temp image for modification..."
try:
- runHDIUtil("create", dmg_name + ".temp", srcfolder="dist", format="UDRW", size=size, volname=app_bundle_name, ov=True)
+ runHDIUtil("create", dmg_name + ".temp", srcfolder="dist", format="UDRW", size=size, volname="Bitcoin-Core", ov=True)
except subprocess.CalledProcessError as e:
sys.exit(e.returncode)
@@ -837,7 +837,7 @@ if config.dmg is not None:
items_positions.append(itemscript.substitute(params))
params = {
- "disk" : "Bitcoin-Qt",
+ "disk" : "Bitcoin-Core",
"window_bounds" : "300,300,800,620",
"icon_size" : "96",
"background_commands" : "",
diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md
index bc88201f0f..63647fa11a 100644
--- a/contrib/seeds/README.md
+++ b/contrib/seeds/README.md
@@ -1,7 +1,7 @@
### Seeds ###
Utility to generate the seeds.txt list that is compiled into the client
-(see [src/chainparamsseeds.h](/src/chainparamsseeds.h) and [share/seeds](/share/seeds)).
+(see [src/chainparamsseeds.h](/src/chainparamsseeds.h) and other utilities in [contrib/seeds](/contrib/seeds)).
The 512 seeds compiled into the 0.10 release were created from sipa's DNS seed data, like this:
diff --git a/share/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py
index cdd6831218..167c219c6e 100755
--- a/share/seeds/generate-seeds.py
+++ b/contrib/seeds/generate-seeds.py
@@ -77,6 +77,9 @@ def parse_spec(s, defaultport):
if match: # ipv6
host = match.group(1)
port = match.group(2)
+ elif s.count(':') > 1: # ipv6, no port
+ host = s
+ port = ''
else:
(host,_,port) = s.partition(':')
@@ -118,7 +121,7 @@ def main():
g.write('#define BITCOIN_CHAINPARAMSSEEDS_H\n')
g.write('/**\n')
g.write(' * List of fixed seed nodes for the bitcoin network\n')
- g.write(' * AUTOGENERATED by share/seeds/generate-seeds.py\n')
+ g.write(' * AUTOGENERATED by contrib/seeds/generate-seeds.py\n')
g.write(' *\n')
g.write(' * Each line contains a 16-byte IPv6 address and a port.\n')
g.write(' * IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly.\n')
diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py
index b831395f2c..4072405ef5 100755
--- a/contrib/seeds/makeseeds.py
+++ b/contrib/seeds/makeseeds.py
@@ -22,26 +22,50 @@ SUSPICIOUS_HOSTS = set([
import re
import sys
import dns.resolver
+import collections
-PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):8333$")
-PATTERN_AGENT = re.compile(r"^(\/Satoshi:0.8.6\/|\/Satoshi:0.9.(2|3)\/|\/Satoshi:0.10.\d{1,2}\/)$")
+PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):(\d+)$")
+PATTERN_IPV6 = re.compile(r"^\[([0-9a-z:]+)\]:(\d+)$")
+PATTERN_ONION = re.compile(r"^([abcdefghijklmnopqrstuvwxyz234567]{16}\.onion):(\d+)$")
+PATTERN_AGENT = re.compile(r"^(\/Satoshi:0\.8\.6\/|\/Satoshi:0\.9\.(2|3|4|5)\/|\/Satoshi:0\.10\.\d{1,2}\/|\/Satoshi:0\.11\.\d{1,2}\/)$")
def parseline(line):
sline = line.split()
if len(sline) < 11:
return None
- # Match only IPv4
m = PATTERN_IPV4.match(sline[0])
+ sortkey = None
+ ip = None
if m is None:
- return None
- # Do IPv4 sanity check
- ip = 0
- for i in range(0,4):
- if int(m.group(i+2)) < 0 or int(m.group(i+2)) > 255:
+ m = PATTERN_IPV6.match(sline[0])
+ if m is None:
+ m = PATTERN_ONION.match(sline[0])
+ if m is None:
+ return None
+ else:
+ net = 'onion'
+ ipstr = sortkey = m.group(1)
+ port = int(m.group(2))
+ else:
+ net = 'ipv6'
+ if m.group(1) in ['::']: # Not interested in localhost
+ return None
+ ipstr = m.group(1)
+ sortkey = ipstr # XXX parse IPv6 into number, could use name_to_ipv6 from generate-seeds
+ port = int(m.group(2))
+ else:
+ # Do IPv4 sanity check
+ ip = 0
+ for i in range(0,4):
+ if int(m.group(i+2)) < 0 or int(m.group(i+2)) > 255:
+ return None
+ ip = ip + (int(m.group(i+2)) << (8*(3-i)))
+ if ip == 0:
return None
- ip = ip + (int(m.group(i+2)) << (8*(3-i)))
- if ip == 0:
- return None
+ net = 'ipv4'
+ sortkey = ip
+ ipstr = m.group(1)
+ port = int(m.group(6))
# Skip bad results.
if sline[1] == 0:
return None
@@ -59,7 +83,9 @@ def parseline(line):
blocks = int(sline[8])
# Construct result.
return {
- 'ip': m.group(1),
+ 'net': net,
+ 'ip': ipstr,
+ 'port': port,
'ipnum': ip,
'uptime': uptime30,
'lastsuccess': lastsuccess,
@@ -67,13 +93,27 @@ def parseline(line):
'agent': agent,
'service': service,
'blocks': blocks,
+ 'sortkey': sortkey,
}
+def filtermultiport(ips):
+ '''Filter out hosts with more nodes per IP'''
+ hist = collections.defaultdict(list)
+ for ip in ips:
+ hist[ip['sortkey']].append(ip)
+ return [value[0] for (key,value) in hist.items() if len(value)==1]
+
# Based on Greg Maxwell's seed_filter.py
def filterbyasn(ips, max_per_asn, max_total):
+ # Sift out ips by type
+ ips_ipv4 = [ip for ip in ips if ip['net'] == 'ipv4']
+ ips_ipv6 = [ip for ip in ips if ip['net'] == 'ipv6']
+ ips_onion = [ip for ip in ips if ip['net'] == 'onion']
+
+ # Filter IPv4 by ASN
result = []
asn_count = {}
- for ip in ips:
+ for ip in ips_ipv4:
if len(result) == max_total:
break
try:
@@ -86,13 +126,19 @@ def filterbyasn(ips, max_per_asn, max_total):
result.append(ip)
except:
sys.stderr.write('ERR: Could not resolve ASN for "' + ip['ip'] + '"\n')
+
+ # TODO: filter IPv6 by ASN
+
+ # Add back non-IPv4
+ result.extend(ips_ipv6)
+ result.extend(ips_onion)
return result
def main():
lines = sys.stdin.readlines()
ips = [parseline(line) for line in lines]
- # Skip entries with valid IPv4 address.
+ # Skip entries with valid address.
ips = [ip for ip in ips if ip is not None]
# Skip entries from suspicious hosts.
ips = [ip for ip in ips if ip['ip'] not in SUSPICIOUS_HOSTS]
@@ -106,13 +152,18 @@ def main():
ips = [ip for ip in ips if PATTERN_AGENT.match(ip['agent'])]
# Sort by availability (and use last success as tie breaker)
ips.sort(key=lambda x: (x['uptime'], x['lastsuccess'], x['ip']), reverse=True)
+ # Filter out hosts with multiple bitcoin ports, these are likely abusive
+ ips = filtermultiport(ips)
# Look up ASNs and limit results, both per ASN and globally.
ips = filterbyasn(ips, MAX_SEEDS_PER_ASN, NSEEDS)
# Sort the results by IP address (for deterministic output).
- ips.sort(key=lambda x: (x['ipnum']))
+ ips.sort(key=lambda x: (x['net'], x['sortkey']))
for ip in ips:
- print ip['ip']
+ if ip['net'] == 'ipv6':
+ print '[%s]:%i' % (ip['ip'], ip['port'])
+ else:
+ print '%s:%i' % (ip['ip'], ip['port'])
if __name__ == '__main__':
main()
diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt
new file mode 100644
index 0000000000..17339d514a
--- /dev/null
+++ b/contrib/seeds/nodes_main.txt
@@ -0,0 +1,879 @@
+1.34.168.128:8333
+1.202.128.218:8333
+2.30.0.210:8333
+5.9.96.203:8333
+5.45.71.130:8333
+5.45.98.141:8333
+5.102.145.68:8333
+5.135.160.77:8333
+5.189.134.246:8333
+5.199.164.132:8333
+5.249.135.102:8333
+8.19.44.110:8333
+8.22.230.8:8333
+14.200.200.145:8333
+18.228.0.188:8333
+18.228.0.200:8333
+23.24.168.97:8333
+23.28.35.227:8333
+23.92.76.170:8333
+23.99.64.119:8333
+23.228.166.128:8333
+23.229.45.32:8333
+24.8.105.128:8333
+24.16.69.137:8333
+24.94.98.96:8333
+24.102.118.7:8333
+24.118.166.228:8333
+24.122.133.49:8333
+24.166.97.162:8333
+24.213.235.242:8333
+24.226.107.64:8333
+24.228.192.171:8333
+27.140.133.18:8333
+31.41.40.25:8333
+31.43.101.59:8333
+31.184.195.181:8333
+31.193.139.66:8333
+37.200.70.102:8333
+37.205.10.151:8333
+42.3.106.227:8333
+42.60.133.106:8333
+45.56.85.231:8333
+45.56.102.228:8333
+45.79.130.235:8333
+46.28.204.61:11101
+46.38.235.229:8333
+46.59.2.74:8333
+46.101.132.37:8333
+46.101.168.50:8333
+46.163.76.230:8333
+46.166.161.103:8333
+46.182.132.100:8333
+46.223.36.94:8333
+46.227.66.132:8333
+46.227.66.138:8333
+46.239.107.74:8333
+46.249.39.100:8333
+46.250.98.108:8333
+50.7.37.114:8333
+50.81.53.151:8333
+50.115.43.253:8333
+50.116.20.87:8333
+50.116.33.92:8333
+50.125.167.245:8333
+50.143.9.51:8333
+50.188.192.133:8333
+54.77.162.76:8333
+54.153.97.109:8333
+54.165.192.125:8333
+58.96.105.85:8333
+59.167.196.135:8333
+60.29.227.163:8333
+61.35.225.19:8333
+62.43.130.178:8333
+62.109.49.26:8333
+62.202.0.97:8333
+62.210.66.227:8333
+62.210.192.169:8333
+64.74.98.205:8333
+64.156.193.100:8333
+64.203.102.86:8333
+64.229.142.48:8333
+65.96.193.165:8333
+66.30.3.7:8333
+66.114.33.49:8333
+66.118.133.194:8333
+66.135.10.126:8333
+66.172.10.4:8333
+66.194.38.250:8333
+66.194.38.253:8333
+66.215.192.104:8333
+67.60.98.115:8333
+67.164.35.36:8333
+67.191.162.244:8333
+67.207.195.77:8333
+67.219.233.140:8333
+67.221.193.55:8333
+67.228.162.228:8333
+68.50.67.199:8333
+68.62.3.203:8333
+68.65.205.226:9000
+68.106.42.191:8333
+68.150.181.198:8333
+68.196.196.106:8333
+68.224.194.81:8333
+69.46.5.194:8333
+69.50.171.238:8333
+69.64.43.152:8333
+69.65.41.13:8333
+69.90.132.200:8333
+69.143.1.243:8333
+69.146.98.216:8333
+69.165.246.38:8333
+69.207.6.135:8333
+69.251.208.26:8333
+70.38.1.101:8333
+70.38.9.66:8333
+70.90.2.18:8333
+71.58.228.226:8333
+71.199.11.189:8333
+71.199.193.202:8333
+71.205.232.181:8333
+71.236.200.162:8333
+72.24.73.186:8333
+72.52.130.110:8333
+72.53.111.37:8333
+72.235.38.70:8333
+73.31.171.149:8333
+73.32.137.72:8333
+73.137.133.238:8333
+73.181.192.103:8333
+73.190.2.60:8333
+73.195.192.137:8333
+73.222.35.117:8333
+74.57.199.180:8333
+74.82.233.205:8333
+74.85.66.82:8333
+74.101.224.127:8333
+74.113.69.16:8333
+74.122.235.68:8333
+74.193.68.141:8333
+74.208.164.219:8333
+75.100.37.122:8333
+75.145.149.169:8333
+75.168.34.20:8333
+76.20.44.240:8333
+76.100.70.17:8333
+76.168.3.239:8333
+76.186.140.103:8333
+77.92.68.221:8333
+77.109.101.142:8333
+77.110.11.86:8333
+77.242.108.18:8333
+78.46.96.150:9020
+78.84.100.95:8333
+79.132.230.144:8333
+79.133.43.63:8333
+79.160.76.153:8333
+79.169.34.24:8333
+79.188.7.78:8333
+80.217.226.25:8333
+80.223.100.179:8333
+80.240.129.221:8333
+81.1.173.243:8333
+81.7.11.50:8333
+81.7.16.17:8333
+81.66.111.3:8333
+81.80.9.71:8333
+81.140.43.138:8333
+81.171.34.37:8333
+81.174.247.50:8333
+81.181.155.53:8333
+81.184.5.253:8333
+81.187.69.130:8333
+81.230.3.84:8333
+82.42.128.51:8333
+82.74.226.21:8333
+82.142.75.50:8333
+82.199.102.10:8333
+82.200.205.30:8333
+82.221.108.21:8333
+82.221.128.35:8333
+82.238.124.41:8333
+82.242.0.245:8333
+83.76.123.110:8333
+83.150.9.196:8333
+83.162.196.192:8333
+83.162.234.224:8333
+83.170.104.91:8333
+83.255.66.118:8334
+84.2.34.104:8333
+84.45.98.91:8333
+84.47.161.150:8333
+84.212.192.131:8333
+84.215.169.101:8333
+84.238.140.176:8333
+84.245.71.31:8333
+85.17.4.212:8333
+85.114.128.134:8333
+85.159.237.191:8333
+85.166.130.189:8333
+85.199.4.228:8333
+85.214.66.168:8333
+85.214.195.210:8333
+85.229.0.73:8333
+86.21.96.45:8333
+87.48.42.199:8333
+87.81.143.82:8333
+87.81.251.72:8333
+87.104.24.185:8333
+87.104.168.104:8333
+87.117.234.71:8333
+87.118.96.197:8333
+87.145.12.57:8333
+87.159.170.190:8333
+88.150.168.160:8333
+88.208.0.79:8333
+88.208.0.149:8333
+88.214.194.226:8343
+89.1.11.32:8333
+89.36.235.108:8333
+89.67.96.2:15321
+89.98.16.41:8333
+89.108.72.195:8333
+89.156.35.157:8333
+89.163.227.28:8333
+89.212.33.237:8333
+89.212.160.165:8333
+89.231.96.83:8333
+89.248.164.64:8333
+90.149.193.199:8333
+91.77.239.245:8333
+91.106.194.97:8333
+91.126.77.77:8333
+91.134.38.195:8333
+91.156.97.181:8333
+91.207.68.144:8333
+91.209.77.101:8333
+91.214.200.205:8333
+91.220.131.242:8333
+91.220.163.18:8333
+91.233.23.35:8333
+92.13.96.93:8333
+92.14.74.114:8333
+92.27.7.209:8333
+92.221.228.13:8333
+92.255.207.73:8333
+93.72.167.148:8333
+93.74.163.234:8333
+93.123.174.66:8333
+93.152.166.29:8333
+93.181.45.188:8333
+94.19.12.244:8333
+94.190.227.112:8333
+94.198.135.29:8333
+94.224.162.65:8333
+94.226.107.86:8333
+94.242.198.161:8333
+95.31.10.209:8333
+95.65.72.244:8333
+95.84.162.95:8333
+95.90.139.46:8333
+95.183.49.27:8005
+95.215.47.133:8333
+96.23.67.85:8333
+96.44.166.190:8333
+97.93.225.74:8333
+98.26.0.34:8333
+98.27.225.102:8333
+98.229.117.229:8333
+98.249.68.125:8333
+98.255.5.155:8333
+99.101.240.114:8333
+101.100.174.138:8333
+101.251.203.6:8333
+103.3.60.61:8333
+103.30.42.189:8333
+103.224.165.48:8333
+104.36.83.233:8333
+104.37.129.22:8333
+104.54.192.251:8333
+104.128.228.252:8333
+104.128.230.185:8334
+104.130.161.47:8333
+104.131.33.60:8333
+104.143.0.156:8333
+104.156.111.72:8333
+104.167.111.84:8333
+104.193.40.248:8333
+104.197.7.174:8333
+104.197.8.250:8333
+104.223.1.133:8333
+104.236.97.140:8333
+104.238.128.214:8333
+104.238.130.182:8333
+106.38.234.84:8333
+106.185.36.204:8333
+107.6.4.145:8333
+107.150.2.6:8333
+107.150.40.234:8333
+107.155.108.130:8333
+107.161.182.115:8333
+107.170.66.231:8333
+107.190.128.226:8333
+107.191.106.115:8333
+108.16.2.61:8333
+109.70.4.168:8333
+109.162.35.196:8333
+109.163.235.239:8333
+109.190.196.220:8333
+109.191.39.60:8333
+109.234.106.191:8333
+109.238.81.82:8333
+114.76.147.27:8333
+115.28.224.127:8333
+115.68.110.82:18333
+118.97.79.218:8333
+118.189.207.197:8333
+119.228.96.233:8333
+120.147.178.81:8333
+121.41.123.5:8333
+121.67.5.230:8333
+122.107.143.110:8333
+123.2.170.98:8333
+123.110.65.94:8333
+123.193.139.19:8333
+125.239.160.41:8333
+128.101.162.193:8333
+128.111.73.10:8333
+128.140.229.73:8333
+128.175.195.31:8333
+128.199.107.63:8333
+128.199.192.153:8333
+128.253.3.193:20020
+129.123.7.7:8333
+130.89.160.234:8333
+131.72.139.164:8333
+131.191.112.98:8333
+133.1.134.162:8333
+134.19.132.53:8333
+137.226.34.42:8333
+141.41.2.172:8333
+141.255.128.204:8333
+142.217.12.106:8333
+143.215.129.126:8333
+146.0.32.101:8337
+147.229.13.199:8333
+149.210.133.244:8333
+149.210.162.187:8333
+150.101.163.241:8333
+151.236.11.189:8333
+153.121.66.211:8333
+154.20.2.139:8333
+159.253.23.132:8333
+162.209.106.123:8333
+162.210.198.184:8333
+162.218.65.121:8333
+162.222.161.49:8333
+162.243.132.6:8333
+162.243.132.58:8333
+162.248.99.164:53011
+162.248.102.117:8333
+163.158.35.110:8333
+164.15.10.189:8333
+164.40.134.171:8333
+166.230.71.67:8333
+167.160.161.199:8333
+168.103.195.250:8333
+168.144.27.112:8333
+168.158.129.29:8333
+170.75.162.86:8333
+172.90.99.174:8333
+172.245.5.156:8333
+173.23.166.47:8333
+173.32.11.194:8333
+173.34.203.76:8333
+173.171.1.52:8333
+173.175.136.13:8333
+173.230.228.139:8333
+173.247.193.70:8333
+174.49.132.28:8333
+174.52.202.72:8333
+174.53.76.87:8333
+174.109.33.28:8333
+176.28.12.169:8333
+176.35.182.214:8333
+176.36.33.113:8333
+176.36.33.121:8333
+176.58.96.173:8333
+176.121.76.84:8333
+178.62.70.16:8333
+178.62.111.26:8333
+178.76.169.59:8333
+178.79.131.32:8333
+178.162.199.216:8333
+178.175.134.35:8333
+178.248.111.4:8333
+178.254.1.170:8333
+178.254.34.161:8333
+179.43.143.120:8333
+179.208.156.198:8333
+180.200.128.58:8333
+183.78.169.108:8333
+183.96.96.152:8333
+184.68.2.46:8333
+184.73.160.160:8333
+184.94.227.58:8333
+184.152.68.163:8333
+185.7.35.114:8333
+185.28.76.179:8333
+185.31.160.202:8333
+185.45.192.129:8333
+185.66.140.15:8333
+186.2.167.23:8333
+186.220.101.142:8333
+188.26.5.33:8333
+188.75.136.146:8333
+188.120.194.140:8333
+188.121.5.150:8333
+188.138.0.114:8333
+188.138.33.239:8333
+188.166.0.82:8333
+188.182.108.129:8333
+188.191.97.208:8333
+188.226.198.102:8001
+190.10.9.217:8333
+190.75.143.144:8333
+190.139.102.146:8333
+191.237.64.28:8333
+192.3.131.61:8333
+192.99.225.3:8333
+192.110.160.122:8333
+192.146.137.1:8333
+192.183.198.204:8333
+192.203.228.71:8333
+193.0.109.3:8333
+193.12.238.204:8333
+193.91.200.85:8333
+193.234.225.156:8333
+194.6.233.38:8333
+194.63.143.136:8333
+194.126.100.246:8333
+195.134.99.195:8333
+195.159.111.98:8333
+195.159.226.139:8333
+195.197.175.190:8333
+198.48.199.108:8333
+198.57.208.134:8333
+198.57.210.27:8333
+198.62.109.223:8333
+198.167.140.8:8333
+198.167.140.18:8333
+199.91.173.234:8333
+199.127.226.245:8333
+199.180.134.116:8333
+200.7.96.99:8333
+201.160.106.86:8333
+202.55.87.45:8333
+202.60.68.242:8333
+202.60.69.232:8333
+202.124.109.103:8333
+203.30.197.77:8333
+203.88.160.43:8333
+203.151.140.14:8333
+203.219.14.204:8333
+205.147.40.62:8333
+207.235.39.214:8333
+207.244.73.8:8333
+208.12.64.225:8333
+208.76.200.200:8333
+209.40.96.121:8333
+209.126.107.176:8333
+209.141.40.149:8333
+209.190.75.59:8333
+209.208.111.142:8333
+210.54.34.164:8333
+211.72.66.229:8333
+212.51.144.42:8333
+212.112.33.157:8333
+212.116.72.63:8333
+212.126.14.122:8333
+213.66.205.194:8333
+213.111.196.21:8333
+213.122.107.102:8333
+213.136.75.175:8333
+213.155.7.24:8333
+213.163.64.31:8333
+213.163.64.208:8333
+213.165.86.136:8333
+213.184.8.22:8333
+216.15.78.182:8333
+216.55.143.154:8333
+216.115.235.32:8333
+216.126.226.166:8333
+216.145.67.87:8333
+216.169.141.169:8333
+216.249.92.230:8333
+216.250.138.230:8333
+217.20.171.43:8333
+217.23.2.71:8333
+217.23.2.242:8333
+217.25.9.76:8333
+217.40.226.169:8333
+217.123.98.9:8333
+217.155.36.62:8333
+217.172.32.18:20993
+218.61.196.202:8333
+218.231.205.41:8333
+220.233.77.200:8333
+223.18.226.85:8333
+223.197.203.82:8333
+223.255.166.142:8333
+[2001:1291:2bf:1::100]:8333
+[2001:1418:100:5c2::2]:8333
+[2001:16d8:dd24:0:86c9:681e:f931:256]:8333
+[2001:19f0:1624:e6::579d:9428]:8333
+[2001:19f0:300:1340:225:90ff:fec9:2b6d]:8333
+[2001:19f0:4009:1405::64]:8333
+[2001:1b40:5000:2e::3fb0:6571]:8333
+[2001:410:a000:4050:8463:90b0:fffb:4e58]:8333
+[2001:410:a002:cafe:8463:90b0:fffb:4e58]:8333
+[2001:41d0:1:541e::1]:8333
+[2001:41d0:1:6a34::3]:8333
+[2001:41d0:1:6cd3::]:8333
+[2001:41d0:1:8b26::1]:8333
+[2001:41d0:1:a33d::1]:8333
+[2001:41d0:1:b855::1]:8333
+[2001:41d0:1:c139::1]:8333
+[2001:41d0:1:c8d7::1]:8333
+[2001:41d0:1:dd3f::1]:8333
+[2001:41d0:1:e29d::1]:8333
+[2001:41d0:1:f59f::33]:8333
+[2001:41d0:1:f7cc::1]:8333
+[2001:41d0:1:ff87::1]:8333
+[2001:41d0:2:2f05::1]:8333
+[2001:41d0:2:37c3::]:8200
+[2001:41d0:2:3e13::1]:8333
+[2001:41d0:2:8619::]:8333
+[2001:41d0:2:9c94::1]:8333
+[2001:41d0:2:a24f::]:8333
+[2001:41d0:2:adbf::]:8333
+[2001:41d0:2:b721::1]:8333
+[2001:41d0:2:ee52::1]:8333
+[2001:41d0:2:f1a5::]:8333
+[2001:41d0:2:fa54::1]:8333
+[2001:41d0:51:1::2036]:8333
+[2001:41d0:52:a00::1a1]:8333
+[2001:41d0:52:cff::6f5]:8333
+[2001:41d0:52:d00::2c0]:8333
+[2001:41d0:52:d00::cf2]:8333
+[2001:41d0:8:1087::1]:8333
+[2001:41d0:8:4a3c::b7c]:8333
+[2001:41d0:8:6728::]:8333
+[2001:41d0:8:b779::1]:8333
+[2001:41d0:8:c30f::1]:8333
+[2001:41d0:8:d2b2::1]:8333
+[2001:41d0:8:d5c3::1]:8333
+[2001:41d0:8:eb8b::]:8333
+[2001:41d0:a:16d0::1]:8333
+[2001:41d0:a:2b18::1]:8333
+[2001:41d0:a:3a9c::1]:8333
+[2001:41d0:a:4903::]:8333
+[2001:41d0:a:57b::1]:8333
+[2001:41d0:a:5c7a::]:8333
+[2001:41d0:a:6c29::1]:8333
+[2001:41d0:a:f482::1]:8333
+[2001:41d0:b:854:b7c:b7c:b7c:b7c]:8333
+[2001:41d0:d:111c::]:8333
+[2001:44b8:4116:7801:4216:7eff:fe78:3fe4]:8333
+[2001:470:1f08:837::2]:8333
+[2001:470:1f08:c33::2]:8333
+[2001:470:1f09:bca:218:7dff:fe10:be33]:8333
+[2001:470:1f0f:22d::212:26]:8333
+[2001:470:1f11:12d5::ae1:5611]:8333
+[2001:470:1f14:57a::2]:8333
+[2001:470:1f14:7d::2]:8333
+[2001:470:1f15:57c::1]:8333
+[2001:470:1f15:dda:3d9a:3f11:9a56:ed64]:8333
+[2001:470:25:482::2]:8333
+[2001:470:25:e4::2]:8333
+[2001:470:4:26b::2]:8333
+[2001:470:5f:5f::232]:8333
+[2001:470:66:119::2]:8333
+[2001:470:67:39d::71]:8333
+[2001:470:6c4f::cafe]:8333
+[2001:470:8:2e1::43]:8333
+[2001:470:90a7:96::afe:6021]:8333
+[2001:470:95c1::2]:8333
+[2001:470:b1d0:ffff::1000]:8333
+[2001:470:c1f2:3::201]:8333
+[2001:470:d00d:0:3664:a9ff:fe9a:5150]:8333
+[2001:470:e250:0:211:11ff:feb9:924c]:8333
+[2001:4800:7817:101:be76:4eff:fe04:dc52]:8333
+[2001:4800:7819:104:be76:4eff:fe04:7809]:8333
+[2001:4800:7819:104:be76:4eff:fe05:c828]:8333
+[2001:4802:7800:2:30d7:1775:ff20:1858]:8333
+[2001:4802:7802:101:be76:4eff:fe20:256]:8333
+[2001:4802:7802:103:be76:4eff:fe20:2de8]:8333
+[2001:4830:1100:2e8::2]:8333
+[2001:4ba0:fff7:181:dead::1]:8333
+[2001:4ba0:fffa:5d::93]:8333
+[2001:4ba0:ffff:1be:1:1005:0:1]:8335
+[2001:4c48:110:101:216:3eff:fe24:1162]:8333
+[2001:4dd0:f101::32]:8333
+[2001:4dd0:ff00:867f::3]:8333
+[2001:4dd0:ff00:9a67::9]:8333
+[2001:4dd0:ff00:9c55:c23f:d5ff:fe6c:7ee9]:8333
+[2001:5c0:1400:b::3cc7]:8333
+[2001:5c0:1400:b::3d01]:8333
+[2001:5c0:1400:b::8df]:8333
+[2001:5c0:1501:300::3]:8333
+[2001:610:1b19::3]:8333
+[2001:620:500:fff0:f21f:afff:fecf:91cc]:8333
+[2001:67c:1220:80c:ad:8de2:f7e2:c784]:8333
+[2001:67c:21ec:1000::b]:8333
+[2001:6f8:1296:0:76d4:35ff:feba:1d26]:8333
+[2001:840:f000:4250:3e4a:92ff:fe6d:145f]:8333
+[2001:8d8:840:500::39:1ae]:8333
+[2001:980:efd8:0:21:de4a:2709:912]:8333
+[2001:981:46:1::3]:8333
+[2001:981:9319:2:c0:a8:c8:8]:8333
+[2001:9d8:cafe:3::91]:8333
+[2001:ad0:1:1:26be:5ff:fe25:959d]:8333
+[2001:ba8:1f1:f34c::2]:8333
+[2001:bc8:381c:100::1]:8333
+[2002:175c:4caa::175c:4caa]:8333
+[2002:4404:82f1:0:8d55:8fbb:15fa:f4e0]:8333
+[2002:4475:2233:0:21f:5bff:fe33:9f70]:8333
+[2002:596c:48c3::596c:48c3]:8333
+[2002:8c6d:6521:9617:12bf:48ff:fed8:1724]:8333
+[2002:a646:5e6a::1:2]:8333
+[2002:b009:20c5::b009:20c5]:8333
+[2400:8900::f03c:91ff:fe6e:823e]:8333
+[2400:8900::f03c:91ff:fe70:d164]:8333
+[2400:8901::f03c:91ff:fe37:9761]:8333
+[2403:4200:403:2::ff]:8333
+[2403:b800:1000:64:40a:e9ff:fe5f:94c1]:8333
+[2403:b800:1000:64:9879:17ff:fe6a:a59f]:8333
+[2600:3c00::f03c:91ff:fe18:59b2]:8333
+[2600:3c00::f03c:91ff:fe37:a4b1]:8333
+[2600:3c00::f03c:91ff:fe56:2973]:8333
+[2600:3c00::f03c:91ff:fe6e:7297]:8333
+[2600:3c00::f03c:91ff:fe84:8a6e]:8333
+[2600:3c01::f03c:91ff:fe18:6adf]:8333
+[2600:3c01::f03c:91ff:fe18:e217]:8333
+[2600:3c01::f03c:91ff:fe33:1b31]:8333
+[2600:3c01::f03c:91ff:fe33:2fe1]:8333
+[2600:3c01::f03c:91ff:fe33:a03f]:8333
+[2600:3c01::f03c:91ff:fe50:5e06]:8333
+[2600:3c01::f03c:91ff:fe56:d645]:8333
+[2600:3c01::f03c:91ff:fe6e:a3dc]:8333
+[2600:3c01::f03c:91ff:fe89:a659]:8333
+[2600:3c02::f03c:91ff:fe6e:6f0b]:8333
+[2600:3c03::f03c:91ff:fe33:f6fb]:8333
+[2600:3c03::f03c:91ff:fe50:5fa7]:8333
+[2600:3c03::f03c:91ff:fe6e:1803]:8333
+[2600:3c03::f03c:91ff:fe6e:4ac0]:8333
+[2601:6:4800:47f:1e4e:1f4d:332c:3bf6]:8333
+[2601:d:5400:fed:8d54:c1e8:7ed7:d45e]:8333
+[2602:100:4b8f:6d2a:20c:29ff:feaf:c4c2]:8333
+[2602:ffc5:1f::1f:2d61]:8333
+[2602:ffc5:1f::1f:9211]:8333
+[2602:ffc5::ffc5:b844]:8333
+[2602:ffe8:100:2::457:936b]:8333
+[2602:ffea:1001:125::2ad4]:8333
+[2602:ffea:1001:6ff::837d]:8333
+[2602:ffea:1001:72b::578b]:8333
+[2602:ffea:1001:77a::9cae]:8333
+[2602:ffea:1:2fe::6bc8]:8333
+[2602:ffea:1:701::7968]:8333
+[2602:ffea:1:70d::82ec]:8333
+[2602:ffea:1:9ff::e957]:8333
+[2602:ffea:1:a5d::4acb]:8333
+[2602:ffea:a::24c4:d9fd]:8333
+[2602:ffea:a::c06:ae32]:8333
+[2604:0:c1:100:1ec1:deff:fe54:2235]:8333
+[2604:180:1:1af::42a9]:8333
+[2604:180::b208:398]:8333
+[2604:2880::6072:aed]:8333
+[2604:4080:1114:0:3285:a9ff:fe93:850c]:8333
+[2604:7c00:17:3d0::5a4d]:8333
+[2604:9a00:2100:a009:2::]:8333
+[2604:a880:1:20::22a:4001]:8333
+[2604:a880:800:10::752:f001]:8333
+[2604:c00:88:32:216:3eff:fee4:fcca]:8333
+[2604:c00:88:32:216:3eff:fef5:bc21]:8333
+[2605:7980:1:2::1761:3d4e]:8333
+[2605:e000:1417:4068:223:32ff:fe96:e2d]:8333
+[2606:6000:a441:9903:5054:ff:fe78:66ff]:8333
+[2606:df00:2::ae85:8fc6]:8333
+[2607:5300:100:200::e7f]:8333
+[2607:5300:10::a1]:8333
+[2607:5300:60:116e::1]:8333
+[2607:5300:60:1535::]:8333
+[2607:5300:60:1b32::1]:8333
+[2607:5300:60:2337::1]:8333
+[2607:5300:60:2b90::1]:8333
+[2607:5300:60:2d99::1]:8333
+[2607:5300:60:3cb::1]:8333
+[2607:5300:60:4a85::]:8333
+[2607:5300:60:5112:0:2:4af5:63fe]:8333
+[2607:5300:60:6dd5::]:8333
+[2607:5300:60:a91::1]:8333
+[2607:f1c0:820:1500::7f:3f44]:8333
+[2607:f1c0:848:1000::48:943c]:8333
+[2607:f948:0:1::7]:8333
+[2607:fcd0:100:2300::4ad:e594]:8333
+[2607:fcd0:100:2300::659e:9cb3]:8333
+[2607:fcd0:100:2300::c74b:a8ae]:8333
+[2607:fcd0:100:2300::d82:d8c2]:8333
+[2607:fcd0:100:4300::8795:2fa8]:8333
+[2607:fcd0:daaa:901::9561:e043]:8333
+[2a00:1178:2:43:5054:ff:fee7:2eb6]:8333
+[2a00:1328:e100:cc42:230:48ff:fe92:55d]:8333
+[2a00:14f0:e000:80d2:cd1a::1]:8333
+[2a00:16d8:c::5b6a:c261]:8333
+[2a00:61e0:4083:6d01:6852:1376:e972:2091]:8333
+[2a00:c98:2030:a02f:2::2]:8333
+[2a01:1b0:7999:402::131]:8333
+[2a01:1e8:e100:811c:700f:65f0:f72a:1084]:8333
+[2a01:238:42da:c500:6546:1293:5422:ab40]:8333
+[2a01:348:6:473::2]:8333
+[2a01:368:e010:2::2]:8333
+[2a01:430:17:1::ffff:549]:8333
+[2a01:430:17:1::ffff:830]:8333
+[2a01:488:66:1000:53a9:d04:0:1]:8333
+[2a01:488:66:1000:57e6:578c:0:1]:8333
+[2a01:488:66:1000:b01c:178d:0:1]:8333
+[2a01:488:67:1000:523:fdce:0:1]:8333
+[2a01:488:67:1000:b01c:30ab:0:1]:8333
+[2a01:4f8:100:24aa::2]:8333
+[2a01:4f8:100:44e7::2]:8333
+[2a01:4f8:100:5128::2]:8333
+[2a01:4f8:100:84a7::1:1]:8333
+[2a01:4f8:110:516c::2]:8333
+[2a01:4f8:110:536e::2]:8333
+[2a01:4f8:120:62e6::2]:8333
+[2a01:4f8:120:702e::2]:8333
+[2a01:4f8:120:8005::2]:8333
+[2a01:4f8:120:8203::2]:8333
+[2a01:4f8:120:8422::2]:8333
+[2a01:4f8:121:11eb::2]:8333
+[2a01:4f8:121:261::2]:8333
+[2a01:4f8:130:242b::10]:8333
+[2a01:4f8:130:242b::5]:8333
+[2a01:4f8:130:2468::3]:8333
+[2a01:4f8:130:632c::2]:8333
+[2a01:4f8:130:6366::2]:8333
+[2a01:4f8:130:6426::2]:8333
+[2a01:4f8:130:934f::2]:8333
+[2a01:4f8:131:2070::2]:8333
+[2a01:4f8:131:54a2::2]:8333
+[2a01:4f8:140:80ad::2]:8333
+[2a01:4f8:141:186::2]:8333
+[2a01:4f8:150:210b::2]:8333
+[2a01:4f8:150:2263::5]:8333
+[2a01:4f8:150:2349::2]:8333
+[2a01:4f8:150:61ee::2]:8333
+[2a01:4f8:150:7088:5054:ff:fe45:bff2]:8333
+[2a01:4f8:150:8324::2]:9001
+[2a01:4f8:151:1d8::2]:8333
+[2a01:4f8:151:5128::2]:8333
+[2a01:4f8:151:6347::2]:9001
+[2a01:4f8:161:526d::2]:8333
+[2a01:4f8:161:9349::2]:8333
+[2a01:4f8:162:23c6::2]:8333
+[2a01:4f8:162:4348::2]:8333
+[2a01:4f8:162:7345::2]:8333
+[2a01:4f8:162:7383::2]:8333
+[2a01:4f8:162:74e3::2]:8333
+[2a01:4f8:190:6065::2]:8333
+[2a01:4f8:190:6349::2]:8333
+[2a01:4f8:190:64c9::2]:8333
+[2a01:4f8:190:91ce::2]:8333
+[2a01:4f8:191:2194::83]:8333
+[2a01:4f8:191:40a1::2]:8333
+[2a01:4f8:191:4a7::2]:8333
+[2a01:4f8:191:63b4:5000::1]:8333
+[2a01:4f8:191:7121::2]:8333
+[2a01:4f8:191:83a2::2]:8333
+[2a01:4f8:191:93c4::2]:8333
+[2a01:4f8:192:60a9:0:1:5:2]:8333
+[2a01:4f8:192:73b2::2]:8333
+[2a01:4f8:192:8098::2]:8333
+[2a01:4f8:192:db::2]:8333
+[2a01:4f8:200:1012::2]:8333
+[2a01:4f8:200:22e3::2]:8333
+[2a01:4f8:200:414e::2]:8333
+[2a01:4f8:200:63af::222]:8333
+[2a01:4f8:200:71e3:78b4:f3ff:fead:e8cf]:8333
+[2a01:4f8:201:5164::2]:8333
+[2a01:4f8:201:6011::4]:8333
+[2a01:4f8:201:60d5::2]:8333
+[2a01:4f8:202:53c3::2]:8333
+[2a01:4f8:210:24aa::2]:8333
+[2a01:4f8:210:502f::2]:8333
+[2a01:4f8:211:14cf::2]:8333
+[2a01:4f8:211:1a59::2]:8333
+[2a01:4f8:211:2ac1::2]:8333
+[2a01:4f8:211:cca::2]:8333
+[2a01:4f8:a0:22a5::2]:8333
+[2a01:4f8:a0:5023::2]:8333
+[2a01:4f8:a0:5243::2]:8333
+[2a01:4f8:a0:74c8::2]:8333
+[2a01:4f8:a0:8227::2]:8333
+[2a01:4f8:a0:822d::2]:8333
+[2a01:4f8:d13:2183::2]:8333
+[2a01:608:ffff:a009:8bf5:879d:e51a:f837]:8333
+[2a01:79d:469e:ed94:c23f:d5ff:fe65:20c5]:8333
+[2a01:7c8:aab5:3e6:5054:ff:fed7:4e54]:8333
+[2a01:7e00::f03c:91ff:fe18:301e]:8333
+[2a01:7e00::f03c:91ff:fe18:7749]:8333
+[2a01:7e00::f03c:91ff:fe33:2d67]:8333
+[2a01:7e00::f03c:91ff:fe33:347c]:8333
+[2a01:7e00::f03c:91ff:fe33:ae50]:8333
+[2a01:7e00::f03c:91ff:fe56:6b5c]:8333
+[2a01:7e00::f03c:91ff:fe56:bee6]:8333
+[2a01:7e00::f03c:91ff:fe69:4895]:8333
+[2a01:7e00::f03c:91ff:fe69:9912]:8333
+[2a01:7e00::f03c:91ff:fe6e:26ee]:8333
+[2a01:7e00::f03c:91ff:fe73:42f1]:8333
+[2a01:7e00::f03c:91ff:fe84:434f]:8333
+[2a01:7e00::f03c:91ff:fe84:b36b]:8333
+[2a01:7e00::f03c:91ff:fe89:1faa]:8333
+[2a01:7e00::f03c:91ff:fe98:816]:8333
+[2a01:7e00::f03c:91ff:fedb:352e]:8333
+[2a01:7e00::f03c:91ff:fedb:4a1d]:8333
+[2a01:e34:edbb:6750:224:1dff:fe89:3897]:8333
+[2a01:e35:2f1d:3fb0:7187:c7ba:bcfc:80ce]:8333
+[2a01:e35:8787:96f0:9032:9297:39ae:496d]:8333
+[2a01:e35:8a3f:47c0:c617:feff:fe3c:9fbd]:8333
+[2a01:e35:8b66:6a0:4900:9dfd:d841:d025]:8333
+[2a02:168:4a01::39]:8333
+[2a02:168:5404:2:c23f:d5ff:fe6a:512e]:8333
+[2a02:180:1:1::5b8f:538c]:8333
+[2a02:2028:1016::2]:8333
+[2a02:2528:503:2::14]:8333
+[2a02:2528:503:2::15]:8333
+[2a02:2528:ff00:81a6:21e:c5ff:fe8d:f9a5]:8333
+[2a02:2770:5:0:21a:4aff:fee4:c7db]:8333
+[2a02:2770:8:0:21a:4aff:fe7b:3dcd]:8333
+[2a02:348:5e:5a29::1]:8333
+[2a02:7aa0:1619::202f:c06a]:8333
+[2a02:8109:8e40:35fc:ba27:ebff:feae:cf16]:8333
+[2a02:af8:6:1500::1:130]:8333
+[2a02:c200:0:10:1:0:6314:2222]:8333
+[2a02:c200:0:10:2:3:3295:1]:8332
+[2a02:c200:0:10:3:0:5449:1]:8333
+[2a02:c200:1:10:2:3:5899:1]:8333
+[2a02:c200:1:10::2705:1]:8333
+[2a02:ce80:0:20::1]:8333
+[2a02:fe0:c321:27e0:6ef0:49ff:fe11:a61d]:8333
+[2a03:4000:2:496::8]:8333
+[2a03:b0c0:0:1010::62:f001]:8333
+[2a03:f80:ed16:ca7:ea75:b12d:2af:9e2a]:8333
+3ffk7iumtx3cegbi.onion:8333
+3hshaantu6ot4upz.onion:8333
+45c5lc77qgpikafy.onion:8333
+77mx2jsxaoyesz2p.onion:8333
+7g7j54btiaxhtsiy.onion:8333
+b6fr7dlbu2kpiysf.onion:8333
+bitcoincfqcssig5.onion:8333
+bitcoinostk4e4re.onion:8333
+bmutjfrj5btseddb.onion:8333
+drp4pvejybx2ejdr.onion:8333
+gixnv56d63buypan.onion:8333
+h2vlpudzphzqxutd.onion:8333
+hhiv5pnxenvbf4am.onion:8333
+lzxpkn6ptp3ohh63.onion:8333
+msphsgfiqfq5stne.onion:8333
+ncwk3lutemffcpc4.onion:8333
+okdzjarwekbshnof.onion:8333
+sjdomi4yb2dwkjbc.onion:8333
+uvwozwxlihntigbb.onion:8333
+v6ylz45dn5ybpk4d.onion:8333
+vk3qjdehyy4dwcxw.onion:8333
+vqpye2k5rcqvj5mq.onion:8333
+xudkoztdfrsuyyou.onion:8333
+z55v4ostefnwfy32.onion:8333
diff --git a/contrib/seeds/nodes_test.txt b/contrib/seeds/nodes_test.txt
new file mode 100644
index 0000000000..98365ee505
--- /dev/null
+++ b/contrib/seeds/nodes_test.txt
@@ -0,0 +1,11 @@
+# List of fixed seed nodes for testnet
+
+# Onion nodes
+thfsmmn2jbitcoin.onion
+it2pj4f7657g3rhi.onion
+nkf5e6b7pl4jfd4a.onion
+4zhkir2ofl7orfom.onion
+t6xj6wilh4ytvcs7.onion
+i6y6ivorwakd7nw3.onion
+ubqj4rsu3nqtxmtp.onion
+
diff --git a/depends/.gitignore b/depends/.gitignore
index 82c48638b0..1f163897b9 100644
--- a/depends/.gitignore
+++ b/depends/.gitignore
@@ -3,3 +3,7 @@ work/
built/
sources/
config.site
+x86_64*
+i686*
+mips*
+arm*
diff --git a/depends/Makefile b/depends/Makefile
index 05ef33f2ee..ef5a20e6c3 100644
--- a/depends/Makefile
+++ b/depends/Makefile
@@ -91,12 +91,12 @@ include funcs.mk
toolchain_path=$($($(host_arch)_$(host_os)_native_toolchain)_prefixbin)
final_build_id_long+=$(shell $(build_SHA256SUM) config.site.in)
final_build_id+=$(shell echo -n $(final_build_id_long) | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))
-$(host_prefix)/.stamp_$(final_build_id): | $(native_packages) $(packages)
+$(host_prefix)/.stamp_$(final_build_id): $(native_packages) $(packages)
$(AT)rm -rf $(@D)
$(AT)mkdir -p $(@D)
- $(AT)echo copying packages: $|
+ $(AT)echo copying packages: $^
$(AT)echo to: $(@D)
- $(AT)cd $(@D); $(foreach package,$|, tar xf $($(package)_cached); )
+ $(AT)cd $(@D); $(foreach package,$^, tar xf $($(package)_cached); )
$(AT)touch $@
$(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_build_id)
@@ -121,8 +121,35 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_
$< > $@
$(AT)touch $@
-install: $(host_prefix)/share/config.site
-download-one: $(all_sources)
+
+define check_or_remove_cached
+ mkdir -p $(BASE_CACHE)/$(host)/$(package) && cd $(BASE_CACHE)/$(host)/$(package); \
+ $(build_SHA256SUM) -c $($(package)_cached_checksum) >/dev/null 2>/dev/null || \
+ ( rm -f $($(package)_cached_checksum); \
+ if test -f "$($(package)_cached)"; then echo "Checksum mismatch for $(package). Forcing rebuild.."; rm -f $($(package)_cached_checksum) $($(package)_cached); fi )
+endef
+
+define check_or_remove_sources
+ mkdir -p $($(package)_source_dir); cd $($(package)_source_dir); \
+ $(build_SHA256SUM) -c $($(package)_fetched) >/dev/null 2>/dev/null || \
+ ( if test -f $($(package)_all_sources); then echo "Checksum missing or mismatched for $(package) source. Forcing re-download."; fi; \
+ rm -f $($(package)_all_sources) $($(1)_fetched))
+endef
+
+check-packages:
+ @$(foreach package,$(all_packages),$(call check_or_remove_cached,$(package));)
+check-sources:
+ @$(foreach package,$(all_packages),$(call check_or_remove_sources,$(package));)
+
+$(host_prefix)/share/config.site: check-packages
+
+check-packages: check-sources
+
+install: check-packages $(host_prefix)/share/config.site
+
+
+download-one: check-sources $(all_sources)
+
download-osx:
@$(MAKE) -s HOST=x86_64-apple-darwin11 download-one
download-linux:
@@ -130,4 +157,5 @@ download-linux:
download-win:
@$(MAKE) -s HOST=x86_64-w64-mingw32 download-one
download: download-osx download-linux download-win
-.PHONY: install cached download-one download-osx download-linux download-win download
+
+.PHONY: install cached download-one download-osx download-linux download-win download check-packages check-sources
diff --git a/depends/README.md b/depends/README.md
new file mode 100644
index 0000000000..2dc0b9e47e
--- /dev/null
+++ b/depends/README.md
@@ -0,0 +1,56 @@
+### Usage
+
+To build dependencies for the current arch+OS:
+
+ make
+
+To build for another arch/OS:
+
+ make HOST=host-platform-triplet
+
+For example:
+
+ make HOST=x86_64-w64-mingw32 -j4
+
+A prefix will be generated that's suitable for plugging into Bitcoin's
+configure. In the above example, a dir named i686-w64-mingw32 will be
+created. To use it for Bitcoin:
+
+ ./configure --prefix=`pwd`/depends/x86_64-w64-mingw32
+
+Common `host-platform-triplets` for cross compilation are:
+
+- `i686-w64-mingw32` for Win32
+- `x86_64-w64-mingw32` for Win64
+- `x86_64-apple-darwin11` for MacOSX
+- `arm-linux-gnueabihf` for Linux ARM
+
+No other options are needed, the paths are automatically configured.
+
+Dependency Options:
+The following can be set when running make: make FOO=bar
+
+ SOURCES_PATH: downloaded sources will be placed here
+ BASE_CACHE: built packages will be placed here
+ SDK_PATH: Path where sdk's can be found (used by OSX)
+ FALLBACK_DOWNLOAD_PATH: If a source file can't be fetched, try here before giving up
+ NO_QT: Don't download/build/cache qt and its dependencies
+ NO_WALLET: Don't download/build/cache libs needed to enable the wallet
+ NO_UPNP: Don't download/build/cache packages needed for enabling upnp
+ DEBUG: disable some optimizations and enable more runtime checking
+
+If some packages are not built, for example `make NO_WALLET=1`, the appropriate
+options will be passed to bitcoin's configure. In this case, `--disable-wallet`.
+
+Additional targets:
+
+ download: run 'make download' to fetch all sources without building them
+ download-osx: run 'make download-osx' to fetch all sources needed for osx builds
+ download-win: run 'make download-win' to fetch all sources needed for win builds
+ download-linux: run 'make download-linux' to fetch all sources needed for linux builds
+
+### Other documentation
+
+- [description.md](description.md): General description of the depends system
+- [packages.md](packages.md): Steps for adding packages
+
diff --git a/depends/README.usage b/depends/README.usage
deleted file mode 100644
index 24e1231d82..0000000000
--- a/depends/README.usage
+++ /dev/null
@@ -1,34 +0,0 @@
-To build dependencies for the current arch+OS:
- make
-To build for another arch/OS:
- make HOST=host-platform-triplet && make HOST=host-platform-triplet
- (For example: make HOST=i686-w64-mingw32 -j4)
-
-A prefix will be generated that's suitable for plugging into Bitcoin's
-configure. In the above example, a dir named i686-w64-mingw32 will be
-created. To use it for Bitcoin:
-
-./configure --prefix=`pwd`/depends/i686-w64-mingw32
-
-No other options are needed, the paths are automatically configured.
-
-Dependency Options:
-The following can be set when running make: make FOO=bar
-
-SOURCES_PATH: downloaded sources will be placed here
-BASE_CACHE: built packages will be placed here
-SDK_PATH: Path where sdk's can be found (used by OSX)
-FALLBACK_DOWNLOAD_PATH: If a source file can't be fetched, try here before giving up
-NO_QT: Don't download/build/cache qt and its dependencies
-NO_WALLET: Don't download/build/cache libs needed to enable the wallet
-NO_UPNP: Don't download/build/cache packages needed for enabling upnp
-DEBUG: disable some optimizations and enable more runtime checking
-
-If some packages are not built, for example 'make NO_WALLET=1', the appropriate
-options will be passed to bitcoin's configure. In this case, --disable-wallet.
-
-Additional targets:
-download: run 'make download' to fetch all sources without building them
-download-osx: run 'make download-osx' to fetch all sources needed for osx builds
-download-win: run 'make download-win' to fetch all sources needed for win builds
-download-linux: run 'make download-linux' to fetch all sources needed for linux builds
diff --git a/depends/config.guess b/depends/config.guess
index dbfb9786cb..f7eb141e75 100755
--- a/depends/config.guess
+++ b/depends/config.guess
@@ -2,7 +2,7 @@
# Attempt to guess a canonical system name.
# Copyright 1992-2015 Free Software Foundation, Inc.
-timestamp='2015-01-01'
+timestamp='2015-03-04'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -168,20 +168,27 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# Note: NetBSD doesn't particularly care about the vendor
# portion of the name. We always set it to "unknown".
sysctl="sysctl -n hw.machine_arch"
- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
- /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ /sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || \
+ echo unknown)`
case "${UNAME_MACHINE_ARCH}" in
armeb) machine=armeb-unknown ;;
arm*) machine=arm-unknown ;;
sh3el) machine=shl-unknown ;;
sh3eb) machine=sh-unknown ;;
sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine=${arch}${endian}-unknown
+ ;;
*) machine=${UNAME_MACHINE_ARCH}-unknown ;;
esac
# The Operating System including object format, if it has switched
# to ELF recently, or will in the future.
case "${UNAME_MACHINE_ARCH}" in
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
eval $set_cc_for_build
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ELF__
@@ -197,6 +204,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
os=netbsd
;;
esac
+ # Determine ABI tags.
+ case "${UNAME_MACHINE_ARCH}" in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+ ;;
+ esac
# The OS release
# Debian GNU/NetBSD machines have a different userland, and
# thus, need a distinct triplet. However, they do not need
@@ -213,7 +227,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
# contains redundant information, the shorter form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "${machine}-${os}${release}"
+ echo "${machine}-${os}${release}${abi}"
exit ;;
*:Bitrig:*:*)
UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -933,6 +947,9 @@ EOF
crisv32:Linux:*:*)
echo ${UNAME_MACHINE}-axis-linux-${LIBC}
exit ;;
+ e2k:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
frv:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
diff --git a/depends/config.sub b/depends/config.sub
index 6d2e94c8bf..8f1229c6f7 100755
--- a/depends/config.sub
+++ b/depends/config.sub
@@ -2,7 +2,7 @@
# Configuration validation subroutine script.
# Copyright 1992-2015 Free Software Foundation, Inc.
-timestamp='2015-01-01'
+timestamp='2015-03-08'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -117,7 +117,7 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
- knetbsd*-gnu* | netbsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
kopensolaris*-gnu* | \
storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
@@ -259,7 +259,7 @@ case $basic_machine in
| bfin \
| c4x | c8051 | clipper \
| d10v | d30v | dlx | dsp16xx \
- | epiphany \
+ | e2k | epiphany \
| fido | fr30 | frv | ft32 \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| hexagon \
@@ -381,7 +381,7 @@ case $basic_machine in
| c[123]* | c30-* | [cjt]90-* | c4x-* \
| c8051-* | clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
- | elxsi-* \
+ | e2k-* | elxsi-* \
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
@@ -518,6 +518,9 @@ case $basic_machine in
basic_machine=i386-pc
os=-aros
;;
+ asmjs)
+ basic_machine=asmjs-unknown
+ ;;
aux)
basic_machine=m68k-apple
os=-aux
@@ -1373,7 +1376,7 @@ case $os in
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
| -sym* | -kopensolaris* | -plan9* \
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* | -aros* \
+ | -aos* | -aros* | -cloudabi* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
diff --git a/depends/README b/depends/description.md
index 55e7222697..74f9ef3f20 100644
--- a/depends/README
+++ b/depends/description.md
@@ -1,9 +1,7 @@
-This is a system of building and caching dependencies necessary for building
-Bitcoin.
-
+This is a system of building and caching dependencies necessary for building Bitcoin.
There are several features that make it different from most similar systems:
-- It is designed to be builder and host agnostic
+### It is designed to be builder and host agnostic
In theory, binaries for any target OS/architecture can be created, from a
builder running any OS/architecture. In practice, build-side tools must be
@@ -11,18 +9,18 @@ specified when the defaults don't fit, and packages must be amended to work
on new hosts. For now, a build architecture of x86_64 is assumed, either on
Linux or OSX.
-- No reliance on timestamps
+### No reliance on timestamps
File presence is used to determine what needs to be built. This makes the
results distributable and easily digestable by automated builders.
-- Each build only has its specified dependencies available at build-time.
+### Each build only has its specified dependencies available at build-time.
For each build, the sysroot is wiped and the (recursive) dependencies are
installed. This makes each build deterministic, since there will never be any
unknown files available to cause side-effects.
-- Each package is cached and only rebuilt as needed.
+### Each package is cached and only rebuilt as needed.
Before building, a unique build-id is generated for each package. This id
consists of a hash of all files used to build the package (Makefiles, packages,
@@ -32,7 +30,7 @@ any other package that depends on it. If any of the main makefiles (Makefile,
funcs.mk, etc) are changed, all packages will be rebuilt. After building, the
results are cached into a tarball that can be re-used and distributed.
-- Package build results are (relatively) deterministic.
+### Package build results are (relatively) deterministic.
Each package is configured and patched so that it will yield the same
build-results with each consequent build, within a reasonable set of
@@ -41,13 +39,13 @@ beyond the scope of this system. Additionally, the toolchain itself must be
capable of deterministic results. When revisions are properly bumped, a cached
build should represent an exact single payload.
-- Sources are fetched and verified automatically
+### Sources are fetched and verified automatically
Each package must define its source location and checksum. The build will fail
if the fetched source does not match. Sources may be pre-seeded and/or cached
as desired.
-- Self-cleaning
+### Self-cleaning
Build and staging dirs are wiped after use, and any previous version of a
cached result is removed following a successful build. Automated builders
diff --git a/depends/funcs.mk b/depends/funcs.mk
index b407737f7f..050a9b1321 100644
--- a/depends/funcs.mk
+++ b/depends/funcs.mk
@@ -53,12 +53,14 @@ $(1)_staging_prefix_dir:=$$($(1)_staging_dir)$($($(1)_type)_prefix)
$(1)_extract_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)
$(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version)
$(1)_build_dir:=$$($(1)_extract_dir)/$$($(1)_build_subdir)
+$(1)_cached_checksum:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash
$(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(1)_build_id)
$(1)_prefixbin:=$($($(1)_type)_prefix)/bin/
$(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz
+$(1)_all_sources=$($(1)_file_name) $($(1)_extra_sources)
#stamps
-$(1)_fetched=$$($(1)_source_dir)/download-stamps/.stamp_fetched-$(1)-$($(1)_file_name)
+$(1)_fetched=$(SOURCES_PATH)/download-stamps/.stamp_fetched-$(1)-$($(1)_file_name).hash
$(1)_extracted=$$($(1)_extract_dir)/.stamp_extracted
$(1)_preprocessed=$$($(1)_extract_dir)/.stamp_preprocessed
$(1)_cleaned=$$($(1)_extract_dir)/.stamp_cleaned
@@ -154,7 +156,10 @@ endef
define int_add_cmds
$($(1)_fetched):
$(AT)mkdir -p $$(@D) $(SOURCES_PATH)
+ $(AT)rm -f $$@
+ $(AT)touch $$@
$(AT)cd $$(@D); $(call $(1)_fetch_cmds,$(1))
+ $(AT)cd $($(1)_source_dir); $(foreach source,$($(1)_all_sources),$(build_SHA256SUM) $(source) >> $$(@);)
$(AT)touch $$@
$($(1)_extracted): | $($(1)_fetched)
$(AT)echo Extracting $(1)...
@@ -195,10 +200,12 @@ $($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed)
$(AT)rm -rf $$(@D) && mkdir -p $$(@D)
$(AT)mv $$($(1)_staging_dir)/$$(@F) $$(@)
$(AT)rm -rf $($(1)_staging_dir)
+$($(1)_cached_checksum): $($(1)_cached)
+ $(AT)cd $$(@D); $(build_SHA256SUM) $$(<F) > $$(@)
.PHONY: $(1)
-$(1): | $($(1)_cached)
-.SECONDARY: $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched)
+$(1): | $($(1)_cached_checksum)
+.SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched)
endef
diff --git a/depends/README.packages b/depends/packages.md
index 5ab7ed7dee..7c80362509 100644
--- a/depends/README.packages
+++ b/depends/packages.md
@@ -4,119 +4,137 @@ variables, and defining build commands.
The package "mylib" will be used here as an example
General tips:
-mylib_foo is written as $(package)_foo in order to make recipes more similar.
+- mylib_foo is written as $(package)_foo in order to make recipes more similar.
-Identifiers:
+## Identifiers
Each package is required to define at least these variables:
- $(package)_version:
+
+ $(package)_version:
Version of the upstream library or program. If there is no version, a
placeholder such as 1.0 can be used.
- $(package)_download_path:
+
+ $(package)_download_path:
Location of the upstream source, without the file-name. Usually http or
ftp.
- $(package)_file_name:
+
+ $(package)_file_name:
The upstream source filename available at the download path.
- $(package)_sha256_hash:
+
+ $(package)_sha256_hash:
The sha256 hash of the upstream file
These variables are optional:
- $(package)_build_subdir:
+
+ $(package)_build_subdir:
cd to this dir before running configure/build/stage commands.
- $(package)_download_file:
+
+ $(package)_download_file:
The file-name of the upstream source if it differs from how it should be
stored locally. This can be used to avoid storing file-names with strange
characters.
- $(package)_dependencies:
+
+ $(package)_dependencies:
Names of any other packages that this one depends on.
- $(package)_patches:
+
+ $(package)_patches:
Filenames of any patches needed to build the package
+ $(package)_extra_sources:
+ Any extra files that will be fetched via $(package)_fetch_cmds. These are
+ specified so that they can be fetched and verified via 'make download'.
+
-Build Variables:
+## Build Variables:
After defining the main identifiers, build variables may be added or customized
before running the build commands. They should be added to a function called
$(package)_set_vars. For example:
-define $(package)_set_vars
-...
-endef
+ define $(package)_set_vars
+ ...
+ endef
Most variables can be prefixed with the host, architecture, or both, to make
the modifications specific to that case. For example:
- Universal: $(package)_cc=gcc
- Linux only: $(package)_linux_cc=gcc
- x86_64 only: $(package)_x86_64_cc = gcc
- x86_64 linux only: $(package)_x86_64_linux_cc = gcc
+ Universal: $(package)_cc=gcc
+ Linux only: $(package)_linux_cc=gcc
+ x86_64 only: $(package)_x86_64_cc = gcc
+ x86_64 linux only: $(package)_x86_64_linux_cc = gcc
These variables may be set to override or append their default values.
- $(package)_cc
- $(package)_cxx
- $(package)_objc
- $(package)_objcxx
- $(package)_ar
- $(package)_ranlib
- $(package)_libtool
- $(package)_nm
- $(package)_cflags
- $(package)_cxxflags
- $(package)_ldflags
- $(package)_cppflags
- $(package)_config_env
- $(package)_build_env
- $(package)_stage_env
- $(package)_build_opts
- $(package)_config_opts
+
+ $(package)_cc
+ $(package)_cxx
+ $(package)_objc
+ $(package)_objcxx
+ $(package)_ar
+ $(package)_ranlib
+ $(package)_libtool
+ $(package)_nm
+ $(package)_cflags
+ $(package)_cxxflags
+ $(package)_ldflags
+ $(package)_cppflags
+ $(package)_config_env
+ $(package)_build_env
+ $(package)_stage_env
+ $(package)_build_opts
+ $(package)_config_opts
The *_env variables are used to add environment variables to the respective
commands.
Many variables respect a debug/release suffix as well, in order to use them for
only the appropriate build config. For example:
- $(package)_cflags_release = -O3
- $(package)_cflags_i686_debug = -g
- $(package)_config_opts_release = --disable-debug
+
+ $(package)_cflags_release = -O3
+ $(package)_cflags_i686_debug = -g
+ $(package)_config_opts_release = --disable-debug
These will be used in addition to the options that do not specify
debug/release. All builds are considered to be release unless DEBUG=1 is set by
-the user.
+the user. Other variables may be defined as needed.
-Other variables may be defined as needed.
-
-Build commands:
+## Build commands:
For each build, a unique build dir and staging dir are created. For example,
- work/build/mylib/1.0-1adac830f6e and work/staging/mylib/1.0-1adac830f6e.
+ `work/build/mylib/1.0-1adac830f6e` and `work/staging/mylib/1.0-1adac830f6e`.
The following build commands are available for each recipe:
- $(package)_fetch_cmds:
+ $(package)_fetch_cmds:
Runs from: build dir
Fetch the source file. If undefined, it will be fetched and verified
against its hash.
- $(package)_extract_cmds:
+
+ $(package)_extract_cmds:
Runs from: build dir
Verify the source file against its hash and extract it. If undefined, the
source is assumed to be a tarball.
- $(package)_preprocess_cmds:
+
+ $(package)_preprocess_cmds:
Runs from: build dir/$(package)_build_subdir
Preprocess the source as necessary. If undefined, does nothing.
- $(package)_config_cmds:
+
+ $(package)_config_cmds:
Runs from: build dir/$(package)_build_subdir
Configure the source. If undefined, does nothing.
- $(package)_build_cmds:
+
+ $(package)_build_cmds:
Runs from: build dir/$(package)_build_subdir
Build the source. If undefined, does nothing.
- $(package)_stage_cmds:
+
+ $(package)_stage_cmds:
Runs from: build dir/$(package)_build_subdir
Stage the build results. If undefined, does nothing.
The following variables are available for each recipe:
- $(1)_staging_dir: package's destination sysroot path
- $(1)_staging_prefix_dir: prefix path inside of the package's staging dir
- $(1)_extract_dir: path to the package's extracted sources
- $(1)_build_dir: path where configure/build/stage commands will be run
- $(1)_patch_dir: path where the package's patches (if any) are found
+
+ $(1)_staging_dir: package's destination sysroot path
+ $(1)_staging_prefix_dir: prefix path inside of the package's staging dir
+ $(1)_extract_dir: path to the package's extracted sources
+ $(1)_build_dir: path where configure/build/stage commands will be run
+ $(1)_patch_dir: path where the package's patches (if any) are found
Notes on build commands:
@@ -125,4 +143,5 @@ configure step to (usually) correctly configure automatically. Any
$($(package)_config_opts) will be appended.
Most autotools projects can be properly staged using:
- $(MAKE) DESTDIR=$($(package)_staging_dir) install
+
+ $(MAKE) DESTDIR=$($(package)_staging_dir) install
diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk
index f50828c546..e7aa48ddf8 100644
--- a/depends/packages/boost.mk
+++ b/depends/packages/boost.mk
@@ -3,7 +3,7 @@ $(package)_version=1_55_0
$(package)_download_path=http://sourceforge.net/projects/boost/files/boost/1.55.0
$(package)_file_name=$(package)_$($(package)_version).tar.bz2
$(package)_sha256_hash=fff00023dd79486d444c8e29922f4072e1d451fc5a4d2b6075852ead7f2b7b52
-$(package)_patches=darwin_boost_atomic-1.patch darwin_boost_atomic-2.patch
+$(package)_patches=darwin_boost_atomic-1.patch darwin_boost_atomic-2.patch gcc_5_no_cxx11.patch
define $(package)_set_vars
$(package)_config_opts_release=variant=release
@@ -28,6 +28,7 @@ endef
define $(package)_preprocess_cmds
patch -p2 < $($(package)_patch_dir)/darwin_boost_atomic-1.patch && \
patch -p2 < $($(package)_patch_dir)/darwin_boost_atomic-2.patch && \
+ patch -p2 < $($(package)_patch_dir)/gcc_5_no_cxx11.patch && \
echo "using $(boost_toolset_$(host_os)) : : $($(package)_cxx) : <cxxflags>\"$($(package)_cxxflags) $($(package)_cppflags)\" <linkflags>\"$($(package)_ldflags)\" <archiver>\"$(boost_archiver_$(host_os))\" <striper>\"$(host_STRIP)\" <ranlib>\"$(host_RANLIB)\" <rc>\"$(host_WINDRES)\" : ;" > user-config.jam
endef
diff --git a/depends/packages/native_cctools.mk b/depends/packages/native_cctools.mk
index 951ad4fb29..1c1bcf199a 100644
--- a/depends/packages/native_cctools.mk
+++ b/depends/packages/native_cctools.mk
@@ -9,6 +9,8 @@ $(package)_clang_download_path=http://llvm.org/releases/$($(package)_clang_versi
$(package)_clang_download_file=clang+llvm-$($(package)_clang_version)-amd64-Ubuntu-12.04.2.tar.gz
$(package)_clang_file_name=clang-llvm-$($(package)_clang_version)-amd64-Ubuntu-12.04.2.tar.gz
$(package)_clang_sha256_hash=60d8f69f032d62ef61bf527857ebb933741ec3352d4d328c5516aa520662dab7
+$(package)_extra_sources=$($(package)_clang_file_name)
+
define $(package)_fetch_cmds
$(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_file),$($(package)_file_name),$($(package)_sha256_hash)) && \
$(call fetch_file,$(package),$($(package)_clang_download_path),$($(package)_clang_download_file),$($(package)_clang_file_name),$($(package)_clang_sha256_hash))
diff --git a/depends/packages/native_comparisontool.mk b/depends/packages/native_comparisontool.mk
index d1b86dc2de..e0ae0cec70 100644
--- a/depends/packages/native_comparisontool.mk
+++ b/depends/packages/native_comparisontool.mk
@@ -1,8 +1,8 @@
package=native_comparisontool
-$(package)_version=0f7b5d8
-$(package)_download_path=https://github.com/TheBlueMatt/test-scripts/raw/38b490a2599d422b12d5ce8f165792f63fd8f54f
+$(package)_version=8c6666f
+$(package)_download_path=https://github.com/theuni/bitcoind-comparisontool/raw/master
$(package)_file_name=pull-tests-$($(package)_version).jar
-$(package)_sha256_hash=ecd43b988a8b673b483e4f69f931596360a5e90fc415c75c4c259faa690df198
+$(package)_sha256_hash=a865332b3827abcde684ab79f5f43c083b0b6a4c97ff5508c79f29fee24f11cd
$(package)_install_dirname=BitcoindComparisonTool_jar
$(package)_install_filename=BitcoindComparisonTool.jar
diff --git a/depends/patches/boost/gcc_5_no_cxx11.patch b/depends/patches/boost/gcc_5_no_cxx11.patch
new file mode 100644
index 0000000000..04514c593a
--- /dev/null
+++ b/depends/patches/boost/gcc_5_no_cxx11.patch
@@ -0,0 +1,37 @@
+From eec808554936ae068b23df07ab54d4dc6302a695 Mon Sep 17 00:00:00 2001
+From: jzmaddock <jzmaddock@gmail.com>
+Date: Sat, 23 Aug 2014 09:38:02 +0100
+Subject: [PATCH] Fix BOOST_NO_CXX11_VARIADIC_TEMPLATES definition - the
+ feature was introduced in GCC 4.4.
+
+---
+ include/boost/config/compiler/gcc.hpp | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+diff --git a/include/boost/config/compiler/gcc.hpp b/include/boost/config/compiler/gcc.hpp
+index f37159d..97d8a18 100644
+--- a/include/boost/config/compiler/gcc.hpp
++++ b/include/boost/config/compiler/gcc.hpp
+@@ -154,14 +154,6 @@
+ # define BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+ # define BOOST_NO_CXX11_RVALUE_REFERENCES
+ # define BOOST_NO_CXX11_STATIC_ASSERT
+-
+-// Variadic templates compiler:
+-// http://www.generic-programming.org/~dgregor/cpp/variadic-templates.html
+-# if defined(__VARIADIC_TEMPLATES) || (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4) && defined(__GXX_EXPERIMENTAL_CXX0X__))
+-# define BOOST_HAS_VARIADIC_TMPL
+-# else
+-# define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+-# endif
+ #endif
+
+ // C++0x features in 4.4.n and later
+@@ -176,6 +168,7 @@
+ # define BOOST_NO_CXX11_DELETED_FUNCTIONS
+ # define BOOST_NO_CXX11_TRAILING_RESULT_TYPES
+ # define BOOST_NO_CXX11_INLINE_NAMESPACES
++# define BOOST_NO_CXX11_VARIADIC_TEMPLATES
+ #endif
+
+ #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
diff --git a/doc/Doxyfile b/doc/Doxyfile
index 8a11d1e8d0..925a33ee89 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -34,7 +34,7 @@ PROJECT_NAME = Bitcoin
# This could be handy for archiving the generated documentation or
# if some version control system is used.
-PROJECT_NUMBER = 0.10.99
+PROJECT_NUMBER = 0.11.99
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer
diff --git a/doc/README.md b/doc/README.md
index 0ade8f9923..ecddf50d4b 100644
--- a/doc/README.md
+++ b/doc/README.md
@@ -1,4 +1,4 @@
-Bitcoin Core 0.10.99
+Bitcoin Core 0.11.99
=====================
Setup
@@ -43,6 +43,7 @@ The following are developer notes on how to build Bitcoin on your native platfor
- [OSX Build Notes](build-osx.md)
- [Unix Build Notes](build-unix.md)
+- [Gitian Building Guide](gitian-building.md)
Development
---------------------
@@ -54,7 +55,11 @@ The Bitcoin repo's [root README](https://github.com/bitcoin/bitcoin/blob/master/
- [Release Process](release-process.md)
- [Source Code Documentation (External Link)](https://dev.visucore.com/bitcoin/doxygen/)
- [Translation Process](translation_process.md)
+- [Translation Strings Policy](translation_strings_policy.md)
- [Unit Tests](unit-tests.md)
+- [Unauthenticated REST Interface](REST-interface.md)
+- [BIPS](bips.md)
+- [Dnsseed Policy](dnsseed-policy.md)
### Resources
* Discuss on the [BitcoinTalk](https://bitcointalk.org/) forums, in the [Development & Technical Discussion board](https://bitcointalk.org/index.php?board=6.0).
diff --git a/doc/README_osx.txt b/doc/README_osx.txt
index 6c0c21c190..a572c7a241 100644
--- a/doc/README_osx.txt
+++ b/doc/README_osx.txt
@@ -1,6 +1,6 @@
Deterministic OSX Dmg Notes.
-Working OSX DMG's are created in Linux by combining a recent clang,
+Working OSX DMGs are created in Linux by combining a recent clang,
the Apple's binutils (ld, ar, etc), and DMG authoring tools.
Apple uses clang extensively for development and has upstreamed the necessary
@@ -30,7 +30,7 @@ originally done in toolchain4.
To complicate things further, all builds must target an Apple SDK. These SDKs
are free to download, but not redistributable.
To obtain it, register for a developer account, then download the XCode 6.1.1 dmg:
-https://developer.apple.com/downloads/download.action?path=Developer_Tools/xcode_6.1.1/xcode_6.1.1.dmg
+https://developer.apple.com/devcenter/download.action?path=/Developer_Tools/xcode_6.1.1/xcode_6.1.1.dmg
This file is several gigabytes in size, but only a single directory inside is
needed: Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
@@ -58,7 +58,7 @@ libdmg-hfsplus project is used to compress it. There are several bugs in this
tool and its maintainer has seemingly abandoned the project. It has been forked
and is available (with fixes) here: https://github.com/theuni/libdmg-hfsplus .
-The 'dmg' tool has the ability to create DMG's from scratch as well, but this
+The 'dmg' tool has the ability to create DMGs from scratch as well, but this
functionality is broken. Only the compression feature is currently used.
Ideally, the creation could be fixed and genisoimage would no longer be necessary.
diff --git a/doc/README_windows.txt b/doc/README_windows.txt
index c582941696..e4fd9bdf90 100644
--- a/doc/README_windows.txt
+++ b/doc/README_windows.txt
@@ -1,4 +1,4 @@
-Bitcoin Core 0.10.99
+Bitcoin Core 0.11.99
=====================
Intro
diff --git a/doc/REST-interface.md b/doc/REST-interface.md
index 23154ee903..2219ceb65f 100644
--- a/doc/REST-interface.md
+++ b/doc/REST-interface.md
@@ -5,15 +5,18 @@ The REST API can be enabled with the `-rest` option.
Supported API
-------------
-`GET /rest/tx/TX-HASH.{bin|hex|json}`
+
+####Transactions
+`GET /rest/tx/<TX-HASH>.<bin|hex|json>`
Given a transaction hash,
Returns a transaction, in binary, hex-encoded binary or JSON formats.
For full TX query capability, one must enable the transaction index via "txindex=1" command line / configuration option.
-`GET /rest/block/BLOCK-HASH.{bin|hex|json}`
-`GET /rest/block/notxdetails/BLOCK-HASH.{bin|hex|json}`
+####Blocks
+`GET /rest/block/<BLOCK-HASH>.<bin|hex|json>`
+`GET /rest/block/notxdetails/<BLOCK-HASH>.<bin|hex|json>`
Given a block hash,
Returns a block, in binary, hex-encoded binary or JSON formats.
@@ -22,6 +25,15 @@ The HTTP request and response are both handled entirely in-memory, thus making m
With the /notxdetails/ option JSON response will only contain the transaction hash instead of the complete transaction details. The option only affects the JSON response.
+####Blockheaders
+`GET /rest/headers/<COUNT>/<BLOCK-HASH>.<bin|hex>`
+
+Given a block hash,
+Returns <COUNT> amount of blockheaders in upward direction.
+
+JSON is not supported.
+
+####Chaininfos
`GET /rest/chaininfo.json`
Returns various state info regarding block chain processing.
@@ -34,6 +46,39 @@ Only supports JSON as output format.
* verificationprogress : (numeric) estimate of verification progress [0..1]
* chainwork : (string) total amount of work in active chain, in hexadecimal
+####Query UTXO set
+`GET /rest/getutxos/<checkmempool>/<txid>-<n>/<txid>-<n>/.../<txid>-<n>.<bin|hex|json>`
+
+The getutxo command allows querying of the UTXO set given a set of outpoints.
+See BIP64 for input and output serialisation:
+https://github.com/bitcoin/bips/blob/master/bip-0064.mediawiki
+
+Example:
+```
+$ curl localhost:18332/rest/getutxos/checkmempool/b2cdfd7b89def827ff8af7cd9bff7627ff72e5e8b0f71210f92ea7a4000c5d75-0.json 2>/dev/null | json_pp
+{
+ "chaintipHash" : "00000000fb01a7f3745a717f8caebee056c484e6e0bfe4a9591c235bb70506fb",
+ "chainHeight" : 325347,
+ "utxos" : [
+ {
+ "scriptPubKey" : {
+ "addresses" : [
+ "mi7as51dvLJsizWnTMurtRmrP8hG2m1XvD"
+ ],
+ "type" : "pubkeyhash",
+ "hex" : "76a9141c7cebb529b86a04c683dfa87be49de35bcf589e88ac",
+ "reqSigs" : 1,
+ "asm" : "OP_DUP OP_HASH160 1c7cebb529b86a04c683dfa87be49de35bcf589e OP_EQUALVERIFY OP_CHECKSIG"
+ },
+ "value" : 8.8687,
+ "height" : 2147483647,
+ "txvers" : 1
+ }
+ ],
+ "bitmap" : "1"
+}
+```
+
Risks
-------------
-Running a webbrowser on the same node with a REST enabled bitcoind can be a risk. Accessing prepared XSS websites could read out tx/block data of your node by placing links like `<script src="http://127.0.0.1:1234/tx/json/1234567890">` which might break the nodes privacy. \ No newline at end of file
+Running a webbrowser on the same node with a REST enabled bitcoind can be a risk. Accessing prepared XSS websites could read out tx/block data of your node by placing links like `<script src="http://127.0.0.1:8332/rest/tx/1234567890.json">` which might break the nodes privacy.
diff --git a/doc/assets-attribution.md b/doc/assets-attribution.md
index c860cdc534..ebba64a61a 100644
--- a/doc/assets-attribution.md
+++ b/doc/assets-attribution.md
@@ -22,6 +22,7 @@ The following is a list of assets used in the bitcoin source and their proper at
src/qt/res/icons/receive.png, src/qt/res/icons/remove.png,
src/qt/res/icons/send.png, src/qt/res/icons/synced.png,
src/qt/res/icons/transaction*.png, src/qt/res/icons/tx_output.png,
+ src/qt/res/icons/warning.png
Jonas Schnelli
-----------------------
diff --git a/doc/bips.md b/doc/bips.md
index 579eadfff3..90e98ed419 100644
--- a/doc/bips.md
+++ b/doc/bips.md
@@ -11,7 +11,7 @@ BIPs that are implemented by Bitcoin Core (up-to-date up to **v0.10.0**):
* [`BIP 31`](https://github.com/bitcoin/bips/blob/master/bip-0031.mediawiki): The 'pong' protocol message (and the protocol version bump to 60001) has been implemented since **v0.6.1** ([PR #1081](https://github.com/bitcoin/bitcoin/pull/1081)).
* [`BIP 34`](https://github.com/bitcoin/bips/blob/master/bip-0034.mediawiki): The rule that requires blocks to contain their height (number) in the coinbase input, and the introduction of version 2 blocks has been implemented since **v0.7.0**. The rule took effect for version 2 blocks as of *block 224413* (March 5th 2013), and version 1 blocks are no longer allowed since *block 227931* (March 25th 2013) ([PR #1526](https://github.com/bitcoin/bitcoin/pull/1526)).
* [`BIP 35`](https://github.com/bitcoin/bips/blob/master/bip-0035.mediawiki): The 'mempool' protocol message (and the protocol version bump to 60002) has been implemented since **v0.7.0** ([PR #1641](https://github.com/bitcoin/bitcoin/pull/1641)).
-* [`BIP 37`](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki): The bloom filtering for transaction relaying, partial merkle trees for blocks , and the protocol version bump to 70001 (enabling low-bandwidth SPV clients) has been implemented since **v0.8.0** ([PR #1795](https://github.com/bitcoin/bitcoin/pull/1795)).
+* [`BIP 37`](https://github.com/bitcoin/bips/blob/master/bip-0037.mediawiki): The bloom filtering for transaction relaying, partial merkle trees for blocks, and the protocol version bump to 70001 (enabling low-bandwidth SPV clients) has been implemented since **v0.8.0** ([PR #1795](https://github.com/bitcoin/bitcoin/pull/1795)).
* [`BIP 42`](https://github.com/bitcoin/bips/blob/master/bip-0042.mediawiki): The bug that would have caused the subsidy schedule to resume after block 13440000 was fixed in **v0.9.2** ([PR #3842](https://github.com/bitcoin/bitcoin/pull/3842)).
* [`BIP 61`](https://github.com/bitcoin/bips/blob/master/bip-0061.mediawiki): The 'reject' protocol message (and the protocol version bump to 70002) was added in **v0.9.0** ([PR #3185](https://github.com/bitcoin/bitcoin/pull/3185)).
* [`BIP 66`](https://github.com/bitcoin/bips/blob/master/bip-0066.mediawiki): The strict DER rules and associated version 3 blocks have been implemented since **v0.10.0** ([PR #5713](https://github.com/bitcoin/bitcoin/pull/5713)).
diff --git a/doc/build-osx.md b/doc/build-osx.md
index d6e93cb23d..dc319dd1c4 100644
--- a/doc/build-osx.md
+++ b/doc/build-osx.md
@@ -1,6 +1,6 @@
Mac OS X Build Instructions and Notes
====================================
-This guide will show you how to build bitcoind(headless client) for OSX.
+This guide will show you how to build bitcoind (headless client) for OSX.
Notes
-----
@@ -32,33 +32,10 @@ Instructions: Homebrew
#### Install dependencies using Homebrew
- brew install autoconf automake libtool boost miniupnpc openssl pkg-config protobuf qt5
+ brew install autoconf automake berkeley-db4 libtool boost miniupnpc openssl pkg-config protobuf qt5
NOTE: Building with Qt4 is still supported, however, could result in a broken UI. As such, building with Qt5 is recommended.
-#### Installing berkeley-db4 using Homebrew
-
-The homebrew package for berkeley-db4 has been broken for some time. It will install without Java though.
-
-Running this command takes you into brew's interactive mode, which allows you to configure, make, and install by hand:
-```
-$ brew install https://raw.github.com/homebrew/homebrew/master/Library/Formula/berkeley-db4.rb -–without-java
-```
-
-The rest of these commands are run inside brew interactive mode:
-```
-/private/tmp/berkeley-db4-UGpd0O/db-4.8.30 $ cd ..
-/private/tmp/berkeley-db4-UGpd0O $ db-4.8.30/dist/configure --prefix=/usr/local/Cellar/berkeley-db4/4.8.30 --mandir=/usr/local/Cellar/berkeley-db4/4.8.30/share/man --enable-cxx
-/private/tmp/berkeley-db4-UGpd0O $ make
-/private/tmp/berkeley-db4-UGpd0O $ make install
-/private/tmp/berkeley-db4-UGpd0O $ exit
-```
-
-After exiting, you'll get a warning that the install is keg-only, which means it wasn't symlinked to `/usr/local`. You don't need it to link it to build bitcoin, but if you want to, here's how:
-
- $ brew link --force berkeley-db4
-
-
### Building `bitcoind`
1. Clone the github tree to get the source code and go into the directory.
diff --git a/doc/build-unix.md b/doc/build-unix.md
index 0984f689a8..f70bf7f1fe 100644
--- a/doc/build-unix.md
+++ b/doc/build-unix.md
@@ -195,12 +195,12 @@ Hardening enables the following features:
* Position Independent Executable
Build position independent code to take advantage of Address Space Layout Randomization
- offered by some kernels. An attacker who is able to cause execution of code at an arbitrary
- memory location is thwarted if he or she doesn't know where anything useful is located.
+ offered by some kernels. Attackers who can cause execution of code at an arbitrary memory
+ location are thwarted if they don't know where anything useful is located.
The stack and heap are randomly located by default but this allows the code section to be
randomly located as well.
- On an Amd64 processor where a library was not compiled with -fPIC, this will cause an error
+ On an AMD64 processor where a library was not compiled with -fPIC, this will cause an error
such as: "relocation R_X86_64_32 against `......' can not be used when making a shared object;"
To test that you have built PIE executable, install scanelf, part of paxutils, and use:
diff --git a/doc/developer-notes.md b/doc/developer-notes.md
index eaeb90da1d..7d3d78adfc 100644
--- a/doc/developer-notes.md
+++ b/doc/developer-notes.md
@@ -53,7 +53,7 @@ bool function(int arg1, const char *arg2)
```
A complete list of `@xxx` commands can be found at http://www.stack.nl/~dimitri/doxygen/manual/commands.html.
As Doxygen recognizes the comments by the delimiters (`/**` and `*/` in this case), you don't
-*need* to provide any commands for a comment to be valid, just a description text is fine.
+*need* to provide any commands for a comment to be valid; just a description text is fine.
To describe a class use the same construct above the class definition:
```c++
@@ -102,7 +102,7 @@ CXXFLAGS="-g -ggdb -O0" or whatever debug flags you need.
If the code is behaving strangely, take a look in the debug.log file in the data directory;
error and debugging messages are written there.
-The -debug=... command-line option controls debugging; running with just -debug will turn
+The -debug=... command-line option controls debugging; running with just -debug or -debug=1 will turn
on all categories (and give you a very large debug.log file).
The Qt code routes qDebug() output to debug.log under category "qt": run with -debug=qt
@@ -175,7 +175,7 @@ Threads
Pull Request Terminology
------------------------
-Concept ACK - Agree with the idea and overall direction, but haven't reviewed the code changes or tested them.
+Concept ACK - Agree with the idea and overall direction, but have neither reviewed nor tested the code changes.
utACK (untested ACK) - Reviewed and agree with the code changes but haven't actually tested them.
@@ -183,4 +183,4 @@ Tested ACK - Reviewed the code changes and have verified the functionality or bu
ACK - A loose ACK can be confusing. It's best to avoid them unless it's a documentation/comment only change in which case there is nothing to test/verify; therefore the tested/untested distinction is not there.
-NACK - Disagree with the code changes/concept. Should be accompanied by an explanation.
+NACK - Disagree with the code changes/concept. Should be accompanied by an explanation.
diff --git a/doc/dnsseed-policy.md b/doc/dnsseed-policy.md
index 66a1757ac5..814ae3876a 100644
--- a/doc/dnsseed-policy.md
+++ b/doc/dnsseed-policy.md
@@ -7,19 +7,17 @@ As such, DNS seeds must be run by entities which have some minimum
level of trust within the Bitcoin community.
Other implementations of Bitcoin software may also use the same
-seeds and may be more exposed. In light of this exposure this
-document establishes some basic expectations for the expectations
-for the operation of dnsseeds.
+seeds and may be more exposed. In light of this exposure, this
+document establishes some basic expectations for operating dnsseeds.
-0. A DNS seed operating organization or person is expected
-to follow good host security practices and maintain control of
-their serving infrastructure and not sell or transfer control of their
-DNS seed. Any hosting services contracted by the operator are
-equally expected to uphold these expectations.
+0. A DNS seed operating organization or person is expected to follow good
+host security practices, maintain control of applicable infrastructure,
+and not sell or transfer control of the DNS seed. Any hosting services
+contracted by the operator are equally expected to uphold these expectations.
1. The DNS seed results must consist exclusively of fairly selected and
functioning Bitcoin nodes from the public network to the best of the
-operators understanding and capability.
+operator's understanding and capability.
2. For the avoidance of doubt, the results may be randomized but must not
single-out any group of hosts to receive different results unless due to an
@@ -29,7 +27,7 @@ urgent technical necessity and disclosed.
4. Any logging of DNS queries should be only that which is necessary
for the operation of the service or urgent health of the Bitcoin
-network and must not be retained longer than necessary or disclosed
+network and must not be retained longer than necessary nor disclosed
to any third party.
5. Information gathered as a result of the operators node-spidering
@@ -45,7 +43,8 @@ related to the DNS seed operation.
If these expectations cannot be satisfied the operator should
discontinue providing services and contact the active Bitcoin
-Core development team as well as posting on bitcoin-development.
+Core development team as well as posting on
+[bitcoin-dev](https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev).
Behavior outside of these expectations may be reasonable in some
situations but should be discussed in public in advance.
diff --git a/doc/gitian-building.md b/doc/gitian-building.md
index 25d3b8390c..1fa5b5f989 100644
--- a/doc/gitian-building.md
+++ b/doc/gitian-building.md
@@ -74,11 +74,11 @@ In the VirtualBox GUI click "Create" and choose the following parameters in the
- Disk size: at least 40GB; as low as 20GB *may* be possible, but better to err on the safe side
- Push the `Create` button
-Get the [Debian 7.7 net installer](http://cdimage.debian.org/debian-cd/7.7.0/amd64/iso-cd/debian-7.7.0-amd64-netinst.iso) (a more recent minor version should also work, see also [Debian Network installation](https://www.debian.org/CD/netinst/)).
+Get the [Debian 7.8 net installer](http://cdimage.debian.org/debian-cd/7.8.0/amd64/iso-cd/debian-7.8.0-amd64-netinst.iso) (a more recent minor version should also work, see also [Debian Network installation](https://www.debian.org/CD/netinst/)).
This DVD image can be validated using a SHA256 hashing tool, for example on
Unixy OSes by entering the following in a terminal:
- echo "d440e85b4121f94608748139f25dbce1ad36771348b002fe07d4d44b9d9e623f debian-7.7.0-amd64-netinst.iso" | sha256sum -c
+ echo "e39c36d6adc0fd86c6edb0e03e22919086c883b37ca194d063b8e3e8f6ff6a3a debian-7.8.0-amd64-netinst.iso" | sha256sum -c
# (must return OK)
After creating the VM, we need to configure it.
@@ -87,7 +87,7 @@ After creating the VM, we need to configure it.
![](gitian-building/network_settings.png)
-- Click `Advanced`, then `Port Forwarding`. We want to set up a port through where we can reach the VM to get files in and out.
+- Click `Advanced`, then `Port Forwarding`. We want to set up a port through which we can reach the VM to get files in and out.
- Create a new rule by clicking the plus icon.
![](gitian-building/port_forwarding_rules.png)
@@ -111,7 +111,7 @@ Installing Debian
This section will explain how to install Debian on the newly created VM.
-- Choose the non-graphical installer. We do not need the graphical environment, it will only increase installation time and disk usage.
+- Choose the non-graphical installer. We do not need the graphical environment; it will only increase installation time and disk usage.
![](gitian-building/debian_install_1_boot_menu.png)
@@ -144,7 +144,7 @@ and proceed, just press `Enter`. To select a different button, press `Tab`.
![](gitian-building/debian_install_9_user_password.png)
-- The installer will set up the clock using a time server, this process should be automatic
+- The installer will set up the clock using a time server; this process should be automatic
- Set up the clock: choose a time zone (depends on the locale settings that you picked earlier; specifics don't matter)
![](gitian-building/debian_install_10_configure_clock.png)
@@ -371,7 +371,7 @@ COMMIT=2014_03_windows_unicode_path
Signing externally
-------------------
-If you want to do the PGP signing on another device that's also possible; just define `SIGNER` as mentioned
+If you want to do the PGP signing on another device, that's also possible; just define `SIGNER` as mentioned
and follow the steps in the build process as normal.
gpg: skipped "laanwj": secret key not available
@@ -393,4 +393,4 @@ Uploading signatures
After building and signing you can push your signatures (both the `.assert` and `.assert.sig` files) to the
[bitcoin/gitian.sigs](https://github.com/bitcoin/gitian.sigs/) repository, or if that's not possible create a pull
-request. You can also mail the files to me (laanwj@gmail.com) and I'll commit them.
+request. You can also mail the files to Wladimir (laanwj@gmail.com) and he will commit them.
diff --git a/doc/img/bootstrap1.png b/doc/img/bootstrap1.png
deleted file mode 100644
index 075930791b..0000000000
--- a/doc/img/bootstrap1.png
+++ /dev/null
Binary files differ
diff --git a/doc/img/bootstrap2.png b/doc/img/bootstrap2.png
deleted file mode 100644
index 6461f81810..0000000000
--- a/doc/img/bootstrap2.png
+++ /dev/null
Binary files differ
diff --git a/doc/img/bootstrap4.png b/doc/img/bootstrap4.png
deleted file mode 100644
index ad69737922..0000000000
--- a/doc/img/bootstrap4.png
+++ /dev/null
Binary files differ
diff --git a/doc/img/bootstrap5.png b/doc/img/bootstrap5.png
deleted file mode 100644
index d8d9baaf37..0000000000
--- a/doc/img/bootstrap5.png
+++ /dev/null
Binary files differ
diff --git a/doc/init.md b/doc/init.md
index 871bdc8123..1f206a6c02 100644
--- a/doc/init.md
+++ b/doc/init.md
@@ -63,7 +63,7 @@ can then be controlled by group membership.
4a) systemd
-Installing this .service file consists on just copying it to
+Installing this .service file consists of just copying it to
/usr/lib/systemd/system directory, followed by the command
"systemctl daemon-reload" in order to update running systemd configuration.
diff --git a/doc/release-notes.md b/doc/release-notes.md
index 1cb517e5c7..6bb8587d78 100644
--- a/doc/release-notes.md
+++ b/doc/release-notes.md
@@ -1,3 +1,39 @@
(note: this is a temporary file, to be added-to by anybody, and moved to
release-notes at release time)
+Notable changes
+===============
+
+Example header
+----------------------
+
+Example content.
+
+0.12.0 Change log
+=================
+
+Detailed release notes follow. This overview includes changes that affect
+behavior, not code moves, refactors and string updates. For convenience in locating
+the code changes and accompanying discussion, both the pull request and
+git merge commit are mentioned.
+
+### RPC and REST
+
+### Configuration and command-line options
+
+### Block and transaction handling
+
+### P2P protocol and network code
+
+### Validation
+
+### Build system
+
+### Wallet
+
+### GUI
+
+### Tests
+
+### Miscellaneous
+
diff --git a/doc/release-notes/release-notes-0.10.1.md b/doc/release-notes/release-notes-0.10.1.md
new file mode 100644
index 0000000000..5e939600a0
--- /dev/null
+++ b/doc/release-notes/release-notes-0.10.1.md
@@ -0,0 +1,143 @@
+Bitcoin Core version 0.10.1 is now available from:
+
+ <https://bitcoin.org/bin/bitcoin-core-0.10.1/>
+
+This is a new minor version release, bringing bug fixes and translation
+updates. It is recommended to upgrade to this version.
+
+Please report bugs using the issue tracker at github:
+
+ <https://github.com/bitcoin/bitcoin/issues>
+
+Upgrading and downgrading
+=========================
+
+How to Upgrade
+--------------
+
+If you are running an older version, shut it down. Wait until it has completely
+shut down (which might take a few minutes for older versions), then run the
+installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or
+bitcoind/bitcoin-qt (on Linux).
+
+Downgrade warning
+------------------
+
+Because release 0.10.0 and later makes use of headers-first synchronization and
+parallel block download (see further), the block files and databases are not
+backwards-compatible with pre-0.10 versions of Bitcoin Core or other software:
+
+* Blocks will be stored on disk out of order (in the order they are
+received, really), which makes it incompatible with some tools or
+other programs. Reindexing using earlier versions will also not work
+anymore as a result of this.
+
+* The block index database will now hold headers for which no block is
+stored on disk, which earlier versions won't support.
+
+If you want to be able to downgrade smoothly, make a backup of your entire data
+directory. Without this your node will need start syncing (or importing from
+bootstrap.dat) anew afterwards. It is possible that the data from a completely
+synchronised 0.10 node may be usable in older versions as-is, but this is not
+supported and may break as soon as the older version attempts to reindex.
+
+This does not affect wallet forward or backward compatibility.
+
+Notable changes
+===============
+
+This is a minor release and hence there are no notable changes.
+For the notable changes in 0.10, refer to the release notes for the
+0.10.0 release at https://github.com/bitcoin/bitcoin/blob/v0.10.0/doc/release-notes.md
+
+0.10.1 Change log
+=================
+
+Detailed release notes follow. This overview includes changes that affect external
+behavior, not code moves, refactors or string updates.
+
+RPC:
+- `7f502be` fix crash: createmultisig and addmultisigaddress
+- `eae305f` Fix missing lock in submitblock
+
+Block (database) and transaction handling:
+- `1d2cdd2` Fix InvalidateBlock to add chainActive.Tip to setBlockIndexCandidates
+- `c91c660` fix InvalidateBlock to repopulate setBlockIndexCandidates
+- `002c8a2` fix possible block db breakage during re-index
+- `a1f425b` Add (optional) consistency check for the block chain data structures
+- `1c62e84` Keep mempool consistent during block-reorgs
+- `57d1f46` Fix CheckBlockIndex for reindex
+- `bac6fca` Set nSequenceId when a block is fully linked
+
+P2P protocol and network code:
+- `78f64ef` don't trickle for whitelisted nodes
+- `ca301bf` Reduce fingerprinting through timestamps in 'addr' messages.
+- `200f293` Ignore getaddr messages on Outbound connections.
+- `d5d8998` Limit message sizes before transfer
+- `aeb9279` Better fingerprinting protection for non-main-chain getdatas.
+- `cf0218f` Make addrman's bucket placement deterministic (countermeasure 1 against eclipse attacks, see http://cs-people.bu.edu/heilman/eclipse/)
+- `0c6f334` Always use a 50% chance to choose between tried and new entries (countermeasure 2 against eclipse attacks)
+- `214154e` Do not bias outgoing connections towards fresh addresses (countermeasure 2 against eclipse attacks)
+- `aa587d4` Scale up addrman (countermeasure 6 against eclipse attacks)
+- `139cd81` Cap nAttempts penalty at 8 and switch to pow instead of a division loop
+
+Validation:
+- `d148f62` Acquire CCheckQueue's lock to avoid race condition
+
+Build system:
+- `8752b5c` 0.10 fix for crashes on OSX 10.6
+
+Wallet:
+- N/A
+
+GUI:
+- `2c08406` some mac specifiy cleanup (memory handling, unnecessary code)
+- `81145a6` fix OSX dock icon window reopening
+- `786cf72` fix a issue where "command line options"-action overwrite "Preference"-action (on OSX)
+
+Tests:
+- `1117378` add RPC test for InvalidateBlock
+
+Miscellaneous:
+- `c9e022b` Initialization: set Boost path locale in main thread
+- `23126a0` Sanitize command strings before logging them.
+- `323de27` Initialization: setup environment before starting QT tests
+- `7494e09` Initialization: setup environment before starting tests
+- `df45564` Initialization: set fallback locale as environment variable
+
+Credits
+=======
+
+Thanks to everyone who directly contributed to this release:
+
+- Alex Morcos
+- Cory Fields
+- dexX7
+- fsb4000
+- Gavin Andresen
+- Gregory Maxwell
+- Ivan Pustogarov
+- Jonas Schnelli
+- Matt Corallo
+- mrbandrews
+- Pieter Wuille
+- Ruben de Vries
+- Suhas Daftuar
+- Wladimir J. van der Laan
+
+And all those who contributed additional code review and/or security research:
+- 21E14
+- Alison Kendler
+- Aviv Zohar
+- Ethan Heilman
+- Evil-Knievel
+- fanquake
+- Jeff Garzik
+- Jonas Nick
+- Luke Dashjr
+- Patrick Strateman
+- Philip Kaufmann
+- Sergio Demian Lerner
+- Sharon Goldberg
+
+As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/).
diff --git a/doc/release-notes/release-notes-0.10.2.md b/doc/release-notes/release-notes-0.10.2.md
new file mode 100644
index 0000000000..192ed69d29
--- /dev/null
+++ b/doc/release-notes/release-notes-0.10.2.md
@@ -0,0 +1,86 @@
+Bitcoin Core version 0.10.2 is now available from:
+
+ <https://bitcoin.org/bin/bitcoin-core-0.10.2/>
+
+This is a new minor version release, bringing minor bug fixes and translation
+updates. It is recommended to upgrade to this version.
+
+Please report bugs using the issue tracker at github:
+
+ <https://github.com/bitcoin/bitcoin/issues>
+
+Upgrading and downgrading
+=========================
+
+How to Upgrade
+--------------
+
+If you are running an older version, shut it down. Wait until it has completely
+shut down (which might take a few minutes for older versions), then run the
+installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or
+bitcoind/bitcoin-qt (on Linux).
+
+Downgrade warning
+------------------
+
+Because release 0.10.0 and later makes use of headers-first synchronization and
+parallel block download (see further), the block files and databases are not
+backwards-compatible with pre-0.10 versions of Bitcoin Core or other software:
+
+* Blocks will be stored on disk out of order (in the order they are
+received, really), which makes it incompatible with some tools or
+other programs. Reindexing using earlier versions will also not work
+anymore as a result of this.
+
+* The block index database will now hold headers for which no block is
+stored on disk, which earlier versions won't support.
+
+If you want to be able to downgrade smoothly, make a backup of your entire data
+directory. Without this your node will need start syncing (or importing from
+bootstrap.dat) anew afterwards. It is possible that the data from a completely
+synchronised 0.10 node may be usable in older versions as-is, but this is not
+supported and may break as soon as the older version attempts to reindex.
+
+This does not affect wallet forward or backward compatibility.
+
+Notable changes
+===============
+
+This fixes a serious problem on Windows with data directories that have non-ASCII
+characters (https://github.com/bitcoin/bitcoin/issues/6078).
+
+For other platforms there are no notable changes.
+
+For the notable changes in 0.10, refer to the release notes
+at https://github.com/bitcoin/bitcoin/blob/v0.10.0/doc/release-notes.md
+
+0.10.2 Change log
+=================
+
+Detailed release notes follow. This overview includes changes that affect external
+behavior, not code moves, refactors or string updates.
+
+Wallet:
+- `824c011` fix boost::get usage with boost 1.58
+
+Miscellaneous:
+- `da65606` Avoid crash on start in TestBlockValidity with gen=1.
+- `424ae66` don't imbue boost::filesystem::path with locale "C" on windows (fixes #6078)
+
+Credits
+=======
+
+Thanks to everyone who directly contributed to this release:
+
+- Cory Fields
+- Gregory Maxwell
+- Jonas Schnelli
+- Wladimir J. van der Laan
+
+And all those who contributed additional code review and/or security research:
+
+- dexX7
+- Pieter Wuille
+- vayvanne
+
+As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/).
diff --git a/doc/release-notes/release-notes-0.9.4.md b/doc/release-notes/release-notes-0.9.4.md
new file mode 100644
index 0000000000..7ee73246a9
--- /dev/null
+++ b/doc/release-notes/release-notes-0.9.4.md
@@ -0,0 +1,95 @@
+Bitcoin Core version 0.9.4 is now available from:
+
+ https://bitcoin.org/bin/0.9.4/
+
+This is a new minor version release, bringing only bug fixes and updated
+translations. Upgrading to this release is recommended.
+
+Please report bugs using the issue tracker at github:
+
+ https://github.com/bitcoin/bitcoin/issues
+
+How to Upgrade
+===============
+
+If you are running an older version, shut it down. Wait until it has completely
+shut down (which might take a few minutes for older versions), then run the
+installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or
+bitcoind/bitcoin-qt (on Linux).
+
+OpenSSL Warning
+================
+
+OpenSSL 1.0.0p / 1.0.1k was recently released and is being pushed out by
+various operating system maintainers. Review by Gregory Maxwell determined that
+this update is incompatible with the Bitcoin system and could lead to consensus
+forks.
+
+Bitcoin Core released binaries from https://bitcoin.org are unaffected,
+as are any built with the gitian deterministic build system.
+
+However, if you are running either
+
+- The Ubuntu PPA from https://launchpad.net/~bitcoin/+archive/ubuntu/bitcoin
+- A third-party or self-compiled Bitcoin Core
+
+upgrade to Bitcoin Core 0.9.4, which includes a workaround, **before** updating
+OpenSSL.
+
+The incompatibility is due to the OpenSSL update changing the
+behavior of ECDSA validation to reject any signature which is
+not encoded in a very rigid manner. This was a result of
+OpenSSL's change for CVE-2014-8275 "Certificate fingerprints
+can be modified".
+
+We are specifically aware of potential hard-forks due to signature
+encoding handling and had been hoping to close them via BIP62 in 0.10.
+BIP62's purpose is to improve transaction malleability handling and
+as a side effect rigidly defines the encoding for signatures, but the
+overall scope of BIP62 has made it take longer than we'd like to
+deploy.
+
+0.9.4 changelog
+================
+
+Validation:
+- `b8e81b7` consensus: guard against openssl's new strict DER checks
+- `60c51f1` fail immediately on an empty signature
+- `037bfef` Improve robustness of DER recoding code
+
+Command-line options:
+- `cd5164a` Make -proxy set all network types, avoiding a connect leak.
+
+P2P:
+- `bb424e4` Limit the number of new addressses to accumulate
+
+RPC:
+- `0a94661` Disable SSLv3 (in favor of TLS) for the RPC client and server.
+
+Build system:
+- `f047dfa` gitian: openssl-1.0.1i.tar.gz -> openssl-1.0.1k.tar.gz
+- `5b9f78d` build: Fix OSX build when using Homebrew and qt5
+- `ffab1dd` Keep symlinks when copying into .app bundle
+- `613247f` osx: fix signing to make Gatekeeper happy (again)
+
+Miscellaneous:
+- `25b49b5` Refactor -alertnotify code
+- `2743529` doc: Add instructions for consistent Mac OS X build names
+
+Credits
+--------
+
+Thanks to who contributed to this release, at least:
+
+- Cory Fields
+- Gavin Andresen
+- Gregory Maxwell
+- Jeff Garzik
+- Luke Dashjr
+- Matt Corallo
+- Pieter Wuille
+- Saivann
+- Sergio Demian Lerner
+- Wladimir J. van der Laan
+
+As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/).
diff --git a/doc/release-notes/release-notes-0.9.5.md b/doc/release-notes/release-notes-0.9.5.md
new file mode 100644
index 0000000000..bed0af9879
--- /dev/null
+++ b/doc/release-notes/release-notes-0.9.5.md
@@ -0,0 +1,60 @@
+Bitcoin Core version 0.9.5 is now available from:
+
+ https://bitcoin.org/bin/0.9.5/
+
+This is a new minor version release, with the goal of backporting BIP66. There
+are also a few bug fixes and updated translations. Upgrading to this release is
+recommended.
+
+Please report bugs using the issue tracker at github:
+
+ https://github.com/bitcoin/bitcoin/issues
+
+How to Upgrade
+===============
+
+If you are running an older version, shut it down. Wait until it has completely
+shut down (which might take a few minutes for older versions), then run the
+installer (on Windows) or just copy over /Applications/Bitcoin-Qt (on Mac) or
+bitcoind/bitcoin-qt (on Linux).
+
+Notable changes
+================
+
+Mining and relay policy enhancements
+------------------------------------
+
+Bitcoin Core's block templates are now for version 3 blocks only, and any mining
+software relying on its `getblocktemplate` must be updated in parallel to use
+libblkmaker either version 0.4.2 or any version from 0.5.1 onward.
+If you are solo mining, this will affect you the moment you upgrade Bitcoin
+Core, which must be done prior to BIP66 achieving its 951/1001 status.
+If you are mining with the stratum mining protocol: this does not affect you.
+If you are mining with the getblocktemplate protocol to a pool: this will affect
+you at the pool operator's discretion, which must be no later than BIP66
+achieving its 951/1001 status.
+
+0.9.5 changelog
+================
+
+- `74f29c2` Check pindexBestForkBase for null
+- `9cd1dd9` Fix priority calculation in CreateTransaction
+- `6b4163b` Sanitize command strings before logging them.
+- `3230b32` Raise version of created blocks, and enforce DERSIG in mempool
+- `989d499` Backport of some of BIP66's tests
+- `ab03660` Implement BIP 66 validation rules and switchover logic
+- `8438074` build: fix dynamic boost check when --with-boost= is used
+
+Credits
+--------
+
+Thanks to who contributed to this release, at least:
+
+- 21E14
+- Alex Morcos
+- Cory Fields
+- Gregory Maxwell
+- Pieter Wuille
+- Wladimir J. van der Laan
+
+As well as everyone that helped translating on [Transifex](https://www.transifex.com/projects/p/bitcoin/).
diff --git a/doc/release-process.md b/doc/release-process.md
index 5dad9bf5de..5ecb9334f5 100644
--- a/doc/release-process.md
+++ b/doc/release-process.md
@@ -25,7 +25,7 @@ Release Process
###update gitian
- In order to take advantage of the new caching features in gitian, be sure to update to a recent version (e9741525c or higher is recommended)
+ In order to take advantage of the new caching features in gitian, be sure to update to a recent version (`e9741525c` or later is recommended)
###perform gitian builds
@@ -41,10 +41,12 @@ Release Process
###fetch and build inputs: (first time, or when dependency versions change)
mkdir -p inputs
+ wget -P inputs https://bitcoincore.org/cfields/osslsigncode-Backports-to-1.7.1.patch
+ wget -P inputs http://downloads.sourceforge.net/project/osslsigncode/osslsigncode/osslsigncode-1.7.1.tar.gz
Register and download the Apple SDK: (see OSX Readme for details)
- https://developer.apple.com/downloads/download.action?path=Developer_Tools/xcode_6.1.1/xcode_6.1.1.dmg
+ https://developer.apple.com/devcenter/download.action?path=/Developer_Tools/xcode_6.1.1/xcode_6.1.1.dmg
Using a Mac, create a tarball for the 10.9 SDK and copy it to the inputs directory:
@@ -64,20 +66,21 @@ Release Process
./bin/gsign --signer $SIGNER --release ${VERSION}-linux --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-linux.yml
mv build/out/bitcoin-*.tar.gz build/out/src/bitcoin-*.tar.gz ../
./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-win.yml
- ./bin/gsign --signer $SIGNER --release ${VERSION}-win --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win.yml
+ ./bin/gsign --signer $SIGNER --release ${VERSION}-win-unsigned --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win.yml
+ mv build/out/bitcoin-*-win-unsigned.tar.gz inputs/bitcoin-win-unsigned.tar.gz
mv build/out/bitcoin-*.zip build/out/bitcoin-*.exe ../
./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-osx.yml
./bin/gsign --signer $SIGNER --release ${VERSION}-osx-unsigned --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-osx.yml
- mv build/out/bitcoin-*-unsigned.tar.gz inputs/bitcoin-osx-unsigned.tar.gz
+ mv build/out/bitcoin-*-osx-unsigned.tar.gz inputs/bitcoin-osx-unsigned.tar.gz
mv build/out/bitcoin-*.tar.gz build/out/bitcoin-*.dmg ../
popd
Build output expected:
1. source tarball (bitcoin-${VERSION}.tar.gz)
- 2. linux 32-bit and 64-bit binaries dist tarballs (bitcoin-${VERSION}-linux[32|64].tar.gz)
- 3. windows 32-bit and 64-bit installers and dist zips (bitcoin-${VERSION}-win[32|64]-setup.exe, bitcoin-${VERSION}-win[32|64].zip)
- 4. OSX unsigned installer (bitcoin-${VERSION}-osx-unsigned.dmg)
- 5. Gitian signatures (in gitian.sigs/${VERSION}-<linux|win|osx-unsigned>/(your gitian key)/
+ 2. linux 32-bit and 64-bit dist tarballs (bitcoin-${VERSION}-linux[32|64].tar.gz)
+ 3. windows 32-bit and 64-bit unsigned installers and dist zips (bitcoin-${VERSION}-win[32|64]-setup-unsigned.exe, bitcoin-${VERSION}-win[32|64].zip)
+ 4. OSX unsigned installer and dist tarball (bitcoin-${VERSION}-osx-unsigned.dmg, bitcoin-${VERSION}-osx64.tar.gz)
+ 5. Gitian signatures (in gitian.sigs/${VERSION}-<linux|{win,osx}-unsigned>/(your gitian key)/
###Next steps:
@@ -85,30 +88,38 @@ Commit your signature to gitian.sigs:
pushd gitian.sigs
git add ${VERSION}-linux/${SIGNER}
- git add ${VERSION}-win/${SIGNER}
+ git add ${VERSION}-win-unsigned/${SIGNER}
git add ${VERSION}-osx-unsigned/${SIGNER}
git commit -a
git push # Assuming you can push to the gitian.sigs tree
popd
- Wait for OSX detached signature:
- Once the OSX build has 3 matching signatures, Gavin will sign it with the apple App-Store key.
- He will then upload a detached signature to be combined with the unsigned app to create a signed binary.
+ Wait for Windows/OSX detached signatures:
+ Once the Windows/OSX builds each have 3 matching signatures, they will be signed with their respective release keys.
+ Detached signatures will then be committed to the bitcoin-detached-sigs repository, which can be combined with the unsigned apps to create signed binaries.
Create the signed OSX binary:
pushd ./gitian-builder
- # Fetch the signature as instructed by Gavin
- cp signature.tar.gz inputs/
- ./bin/gbuild -i ../bitcoin/contrib/gitian-descriptors/gitian-osx-signer.yml
+ ./bin/gbuild -i --commit signature=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-osx-signer.yml
./bin/gsign --signer $SIGNER --release ${VERSION}-osx-signed --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-osx-signer.yml
mv build/out/bitcoin-osx-signed.dmg ../bitcoin-${VERSION}-osx.dmg
popd
-Commit your signature for the signed OSX binary:
+ Create the signed Windows binaries:
+
+ pushd ./gitian-builder
+ ./bin/gbuild -i --commit signature=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-win-signer.yml
+ ./bin/gsign --signer $SIGNER --release ${VERSION}-win-signed --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win-signer.yml
+ mv build/out/bitcoin-*win64-setup.exe ../bitcoin-${VERSION}-win64-setup.exe
+ mv build/out/bitcoin-*win32-setup.exe ../bitcoin-${VERSION}-win32-setup.exe
+ popd
+
+Commit your signature for the signed OSX/Windows binaries:
pushd gitian.sigs
git add ${VERSION}-osx-signed/${SIGNER}
+ git add ${VERSION}-win-signed/${SIGNER}
git commit -a
git push # Assuming you can push to the gitian.sigs tree
popd
@@ -117,12 +128,6 @@ Commit your signature for the signed OSX binary:
### After 3 or more people have gitian-built and their results match:
-- Perform code-signing.
-
- - Code-sign Windows -setup.exe (in a Windows virtual machine using signtool)
-
- Note: only Gavin has the code-signing keys currently.
-
- Create `SHA256SUMS.asc` for the builds, and GPG-sign it:
```bash
sha256sum * > SHA256SUMS
@@ -164,4 +169,4 @@ Note: check that SHA256SUMS itself doesn't end up in SHA256SUMS, which is a spur
- Add release notes for the new version to the directory `doc/release-notes` in git master
-- Celebrate
+- Celebrate
diff --git a/doc/translation_process.md b/doc/translation_process.md
index eed467706e..3653e53021 100644
--- a/doc/translation_process.md
+++ b/doc/translation_process.md
@@ -32,7 +32,7 @@ QToolBar *toolbar = addToolBar(tr("Tabs toolbar"));
### Creating a pull-request
For general PRs, you shouldn’t include any updates to the translation source files. They will be updated periodically, primarily around pre-releases, allowing time for any new phrases to be translated before public releases. This is also important in avoiding translation related merge conflicts.
-When an updated source file is merged into the Github repo, Transifex will automatically detect it (although it can take several hours). Once processed, the new strings will show up as "Remaining" in the Transifex web interface and are ready for translators.
+When an updated source file is merged into the Github repo, Transifex will automatically detect it (although it can take several hours). Once processed, the new strings will show up as "Remaining" in the Transifex web interface and are ready for translators.
To create the pull-request, use the following commands:
```
@@ -108,4 +108,4 @@ To create a new language template, you will need to edit the languages manifest
### Questions and general assistance
The Bitcoin-Core translation maintainers include *tcatm, seone, Diapolo, wumpus and luke-jr*.You can find them, and others, in the Freenode IRC chatroom - `irc.freenode.net #bitcoin-dev`.
-If you are a translator, you should also subscribe to the mailing list, https://groups.google.com/forum/#!forum/bitcoin-translators. Announcements will be posted during application pre-releases to notify translators to check for updates. \ No newline at end of file
+If you are a translator, you should also subscribe to the mailing list, https://groups.google.com/forum/#!forum/bitcoin-translators. Announcements will be posted during application pre-releases to notify translators to check for updates.
diff --git a/doc/translation_strings_policy.md b/doc/translation_strings_policy.md
new file mode 100644
index 0000000000..cf72a55b20
--- /dev/null
+++ b/doc/translation_strings_policy.md
@@ -0,0 +1,110 @@
+Translation Strings Policy
+===========================
+
+This document provides guidelines for internationalization of the Bitcoin Core software.
+
+How to translate?
+------------------
+
+To mark a message as translatable
+
+- In GUI source code (under `src/qt`): use `tr("...")`
+
+- In non-GUI source code (under `src`): use `_("...")`
+
+No internationalization is used for e.g. developer scripts outside `src`.
+
+Strings to be translated
+-------------------------
+
+On a high level, these strings are to be translated:
+
+- GUI strings, anything that appears in a dialog or window
+
+- Command-line option documentation
+
+### GUI strings
+
+Anything that appears to the user in the GUI is to be translated. This includes labels, menu items, button texts, tooltips and window titles.
+This includes messages passed to the GUI through the UI interface through `InitMessage`, `ThreadSafeMessageBox` or `ShowProgress`.
+
+### Command-line options
+
+Documentation for the command line options in the output of `--help` should be translated as well.
+
+Make sure that default values do not end up in the string, but use string formatting like `strprintf(_("Threshold for disconnecting misbehaving peers (default: %u)"), 100)`. Putting default values in strings has led to accidental translations in the past, and forces the string to be retranslated every time the value changes.
+
+Do not translate messages that are only shown to developers, such as those that only appear when `--help-debug` is used.
+
+General recommendations
+------------------------
+
+### Avoid unnecessary translation strings
+
+Try not to burden translators with translating messages that are e.g. slight variations of other messages.
+In the GUI, avoid the use of text where an icon or symbol will do.
+Make sure that placeholder texts in forms don't end up in the list of strings to be translated (use `<string notr="true">`).
+
+### Make translated strings understandable
+
+Try to write translation strings in an understandable way, for both the user and the translator. Avoid overly technical or detailed messages
+
+### Do not translate internal errors
+
+Do not translate internal errors, or log messages, or messages that appear on the RPC interface. If an error is to be shown to the user,
+use a generic message, then log the detailed message to the log. E.g. "Error: A fatal internal error occurred, see debug.log for details".
+This helps troubleshooting; if the error is the same for everyone, the likelihood is increased that it can be found using a search engine.
+
+### Avoid fragments
+
+Avoid dividing up a message into fragments. Translators see every string separately, so may misunderstand the context if the messages are not self-contained.
+
+### Avoid HTML in translation strings
+
+There have been difficulties with use of HTML in translation strings; translators should not be able to accidentally affect the formatting of messages.
+This may sometimes be at conflict with the recommendation in the previous section.
+
+### Plurals
+
+Plurals can be complex in some languages. A quote from the gettext documentation:
+
+ In Polish we use e.g. plik (file) this way:
+ 1 plik,
+ 2,3,4 pliki,
+ 5-21 pliko'w,
+ 22-24 pliki,
+ 25-31 pliko'w
+ and so on
+
+In Qt code use tr's third argument for optional plurality. For example:
+
+ tr("%n hour(s)","",secs/HOUR_IN_SECONDS);
+ tr("%n day(s)","",secs/DAY_IN_SECONDS);
+ tr("%n week(s)","",secs/WEEK_IN_SECONDS);
+
+This adds `<numerusform>`s to the respective `.ts` file, which can be translated separately depending on the language. In English, this is simply:
+
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network</source>
+ <translation>
+ <numerusform>%n active connection to Bitcoin network</numerusform>
+ <numerusform>%n active connections to Bitcoin network</numerusform>
+ </translation>
+ </message>
+
+Where it is possible try to avoid embedding numbers into the flow of the string at all. e.g.
+
+ WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)
+
+versus
+
+ WARNING: check your network connection, less blocks (%d) were received in the last %n hours than expected (%d).
+
+The second example reduces the number of pluralized words that translators have to handle from three to one, at no cost to comprehensibility of the sentence.
+
+### String freezes
+
+During a string freeze (often before a major release), no translation strings are to be added, modified or removed.
+
+This can be checked by executing `make translate` in the `src` directory, then verifying that `bitcoin_en.ts` remains unchanged.
+
diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh
index ffddfa306d..b282082395 100755
--- a/qa/pull-tester/rpc-tests.sh
+++ b/qa/pull-tester/rpc-tests.sh
@@ -24,20 +24,59 @@ testScripts=(
'txn_clone.py'
'txn_clone.py --mineblock'
'getchaintips.py'
+ 'rawtransactions.py'
'rest.py'
'mempool_spendcoinbase.py'
'mempool_coinbase_spends.py'
'httpbasics.py'
'zapwallettxes.py'
+ 'proxy_test.py'
+ 'merkle_blocks.py'
+ 'fundrawtransaction.py'
+ 'signrawtransactions.py'
+ 'walletbackup.py'
+ 'nodehandling.py'
+ 'reindex.py'
+ 'decodescript.py'
+);
+testScriptsExt=(
+ 'bipdersig-p2p.py'
+ 'bipdersig.py'
+ 'getblocktemplate_longpoll.py'
+ 'getblocktemplate_proposals.py'
+ 'pruning.py'
+ 'forknotify.py'
+ 'invalidateblock.py'
+ 'keypool.py'
+ 'receivedby.py'
+ 'rpcbind_test.py'
+# 'script_test.py'
+ 'smartfees.py'
+ 'maxblocksinflight.py'
+ 'invalidblockrequest.py'
+ 'rawtransactions.py'
# 'forknotify.py'
+ 'p2p-acceptblock.py'
);
+
+extArg="-extended"
+passOn=${@#$extArg}
+
if [ "x${ENABLE_BITCOIND}${ENABLE_UTILS}${ENABLE_WALLET}" = "x111" ]; then
for (( i = 0; i < ${#testScripts[@]}; i++ ))
do
- if [ -z "$1" ] || [ "$1" == "${testScripts[$i]}" ] || [ "$1.py" == "${testScripts[$i]}" ]
+ if [ -z "$1" ] || [ "${1:0:1}" == "-" ] || [ "$1" == "${testScripts[$i]}" ] || [ "$1.py" == "${testScripts[$i]}" ]
then
echo -e "Running testscript \033[1m${testScripts[$i]}...\033[0m"
- ${BUILDDIR}/qa/rpc-tests/${testScripts[$i]} --srcdir "${BUILDDIR}/src"
+ ${BUILDDIR}/qa/rpc-tests/${testScripts[$i]} --srcdir "${BUILDDIR}/src" ${passOn}
+ fi
+ done
+ for (( i = 0; i < ${#testScriptsExt[@]}; i++ ))
+ do
+ if [ "$1" == $extArg ] || [ "$1" == "${testScriptsExt[$i]}" ] || [ "$1.py" == "${testScriptsExt[$i]}" ]
+ then
+ echo -e "Running \033[1m2nd level\033[0m testscript \033[1m${testScriptsExt[$i]}...\033[0m"
+ ${BUILDDIR}/qa/rpc-tests/${testScriptsExt[$i]} --srcdir "${BUILDDIR}/src" ${passOn}
fi
done
else
diff --git a/qa/rpc-tests/README.md b/qa/rpc-tests/README.md
index 02170d13ec..efc81e7a97 100644
--- a/qa/rpc-tests/README.md
+++ b/qa/rpc-tests/README.md
@@ -6,29 +6,41 @@ Git subtree of [https://github.com/jgarzik/python-bitcoinrpc](https://github.com
Changes to python-bitcoinrpc should be made upstream, and then
pulled here using git subtree.
-### [test_framework.py](test_framework.py)
+### [test_framework/test_framework.py](test_framework/test_framework.py)
Base class for new regression tests.
-### [listtransactions.py](listtransactions.py)
-Tests for the listtransactions RPC call.
-
-### [util.py](util.py)
+### [test_framework/util.py](test_framework/util.py)
Generally useful functions.
Bash-based tests, to be ported to Python:
-----------------------------------------
-- wallet.sh : Exercise wallet send/receive code.
-- walletbackup.sh : Exercise wallet backup / dump / import
-- txnmall.sh : Test proper accounting of malleable transactions
- conflictedbalance.sh : More testing of malleable transaction handling
Notes
=====
+You can run a single test by calling `qa/pull-tester/rpc-tests.sh <testname>`.
+
+Run all possible tests with `qa/pull-tester/rpc-tests.sh -extended`.
+
+Possible options:
+
+```
+-h, --help show this help message and exit
+ --nocleanup Leave bitcoinds and test.* datadir on exit or error
+ --noshutdown Don't stop bitcoinds after the test execution
+ --srcdir=SRCDIR Source directory containing bitcoind/bitcoin-cli (default:
+ ../../src)
+ --tmpdir=TMPDIR Root directory for datadirs
+ --tracerpc Print out all RPC calls as they are made
+```
+
+If you set the environment variable `PYTHON_DEBUG=1` you will get some debug output (example: `PYTHON_DEBUG=1 qa/pull-tester/rpc-tests.sh wallet`).
+
A 200-block -regtest blockchain and wallets for four nodes
is created the first time a regression test is run and
is stored in the cache/ directory. Each node has 25 mature
-blocks (25*50=1250 BTC) in their wallet.
+blocks (25*50=1250 BTC) in its wallet.
After the first run, the cache/ blockchain and wallets are
copied into a temporary directory and used as the initial
diff --git a/qa/rpc-tests/bipdersig-p2p.py b/qa/rpc-tests/bipdersig-p2p.py
new file mode 100755
index 0000000000..41717377b2
--- /dev/null
+++ b/qa/rpc-tests/bipdersig-p2p.py
@@ -0,0 +1,183 @@
+#!/usr/bin/env python2
+#
+# Distributed under the MIT/X11 software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#
+
+from test_framework.test_framework import ComparisonTestFramework
+from test_framework.util import *
+from test_framework.mininode import CTransaction, NetworkThread
+from test_framework.blocktools import create_coinbase, create_block
+from test_framework.comptool import TestInstance, TestManager
+from test_framework.script import CScript
+from binascii import hexlify, unhexlify
+import cStringIO
+import time
+
+# A canonical signature consists of:
+# <30> <total len> <02> <len R> <R> <02> <len S> <S> <hashtype>
+def unDERify(tx):
+ '''
+ Make the signature in vin 0 of a tx non-DER-compliant,
+ by adding padding after the S-value.
+ '''
+ scriptSig = CScript(tx.vin[0].scriptSig)
+ newscript = []
+ for i in scriptSig:
+ if (len(newscript) == 0):
+ newscript.append(i[0:-1] + '\0' + i[-1])
+ else:
+ newscript.append(i)
+ tx.vin[0].scriptSig = CScript(newscript)
+
+'''
+This test is meant to exercise BIP66 (DER SIG).
+Connect to a single node.
+Mine 2 (version 2) blocks (save the coinbases for later).
+Generate 98 more version 2 blocks, verify the node accepts.
+Mine 749 version 3 blocks, verify the node accepts.
+Check that the new DERSIG rules are not enforced on the 750th version 3 block.
+Check that the new DERSIG rules are enforced on the 751st version 3 block.
+Mine 199 new version blocks.
+Mine 1 old-version block.
+Mine 1 new version block.
+Mine 1 old version block, see that the node rejects.
+'''
+
+class BIP66Test(ComparisonTestFramework):
+
+ def __init__(self):
+ self.num_nodes = 1
+
+ def setup_network(self):
+ # Must set the blockversion for this test
+ self.nodes = start_nodes(1, self.options.tmpdir,
+ extra_args=[['-debug', '-whitelist=127.0.0.1', '-blockversion=2']],
+ binary=[self.options.testbinary])
+
+ def run_test(self):
+ test = TestManager(self, self.options.tmpdir)
+ test.add_all_connections(self.nodes)
+ NetworkThread().start() # Start up network handling in another thread
+ test.run()
+
+ def create_transaction(self, node, coinbase, to_address, amount):
+ from_txid = node.getblock(coinbase)['tx'][0]
+ inputs = [{ "txid" : from_txid, "vout" : 0}]
+ outputs = { to_address : amount }
+ rawtx = node.createrawtransaction(inputs, outputs)
+ signresult = node.signrawtransaction(rawtx)
+ tx = CTransaction()
+ f = cStringIO.StringIO(unhexlify(signresult['hex']))
+ tx.deserialize(f)
+ return tx
+
+ def get_tests(self):
+
+ self.coinbase_blocks = self.nodes[0].generate(2)
+ self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0)
+ self.nodeaddress = self.nodes[0].getnewaddress()
+ self.last_block_time = time.time()
+
+ ''' 98 more version 2 blocks '''
+ test_blocks = []
+ for i in xrange(98):
+ block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1)
+ block.nVersion = 2
+ block.rehash()
+ block.solve()
+ test_blocks.append([block, True])
+ self.last_block_time += 1
+ self.tip = block.sha256
+ yield TestInstance(test_blocks, sync_every_block=False)
+
+ ''' Mine 749 version 3 blocks '''
+ test_blocks = []
+ for i in xrange(749):
+ block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1)
+ block.nVersion = 3
+ block.rehash()
+ block.solve()
+ test_blocks.append([block, True])
+ self.last_block_time += 1
+ self.tip = block.sha256
+ yield TestInstance(test_blocks, sync_every_block=False)
+
+ '''
+ Check that the new DERSIG rules are not enforced in the 750th
+ version 3 block.
+ '''
+ spendtx = self.create_transaction(self.nodes[0],
+ self.coinbase_blocks[0], self.nodeaddress, 1.0)
+ unDERify(spendtx)
+ spendtx.rehash()
+
+ block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1)
+ block.nVersion = 3
+ block.vtx.append(spendtx)
+ block.hashMerkleRoot = block.calc_merkle_root()
+ block.rehash()
+ block.solve()
+
+ self.last_block_time += 1
+ self.tip = block.sha256
+ yield TestInstance([[block, True]])
+
+ '''
+ Check that the new DERSIG rules are enforced in the 751st version 3
+ block.
+ '''
+ spendtx = self.create_transaction(self.nodes[0],
+ self.coinbase_blocks[1], self.nodeaddress, 1.0)
+ unDERify(spendtx)
+ spendtx.rehash()
+
+ block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
+ block.nVersion = 3
+ block.vtx.append(spendtx)
+ block.hashMerkleRoot = block.calc_merkle_root()
+ block.rehash()
+ block.solve()
+ self.last_block_time += 1
+ yield TestInstance([[block, False]])
+
+ ''' Mine 199 new version blocks on last valid tip '''
+ test_blocks = []
+ for i in xrange(199):
+ block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
+ block.nVersion = 3
+ block.rehash()
+ block.solve()
+ test_blocks.append([block, True])
+ self.last_block_time += 1
+ self.tip = block.sha256
+ yield TestInstance(test_blocks, sync_every_block=False)
+
+ ''' Mine 1 old version block '''
+ block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
+ block.nVersion = 2
+ block.rehash()
+ block.solve()
+ self.last_block_time += 1
+ self.tip = block.sha256
+ yield TestInstance([[block, True]])
+
+ ''' Mine 1 new version block '''
+ block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
+ block.nVersion = 3
+ block.rehash()
+ block.solve()
+ self.last_block_time += 1
+ self.tip = block.sha256
+ yield TestInstance([[block, True]])
+
+ ''' Mine 1 old version block, should be invalid '''
+ block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
+ block.nVersion = 2
+ block.rehash()
+ block.solve()
+ self.last_block_time += 1
+ yield TestInstance([[block, False]])
+
+if __name__ == '__main__':
+ BIP66Test().main()
diff --git a/qa/rpc-tests/bipdersig.py b/qa/rpc-tests/bipdersig.py
index 2c43bba865..243f816f65 100755
--- a/qa/rpc-tests/bipdersig.py
+++ b/qa/rpc-tests/bipdersig.py
@@ -7,9 +7,8 @@
# Test the BIP66 changeover logic
#
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
import os
import shutil
diff --git a/qa/rpc-tests/conflictedbalance.sh b/qa/rpc-tests/conflictedbalance.sh
index 3b6c8dc318..7e44097374 100755
--- a/qa/rpc-tests/conflictedbalance.sh
+++ b/qa/rpc-tests/conflictedbalance.sh
@@ -49,7 +49,7 @@ B2ARGS="-datadir=$D2 -debug=mempool"
$BITCOIND $B2ARGS &
B2PID=$!
-# Wait until all four nodes are at the same block number
+# Wait until both nodes are at the same block number
function WaitBlocks {
while :
do
diff --git a/qa/rpc-tests/decodescript.py b/qa/rpc-tests/decodescript.py
new file mode 100755
index 0000000000..ce3bc94ef7
--- /dev/null
+++ b/qa/rpc-tests/decodescript.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python2
+# Copyright (c) 2015 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+
+class DecodeScriptTest(BitcoinTestFramework):
+ """Tests decoding scripts via RPC command "decodescript"."""
+
+ def setup_chain(self):
+ print('Initializing test directory ' + self.options.tmpdir)
+ initialize_chain_clean(self.options.tmpdir, 1)
+
+ def setup_network(self, split=False):
+ self.nodes = start_nodes(1, self.options.tmpdir)
+ self.is_network_split = False
+
+ def decodescript_script_sig(self):
+ signature = '304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c509001'
+ push_signature = '48' + signature
+ public_key = '03b0da749730dc9b4b1f4a14d6902877a92541f5368778853d9c4a0cb7802dcfb2'
+ push_public_key = '21' + public_key
+
+ # below are test cases for all of the standard transaction types
+
+ # 1) P2PK scriptSig
+ # the scriptSig of a public key scriptPubKey simply pushes a signature onto the stack
+ rpc_result = self.nodes[0].decodescript(push_signature)
+ assert_equal(signature, rpc_result['asm'])
+
+ # 2) P2PKH scriptSig
+ rpc_result = self.nodes[0].decodescript(push_signature + push_public_key)
+ assert_equal(signature + ' ' + public_key, rpc_result['asm'])
+
+ # 3) multisig scriptSig
+ # this also tests the leading portion of a P2SH multisig scriptSig
+ # OP_0 <A sig> <B sig>
+ rpc_result = self.nodes[0].decodescript('00' + push_signature + push_signature)
+ assert_equal('0 ' + signature + ' ' + signature, rpc_result['asm'])
+
+ # 4) P2SH scriptSig
+ # an empty P2SH redeemScript is valid and makes for a very simple test case.
+ # thus, such a spending scriptSig would just need to pass the outer redeemScript
+ # hash test and leave true on the top of the stack.
+ rpc_result = self.nodes[0].decodescript('5100')
+ assert_equal('1 0', rpc_result['asm'])
+
+ # 5) null data scriptSig - no such thing because null data scripts can not be spent.
+ # thus, no test case for that standard transaction type is here.
+
+ def decodescript_script_pub_key(self):
+ public_key = '03b0da749730dc9b4b1f4a14d6902877a92541f5368778853d9c4a0cb7802dcfb2'
+ push_public_key = '21' + public_key
+ public_key_hash = '11695b6cd891484c2d49ec5aa738ec2b2f897777'
+ push_public_key_hash = '14' + public_key_hash
+
+ # below are test cases for all of the standard transaction types
+
+ # 1) P2PK scriptPubKey
+ # <pubkey> OP_CHECKSIG
+ rpc_result = self.nodes[0].decodescript(push_public_key + 'ac')
+ assert_equal(public_key + ' OP_CHECKSIG', rpc_result['asm'])
+
+ # 2) P2PKH scriptPubKey
+ # OP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
+ rpc_result = self.nodes[0].decodescript('76a9' + push_public_key_hash + '88ac')
+ assert_equal('OP_DUP OP_HASH160 ' + public_key_hash + ' OP_EQUALVERIFY OP_CHECKSIG', rpc_result['asm'])
+
+ # 3) multisig scriptPubKey
+ # <m> <A pubkey> <B pubkey> <C pubkey> <n> OP_CHECKMULTISIG
+ # just imagine that the pub keys used below are different.
+ # for our purposes here it does not matter that they are the same even though it is unrealistic.
+ rpc_result = self.nodes[0].decodescript('52' + push_public_key + push_public_key + push_public_key + '53ae')
+ assert_equal('2 ' + public_key + ' ' + public_key + ' ' + public_key + ' 3 OP_CHECKMULTISIG', rpc_result['asm'])
+
+ # 4) P2SH scriptPubKey
+ # OP_HASH160 <Hash160(redeemScript)> OP_EQUAL.
+ # push_public_key_hash here should actually be the hash of a redeem script.
+ # but this works the same for purposes of this test.
+ rpc_result = self.nodes[0].decodescript('a9' + push_public_key_hash + '87')
+ assert_equal('OP_HASH160 ' + public_key_hash + ' OP_EQUAL', rpc_result['asm'])
+
+ # 5) null data scriptPubKey
+ # use a signature look-alike here to make sure that we do not decode random data as a signature.
+ # this matters if/when signature sighash decoding comes along.
+ # would want to make sure that no such decoding takes place in this case.
+ signature_imposter = '48304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c509001'
+ # OP_RETURN <data>
+ rpc_result = self.nodes[0].decodescript('6a' + signature_imposter)
+ assert_equal('OP_RETURN ' + signature_imposter[2:], rpc_result['asm'])
+
+ # 6) a CLTV redeem script. redeem scripts are in-effect scriptPubKey scripts, so adding a test here.
+ # OP_NOP2 is also known as OP_CHECKLOCKTIMEVERIFY.
+ # just imagine that the pub keys used below are different.
+ # for our purposes here it does not matter that they are the same even though it is unrealistic.
+ #
+ # OP_IF
+ # <receiver-pubkey> OP_CHECKSIGVERIFY
+ # OP_ELSE
+ # <lock-until> OP_NOP2 OP_DROP
+ # OP_ENDIF
+ # <sender-pubkey> OP_CHECKSIG
+ #
+ # lock until block 500,000
+ rpc_result = self.nodes[0].decodescript('63' + push_public_key + 'ad670320a107b17568' + push_public_key + 'ac')
+ assert_equal('OP_IF ' + public_key + ' OP_CHECKSIGVERIFY OP_ELSE 500000 OP_NOP2 OP_DROP OP_ENDIF ' + public_key + ' OP_CHECKSIG', rpc_result['asm'])
+
+ def run_test(self):
+ self.decodescript_script_sig()
+ self.decodescript_script_pub_key()
+
+if __name__ == '__main__':
+ DecodeScriptTest().main()
+
diff --git a/qa/rpc-tests/forknotify.py b/qa/rpc-tests/forknotify.py
index af22ffb1a5..0acef8e30b 100755
--- a/qa/rpc-tests/forknotify.py
+++ b/qa/rpc-tests/forknotify.py
@@ -7,9 +7,8 @@
# Test -alertnotify
#
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
import os
import shutil
diff --git a/qa/rpc-tests/fundrawtransaction.py b/qa/rpc-tests/fundrawtransaction.py
new file mode 100755
index 0000000000..e859b26433
--- /dev/null
+++ b/qa/rpc-tests/fundrawtransaction.py
@@ -0,0 +1,556 @@
+#!/usr/bin/env python2
+# Copyright (c) 2014 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+from pprint import pprint
+from time import sleep
+
+# Create one-input, one-output, no-fee transaction:
+class RawTransactionsTest(BitcoinTestFramework):
+
+ def setup_chain(self):
+ print("Initializing test directory "+self.options.tmpdir)
+ initialize_chain_clean(self.options.tmpdir, 3)
+
+ def setup_network(self, split=False):
+ self.nodes = start_nodes(3, self.options.tmpdir)
+
+ connect_nodes_bi(self.nodes,0,1)
+ connect_nodes_bi(self.nodes,1,2)
+ connect_nodes_bi(self.nodes,0,2)
+
+ self.is_network_split=False
+ self.sync_all()
+
+ def run_test(self):
+ print "Mining blocks..."
+ feeTolerance = Decimal(0.00000002) #if the fee's positive delta is higher than this value tests will fail, neg. delta always fail the tests
+
+ self.nodes[2].generate(1)
+ self.nodes[0].generate(101)
+ self.sync_all()
+ self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.5);
+ self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.0);
+ self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),5.0);
+ self.sync_all()
+ self.nodes[0].generate(1)
+ self.sync_all()
+
+ ###############
+ # simple test #
+ ###############
+ inputs = [ ]
+ outputs = { self.nodes[0].getnewaddress() : 1.0 }
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+ dec_tx = self.nodes[2].decoderawtransaction(rawtx)
+
+ rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
+ fee = rawtxfund['fee']
+ dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
+ totalOut = 0
+ for out in dec_tx['vout']:
+ totalOut += out['value']
+
+ assert_equal(len(dec_tx['vin']), 1) #one vin coin
+ assert_equal(dec_tx['vin'][0]['scriptSig']['hex'], '')
+ assert_equal(fee + totalOut, 1.5) #the 1.5BTC coin must be taken
+
+ ##############################
+ # simple test with two coins #
+ ##############################
+ inputs = [ ]
+ outputs = { self.nodes[0].getnewaddress() : 2.2 }
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+ dec_tx = self.nodes[2].decoderawtransaction(rawtx)
+
+ rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
+ fee = rawtxfund['fee']
+ dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
+ totalOut = 0
+ for out in dec_tx['vout']:
+ totalOut += out['value']
+
+ assert_equal(len(dec_tx['vin']), 2) #one vin coin
+ assert_equal(dec_tx['vin'][0]['scriptSig']['hex'], '')
+ assert_equal(dec_tx['vin'][1]['scriptSig']['hex'], '')
+ assert_equal(fee + totalOut, 2.5) #the 1.5BTC+1.0BTC coins must have be taken
+
+ ##############################
+ # simple test with two coins #
+ ##############################
+ inputs = [ ]
+ outputs = { self.nodes[0].getnewaddress() : 2.6 }
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+ dec_tx = self.nodes[2].decoderawtransaction(rawtx)
+
+ rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
+ fee = rawtxfund['fee']
+ dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
+ totalOut = 0
+ for out in dec_tx['vout']:
+ totalOut += out['value']
+
+ assert_equal(len(dec_tx['vin']), 1) #one vin coin
+ assert_equal(dec_tx['vin'][0]['scriptSig']['hex'], '')
+ assert_equal(fee + totalOut, 5.0) #the 5.0BTC coin must have be taken
+
+
+ ################################
+ # simple test with two outputs #
+ ################################
+ inputs = [ ]
+ outputs = { self.nodes[0].getnewaddress() : 2.6, self.nodes[1].getnewaddress() : 2.5 }
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+ dec_tx = self.nodes[2].decoderawtransaction(rawtx)
+
+ rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
+ fee = rawtxfund['fee']
+ dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
+ totalOut = 0
+ for out in dec_tx['vout']:
+ totalOut += out['value']
+
+ assert_equal(len(dec_tx['vin']), 2) #one vin coin
+ assert_equal(dec_tx['vin'][0]['scriptSig']['hex'], '')
+ assert_equal(dec_tx['vin'][1]['scriptSig']['hex'], '')
+ assert_equal(fee + totalOut, 6.0) #the 5.0BTC + 1.0BTC coins must have be taken
+
+
+
+ #########################################################################
+ # test a fundrawtransaction with a VIN greater than the required amount #
+ #########################################################################
+ utx = False
+ listunspent = self.nodes[2].listunspent()
+ for aUtx in listunspent:
+ if aUtx['amount'] == 5.0:
+ utx = aUtx
+ break;
+
+ assert_equal(utx!=False, True)
+
+ inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']}]
+ outputs = { self.nodes[0].getnewaddress() : 1.0 }
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+ dec_tx = self.nodes[2].decoderawtransaction(rawtx)
+ assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
+
+ rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
+ fee = rawtxfund['fee']
+ dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
+ totalOut = 0
+ for out in dec_tx['vout']:
+ totalOut += out['value']
+
+ assert_equal(fee + totalOut, utx['amount']) #compare vin total and totalout+fee
+
+
+
+ #####################################################################
+ # test a fundrawtransaction with which will not get a change output #
+ #####################################################################
+ utx = False
+ listunspent = self.nodes[2].listunspent()
+ for aUtx in listunspent:
+ if aUtx['amount'] == 5.0:
+ utx = aUtx
+ break;
+
+ assert_equal(utx!=False, True)
+
+ inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']}]
+ outputs = { self.nodes[0].getnewaddress() : Decimal(5.0) - fee - feeTolerance }
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+ dec_tx = self.nodes[2].decoderawtransaction(rawtx)
+ assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
+
+ rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
+ fee = rawtxfund['fee']
+ dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
+ totalOut = 0
+ for out in dec_tx['vout']:
+ totalOut += out['value']
+
+ assert_equal(rawtxfund['changepos'], -1)
+ assert_equal(fee + totalOut, utx['amount']) #compare vin total and totalout+fee
+
+
+
+ #########################################################################
+ # test a fundrawtransaction with a VIN smaller than the required amount #
+ #########################################################################
+ utx = False
+ listunspent = self.nodes[2].listunspent()
+ for aUtx in listunspent:
+ if aUtx['amount'] == 1.0:
+ utx = aUtx
+ break;
+
+ assert_equal(utx!=False, True)
+
+ inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']}]
+ outputs = { self.nodes[0].getnewaddress() : 1.0 }
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+
+ # 4-byte version + 1-byte vin count + 36-byte prevout then script_len
+ rawtx = rawtx[:82] + "0100" + rawtx[84:]
+
+ dec_tx = self.nodes[2].decoderawtransaction(rawtx)
+ assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
+ assert_equal("00", dec_tx['vin'][0]['scriptSig']['hex'])
+
+ rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
+ fee = rawtxfund['fee']
+ dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
+ totalOut = 0
+ matchingOuts = 0
+ for i, out in enumerate(dec_tx['vout']):
+ totalOut += out['value']
+ if outputs.has_key(out['scriptPubKey']['addresses'][0]):
+ matchingOuts+=1
+ else:
+ assert_equal(i, rawtxfund['changepos'])
+
+ assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
+ assert_equal("00", dec_tx['vin'][0]['scriptSig']['hex'])
+
+ assert_equal(matchingOuts, 1)
+ assert_equal(len(dec_tx['vout']), 2)
+
+ assert_equal(fee + totalOut, 2.5) #this tx must use the 1.0BTC and the 1.5BTC coin
+
+
+ ###########################################
+ # test a fundrawtransaction with two VINs #
+ ###########################################
+ utx = False
+ utx2 = False
+ listunspent = self.nodes[2].listunspent()
+ for aUtx in listunspent:
+ if aUtx['amount'] == 1.0:
+ utx = aUtx
+ if aUtx['amount'] == 5.0:
+ utx2 = aUtx
+
+
+ assert_equal(utx!=False, True)
+
+ inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']},{'txid' : utx2['txid'], 'vout' : utx2['vout']} ]
+ outputs = { self.nodes[0].getnewaddress() : 6.0 }
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+ dec_tx = self.nodes[2].decoderawtransaction(rawtx)
+ assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
+
+ rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
+ fee = rawtxfund['fee']
+ dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
+ totalOut = 0
+ matchingOuts = 0
+ for out in dec_tx['vout']:
+ totalOut += out['value']
+ if outputs.has_key(out['scriptPubKey']['addresses'][0]):
+ matchingOuts+=1
+
+ assert_equal(matchingOuts, 1)
+ assert_equal(len(dec_tx['vout']), 2)
+
+ matchingIns = 0
+ for vinOut in dec_tx['vin']:
+ for vinIn in inputs:
+ if vinIn['txid'] == vinOut['txid']:
+ matchingIns+=1
+
+ assert_equal(matchingIns, 2) #we now must see two vins identical to vins given as params
+ assert_equal(fee + totalOut, 7.5) #this tx must use the 1.0BTC and the 1.5BTC coin
+
+
+ #########################################################
+ # test a fundrawtransaction with two VINs and two vOUTs #
+ #########################################################
+ utx = False
+ utx2 = False
+ listunspent = self.nodes[2].listunspent()
+ for aUtx in listunspent:
+ if aUtx['amount'] == 1.0:
+ utx = aUtx
+ if aUtx['amount'] == 5.0:
+ utx2 = aUtx
+
+
+ assert_equal(utx!=False, True)
+
+ inputs = [ {'txid' : utx['txid'], 'vout' : utx['vout']},{'txid' : utx2['txid'], 'vout' : utx2['vout']} ]
+ outputs = { self.nodes[0].getnewaddress() : 6.0, self.nodes[0].getnewaddress() : 1.0 }
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+ dec_tx = self.nodes[2].decoderawtransaction(rawtx)
+ assert_equal(utx['txid'], dec_tx['vin'][0]['txid'])
+
+ rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
+ fee = rawtxfund['fee']
+ dec_tx = self.nodes[2].decoderawtransaction(rawtxfund['hex'])
+ totalOut = 0
+ matchingOuts = 0
+ for out in dec_tx['vout']:
+ totalOut += out['value']
+ if outputs.has_key(out['scriptPubKey']['addresses'][0]):
+ matchingOuts+=1
+
+ assert_equal(matchingOuts, 2)
+ assert_equal(len(dec_tx['vout']), 3)
+ assert_equal(fee + totalOut, 7.5) #this tx must use the 1.0BTC and the 1.5BTC coin
+
+
+ ##############################################
+ # test a fundrawtransaction with invalid vin #
+ ##############################################
+ listunspent = self.nodes[2].listunspent()
+ inputs = [ {'txid' : "1c7f966dab21119bac53213a2bc7532bff1fa844c124fd750a7d0b1332440bd1", 'vout' : 0} ] #invalid vin!
+ outputs = { self.nodes[0].getnewaddress() : 1.0}
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+ dec_tx = self.nodes[2].decoderawtransaction(rawtx)
+
+ errorString = ""
+ try:
+ rawtxfund = self.nodes[2].fundrawtransaction(rawtx)
+ except JSONRPCException,e:
+ errorString = e.error['message']
+
+ assert_equal("Insufficient" in errorString, True);
+
+
+
+ ############################################################
+ #compare fee of a standard pubkeyhash transaction
+ inputs = []
+ outputs = {self.nodes[1].getnewaddress():1.1}
+ rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
+ fundedTx = self.nodes[0].fundrawtransaction(rawTx)
+
+ #create same transaction over sendtoaddress
+ txId = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1.1);
+ signedFee = self.nodes[0].getrawmempool(True)[txId]['fee']
+
+ #compare fee
+ feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee);
+ assert(feeDelta >= 0 and feeDelta <= feeTolerance)
+ ############################################################
+
+ ############################################################
+ #compare fee of a standard pubkeyhash transaction with multiple outputs
+ inputs = []
+ outputs = {self.nodes[1].getnewaddress():1.1,self.nodes[1].getnewaddress():1.2,self.nodes[1].getnewaddress():0.1,self.nodes[1].getnewaddress():1.3,self.nodes[1].getnewaddress():0.2,self.nodes[1].getnewaddress():0.3}
+ rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
+ fundedTx = self.nodes[0].fundrawtransaction(rawTx)
+ #create same transaction over sendtoaddress
+ txId = self.nodes[0].sendmany("", outputs);
+ signedFee = self.nodes[0].getrawmempool(True)[txId]['fee']
+
+ #compare fee
+ feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee);
+ assert(feeDelta >= 0 and feeDelta <= feeTolerance)
+ ############################################################
+
+
+ ############################################################
+ #compare fee of a 2of2 multisig p2sh transaction
+
+ # create 2of2 addr
+ addr1 = self.nodes[1].getnewaddress()
+ addr2 = self.nodes[1].getnewaddress()
+
+ addr1Obj = self.nodes[1].validateaddress(addr1)
+ addr2Obj = self.nodes[1].validateaddress(addr2)
+
+ mSigObj = self.nodes[1].addmultisigaddress(2, [addr1Obj['pubkey'], addr2Obj['pubkey']])
+
+ inputs = []
+ outputs = {mSigObj:1.1}
+ rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
+ fundedTx = self.nodes[0].fundrawtransaction(rawTx)
+
+ #create same transaction over sendtoaddress
+ txId = self.nodes[0].sendtoaddress(mSigObj, 1.1);
+ signedFee = self.nodes[0].getrawmempool(True)[txId]['fee']
+
+ #compare fee
+ feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee);
+ assert(feeDelta >= 0 and feeDelta <= feeTolerance)
+ ############################################################
+
+
+ ############################################################
+ #compare fee of a standard pubkeyhash transaction
+
+ # create 4of5 addr
+ addr1 = self.nodes[1].getnewaddress()
+ addr2 = self.nodes[1].getnewaddress()
+ addr3 = self.nodes[1].getnewaddress()
+ addr4 = self.nodes[1].getnewaddress()
+ addr5 = self.nodes[1].getnewaddress()
+
+ addr1Obj = self.nodes[1].validateaddress(addr1)
+ addr2Obj = self.nodes[1].validateaddress(addr2)
+ addr3Obj = self.nodes[1].validateaddress(addr3)
+ addr4Obj = self.nodes[1].validateaddress(addr4)
+ addr5Obj = self.nodes[1].validateaddress(addr5)
+
+ mSigObj = self.nodes[1].addmultisigaddress(4, [addr1Obj['pubkey'], addr2Obj['pubkey'], addr3Obj['pubkey'], addr4Obj['pubkey'], addr5Obj['pubkey']])
+
+ inputs = []
+ outputs = {mSigObj:1.1}
+ rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
+ fundedTx = self.nodes[0].fundrawtransaction(rawTx)
+
+ #create same transaction over sendtoaddress
+ txId = self.nodes[0].sendtoaddress(mSigObj, 1.1);
+ signedFee = self.nodes[0].getrawmempool(True)[txId]['fee']
+
+ #compare fee
+ feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee);
+ assert(feeDelta >= 0 and feeDelta <= feeTolerance)
+ ############################################################
+
+
+ ############################################################
+ # spend a 2of2 multisig transaction over fundraw
+
+ # create 2of2 addr
+ addr1 = self.nodes[2].getnewaddress()
+ addr2 = self.nodes[2].getnewaddress()
+
+ addr1Obj = self.nodes[2].validateaddress(addr1)
+ addr2Obj = self.nodes[2].validateaddress(addr2)
+
+ mSigObj = self.nodes[2].addmultisigaddress(2, [addr1Obj['pubkey'], addr2Obj['pubkey']])
+
+
+ # send 1.2 BTC to msig addr
+ txId = self.nodes[0].sendtoaddress(mSigObj, 1.2);
+ self.sync_all()
+ self.nodes[1].generate(1)
+ self.sync_all()
+
+ oldBalance = self.nodes[1].getbalance()
+ inputs = []
+ outputs = {self.nodes[1].getnewaddress():1.1}
+ rawTx = self.nodes[2].createrawtransaction(inputs, outputs)
+ fundedTx = self.nodes[2].fundrawtransaction(rawTx)
+
+ signedTx = self.nodes[2].signrawtransaction(fundedTx['hex'])
+ txId = self.nodes[2].sendrawtransaction(signedTx['hex'])
+ self.sync_all()
+ self.nodes[1].generate(1)
+ self.sync_all()
+
+ # make sure funds are received at node1
+ assert_equal(oldBalance+Decimal('1.10000000'), self.nodes[1].getbalance())
+
+ ############################################################
+ # locked wallet test
+ self.nodes[1].encryptwallet("test")
+ self.nodes.pop(1)
+ stop_nodes(self.nodes)
+ wait_bitcoinds()
+
+ self.nodes = start_nodes(3, self.options.tmpdir)
+
+ connect_nodes_bi(self.nodes,0,1)
+ connect_nodes_bi(self.nodes,1,2)
+ connect_nodes_bi(self.nodes,0,2)
+ self.is_network_split=False
+ self.sync_all()
+
+ error = False
+ try:
+ self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 1.2);
+ except:
+ error = True
+ assert(error)
+
+ oldBalance = self.nodes[0].getbalance()
+
+ inputs = []
+ outputs = {self.nodes[0].getnewaddress():1.1}
+ rawTx = self.nodes[1].createrawtransaction(inputs, outputs)
+ fundedTx = self.nodes[1].fundrawtransaction(rawTx)
+
+ #now we need to unlock
+ self.nodes[1].walletpassphrase("test", 100)
+ signedTx = self.nodes[1].signrawtransaction(fundedTx['hex'])
+ txId = self.nodes[1].sendrawtransaction(signedTx['hex'])
+ self.sync_all()
+ self.nodes[1].generate(1)
+ self.sync_all()
+
+ # make sure funds are received at node1
+ assert_equal(oldBalance+Decimal('51.10000000'), self.nodes[0].getbalance())
+
+
+
+ ###############################################
+ # multiple (~19) inputs tx test | Compare fee #
+ ###############################################
+
+ #empty node1, send some small coins from node0 to node1
+ self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), self.nodes[1].getbalance(), "", "", True);
+ self.sync_all()
+ self.nodes[0].generate(1)
+ self.sync_all()
+
+ for i in range(0,20):
+ self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.01);
+ self.sync_all()
+ self.nodes[0].generate(1)
+ self.sync_all()
+
+ #fund a tx with ~20 small inputs
+ inputs = []
+ outputs = {self.nodes[0].getnewaddress():0.15,self.nodes[0].getnewaddress():0.04}
+ rawTx = self.nodes[1].createrawtransaction(inputs, outputs)
+ fundedTx = self.nodes[1].fundrawtransaction(rawTx)
+
+ #create same transaction over sendtoaddress
+ txId = self.nodes[1].sendmany("", outputs);
+ signedFee = self.nodes[1].getrawmempool(True)[txId]['fee']
+
+ #compare fee
+ feeDelta = Decimal(fundedTx['fee']) - Decimal(signedFee);
+ assert(feeDelta >= 0 and feeDelta <= feeTolerance*19) #~19 inputs
+
+
+ #############################################
+ # multiple (~19) inputs tx test | sign/send #
+ #############################################
+
+ #again, empty node1, send some small coins from node0 to node1
+ self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), self.nodes[1].getbalance(), "", "", True);
+ self.sync_all()
+ self.nodes[0].generate(1)
+ self.sync_all()
+
+ for i in range(0,20):
+ self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.01);
+ self.sync_all()
+ self.nodes[0].generate(1)
+ self.sync_all()
+
+ #fund a tx with ~20 small inputs
+ oldBalance = self.nodes[0].getbalance()
+
+ inputs = []
+ outputs = {self.nodes[0].getnewaddress():0.15,self.nodes[0].getnewaddress():0.04}
+ rawTx = self.nodes[1].createrawtransaction(inputs, outputs)
+ fundedTx = self.nodes[1].fundrawtransaction(rawTx)
+ fundedAndSignedTx = self.nodes[1].signrawtransaction(fundedTx['hex'])
+ txId = self.nodes[1].sendrawtransaction(fundedAndSignedTx['hex'])
+ self.sync_all()
+ self.nodes[0].generate(1)
+ self.sync_all()
+ assert_equal(oldBalance+Decimal('50.19000000'), self.nodes[0].getbalance()) #0.19+block reward
+
+
+if __name__ == '__main__':
+ RawTransactionsTest().main()
diff --git a/qa/rpc-tests/getblocktemplate_longpoll.py b/qa/rpc-tests/getblocktemplate_longpoll.py
index 64fe49b835..aab4562422 100755
--- a/qa/rpc-tests/getblocktemplate_longpoll.py
+++ b/qa/rpc-tests/getblocktemplate_longpoll.py
@@ -3,9 +3,8 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
def check_array_result(object_array, to_match, expected):
diff --git a/qa/rpc-tests/getblocktemplate_proposals.py b/qa/rpc-tests/getblocktemplate_proposals.py
index a63f456d6b..aca0cd7495 100755
--- a/qa/rpc-tests/getblocktemplate_proposals.py
+++ b/qa/rpc-tests/getblocktemplate_proposals.py
@@ -3,9 +3,8 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
from binascii import a2b_hex, b2a_hex
from hashlib import sha256
diff --git a/qa/rpc-tests/getchaintips.py b/qa/rpc-tests/getchaintips.py
index 83a9537285..6a2bcb2969 100755
--- a/qa/rpc-tests/getchaintips.py
+++ b/qa/rpc-tests/getchaintips.py
@@ -7,8 +7,8 @@
# on chains of different lengths, and join the network together again.
# This gives us two tips, verify that it works.
-from test_framework import BitcoinTestFramework
-from util import assert_equal
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import assert_equal
class GetChainTipsTest (BitcoinTestFramework):
diff --git a/qa/rpc-tests/httpbasics.py b/qa/rpc-tests/httpbasics.py
index 24533741e5..8ccb821286 100755
--- a/qa/rpc-tests/httpbasics.py
+++ b/qa/rpc-tests/httpbasics.py
@@ -4,11 +4,11 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
#
-# Test REST interface
+# Test rpc http basics
#
-from test_framework import BitcoinTestFramework
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
import base64
try:
@@ -20,83 +20,83 @@ try:
except ImportError:
import urlparse
-class HTTPBasicsTest (BitcoinTestFramework):
+class HTTPBasicsTest (BitcoinTestFramework):
def setup_nodes(self):
return start_nodes(4, self.options.tmpdir, extra_args=[['-rpckeepalive=1'], ['-rpckeepalive=0'], [], []])
- def run_test(self):
-
+ def run_test(self):
+
#################################################
# lowlevel check for http persistent connection #
#################################################
url = urlparse.urlparse(self.nodes[0].url)
authpair = url.username + ':' + url.password
headers = {"Authorization": "Basic " + base64.b64encode(authpair)}
-
+
conn = httplib.HTTPConnection(url.hostname, url.port)
conn.connect()
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
out1 = conn.getresponse().read();
assert_equal('"error":null' in out1, True)
assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
-
+
#send 2nd request without closing connection
conn.request('POST', '/', '{"method": "getchaintips"}', headers)
out2 = conn.getresponse().read();
assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
conn.close()
-
+
#same should be if we add keep-alive because this should be the std. behaviour
headers = {"Authorization": "Basic " + base64.b64encode(authpair), "Connection": "keep-alive"}
-
+
conn = httplib.HTTPConnection(url.hostname, url.port)
conn.connect()
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
out1 = conn.getresponse().read();
assert_equal('"error":null' in out1, True)
assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
-
+
#send 2nd request without closing connection
conn.request('POST', '/', '{"method": "getchaintips"}', headers)
out2 = conn.getresponse().read();
assert_equal('"error":null' in out1, True) #must also response with a correct json-rpc message
assert_equal(conn.sock!=None, True) #according to http/1.1 connection must still be open!
conn.close()
-
+
#now do the same with "Connection: close"
headers = {"Authorization": "Basic " + base64.b64encode(authpair), "Connection":"close"}
-
+
conn = httplib.HTTPConnection(url.hostname, url.port)
conn.connect()
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
out1 = conn.getresponse().read();
assert_equal('"error":null' in out1, True)
- assert_equal(conn.sock!=None, False) #now the connection must be closed after the response
-
+ assert_equal(conn.sock!=None, False) #now the connection must be closed after the response
+
#node1 (2nd node) is running with disabled keep-alive option
urlNode1 = urlparse.urlparse(self.nodes[1].url)
authpair = urlNode1.username + ':' + urlNode1.password
headers = {"Authorization": "Basic " + base64.b64encode(authpair)}
-
+
conn = httplib.HTTPConnection(urlNode1.hostname, urlNode1.port)
conn.connect()
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
out1 = conn.getresponse().read();
assert_equal('"error":null' in out1, True)
assert_equal(conn.sock!=None, False) #connection must be closed because keep-alive was set to false
-
+
#node2 (third node) is running with standard keep-alive parameters which means keep-alive is off
urlNode2 = urlparse.urlparse(self.nodes[2].url)
authpair = urlNode2.username + ':' + urlNode2.password
headers = {"Authorization": "Basic " + base64.b64encode(authpair)}
-
+
conn = httplib.HTTPConnection(urlNode2.hostname, urlNode2.port)
conn.connect()
conn.request('POST', '/', '{"method": "getbestblockhash"}', headers)
out1 = conn.getresponse().read();
assert_equal('"error":null' in out1, True)
assert_equal(conn.sock!=None, True) #connection must be closed because bitcoind should use keep-alive by default
-
+
if __name__ == '__main__':
HTTPBasicsTest ().main ()
diff --git a/qa/rpc-tests/invalidateblock.py b/qa/rpc-tests/invalidateblock.py
index fd8a8e5785..2b9c8154e0 100755
--- a/qa/rpc-tests/invalidateblock.py
+++ b/qa/rpc-tests/invalidateblock.py
@@ -7,9 +7,8 @@
# Test InvalidateBlock code
#
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
class InvalidateTest(BitcoinTestFramework):
diff --git a/qa/rpc-tests/invalidblockrequest.py b/qa/rpc-tests/invalidblockrequest.py
new file mode 100755
index 0000000000..64b8e26395
--- /dev/null
+++ b/qa/rpc-tests/invalidblockrequest.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python2
+#
+# Distributed under the MIT/X11 software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#
+
+from test_framework.test_framework import ComparisonTestFramework
+from test_framework.util import *
+from test_framework.comptool import TestManager, TestInstance
+from test_framework.mininode import *
+from test_framework.blocktools import *
+import logging
+import copy
+import time
+
+
+'''
+In this test we connect to one node over p2p, and test block requests:
+1) Valid blocks should be requested and become chain tip.
+2) Invalid block with duplicated transaction should be re-requested.
+3) Invalid block with bad coinbase value should be rejected and not
+re-requested.
+'''
+
+# Use the ComparisonTestFramework with 1 node: only use --testbinary.
+class InvalidBlockRequestTest(ComparisonTestFramework):
+
+ ''' Can either run this test as 1 node with expected answers, or two and compare them.
+ Change the "outcome" variable from each TestInstance object to only do the comparison. '''
+ def __init__(self):
+ self.num_nodes = 1
+
+ def run_test(self):
+ test = TestManager(self, self.options.tmpdir)
+ test.add_all_connections(self.nodes)
+ self.tip = None
+ self.block_time = None
+ NetworkThread().start() # Start up network handling in another thread
+ test.run()
+
+ def get_tests(self):
+ if self.tip is None:
+ self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0)
+ self.block_time = int(time.time())+1
+
+ '''
+ Create a new block with an anyone-can-spend coinbase
+ '''
+ block = create_block(self.tip, create_coinbase(), self.block_time)
+ self.block_time += 1
+ block.solve()
+ # Save the coinbase for later
+ self.block1 = block
+ self.tip = block.sha256
+ yield TestInstance([[block, True]])
+
+ '''
+ Now we need that block to mature so we can spend the coinbase.
+ '''
+ test = TestInstance(sync_every_block=False)
+ for i in xrange(100):
+ block = create_block(self.tip, create_coinbase(), self.block_time)
+ block.solve()
+ self.tip = block.sha256
+ self.block_time += 1
+ test.blocks_and_transactions.append([block, True])
+ yield test
+
+ '''
+ Now we use merkle-root malleability to generate an invalid block with
+ same blockheader.
+ Manufacture a block with 3 transactions (coinbase, spend of prior
+ coinbase, spend of that spend). Duplicate the 3rd transaction to
+ leave merkle root and blockheader unchanged but invalidate the block.
+ '''
+ block2 = create_block(self.tip, create_coinbase(), self.block_time)
+ self.block_time += 1
+
+ # chr(81) is OP_TRUE
+ tx1 = create_transaction(self.block1.vtx[0], 0, chr(81), 50*100000000)
+ tx2 = create_transaction(tx1, 0, chr(81), 50*100000000)
+
+ block2.vtx.extend([tx1, tx2])
+ block2.hashMerkleRoot = block2.calc_merkle_root()
+ block2.rehash()
+ block2.solve()
+ orig_hash = block2.sha256
+ block2_orig = copy.deepcopy(block2)
+
+ # Mutate block 2
+ block2.vtx.append(tx2)
+ assert_equal(block2.hashMerkleRoot, block2.calc_merkle_root())
+ assert_equal(orig_hash, block2.rehash())
+ assert(block2_orig.vtx != block2.vtx)
+
+ self.tip = block2.sha256
+ yield TestInstance([[block2, False], [block2_orig, True]])
+
+ '''
+ Make sure that a totally screwed up block is not valid.
+ '''
+ block3 = create_block(self.tip, create_coinbase(), self.block_time)
+ self.block_time += 1
+ block3.vtx[0].vout[0].nValue = 100*100000000 # Too high!
+ block3.vtx[0].sha256=None
+ block3.vtx[0].calc_sha256()
+ block3.hashMerkleRoot = block3.calc_merkle_root()
+ block3.rehash()
+ block3.solve()
+
+ yield TestInstance([[block3, False]])
+
+
+if __name__ == '__main__':
+ InvalidBlockRequestTest().main()
diff --git a/qa/rpc-tests/keypool.py b/qa/rpc-tests/keypool.py
index 3840ea39d3..aee29a596a 100755
--- a/qa/rpc-tests/keypool.py
+++ b/qa/rpc-tests/keypool.py
@@ -8,7 +8,6 @@
# Add python-bitcoinrpc to module search path:
import os
import sys
-sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "python-bitcoinrpc"))
import json
import shutil
@@ -16,8 +15,7 @@ import subprocess
import tempfile
import traceback
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.util import *
def check_array_result(object_array, to_match, expected):
diff --git a/qa/rpc-tests/listtransactions.py b/qa/rpc-tests/listtransactions.py
index 11e3635c04..eeae2d2fa2 100755
--- a/qa/rpc-tests/listtransactions.py
+++ b/qa/rpc-tests/listtransactions.py
@@ -5,9 +5,8 @@
# Exercise the listtransactions API
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
def check_array_result(object_array, to_match, expected):
diff --git a/qa/rpc-tests/maxblocksinflight.py b/qa/rpc-tests/maxblocksinflight.py
new file mode 100755
index 0000000000..a601147ce8
--- /dev/null
+++ b/qa/rpc-tests/maxblocksinflight.py
@@ -0,0 +1,101 @@
+#!/usr/bin/env python2
+#
+# Distributed under the MIT/X11 software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#
+
+from test_framework.mininode import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+import logging
+
+'''
+In this test we connect to one node over p2p, send it numerous inv's, and
+compare the resulting number of getdata requests to a max allowed value. We
+test for exceeding 128 blocks in flight, which was the limit an 0.9 client will
+reach. [0.10 clients shouldn't request more than 16 from a single peer.]
+'''
+MAX_REQUESTS = 128
+
+class TestManager(NodeConnCB):
+ # set up NodeConnCB callbacks, overriding base class
+ def on_getdata(self, conn, message):
+ self.log.debug("got getdata %s" % repr(message))
+ # Log the requests
+ for inv in message.inv:
+ if inv.hash not in self.blockReqCounts:
+ self.blockReqCounts[inv.hash] = 0
+ self.blockReqCounts[inv.hash] += 1
+
+ def on_close(self, conn):
+ if not self.disconnectOkay:
+ raise EarlyDisconnectError(0)
+
+ def __init__(self):
+ NodeConnCB.__init__(self)
+ self.log = logging.getLogger("BlockRelayTest")
+ self.create_callback_map()
+
+ def add_new_connection(self, connection):
+ self.connection = connection
+ self.blockReqCounts = {}
+ self.disconnectOkay = False
+
+ def run(self):
+ try:
+ fail = False
+ self.connection.rpc.generate(1) # Leave IBD
+
+ numBlocksToGenerate = [ 8, 16, 128, 1024 ]
+ for count in range(len(numBlocksToGenerate)):
+ current_invs = []
+ for i in range(numBlocksToGenerate[count]):
+ current_invs.append(CInv(2, random.randrange(0, 1<<256)))
+ if len(current_invs) >= 50000:
+ self.connection.send_message(msg_inv(current_invs))
+ current_invs = []
+ if len(current_invs) > 0:
+ self.connection.send_message(msg_inv(current_invs))
+
+ # Wait and see how many blocks were requested
+ time.sleep(2)
+
+ total_requests = 0
+ with mininode_lock:
+ for key in self.blockReqCounts:
+ total_requests += self.blockReqCounts[key]
+ if self.blockReqCounts[key] > 1:
+ raise AssertionError("Error, test failed: block %064x requested more than once" % key)
+ if total_requests > MAX_REQUESTS:
+ raise AssertionError("Error, too many blocks (%d) requested" % total_requests)
+ print "Round %d: success (total requests: %d)" % (count, total_requests)
+ except AssertionError as e:
+ print "TEST FAILED: ", e.args
+
+ self.disconnectOkay = True
+ self.connection.disconnect_node()
+
+
+class MaxBlocksInFlightTest(BitcoinTestFramework):
+ def add_options(self, parser):
+ parser.add_option("--testbinary", dest="testbinary",
+ default=os.getenv("BITCOIND", "bitcoind"),
+ help="Binary to test max block requests behavior")
+
+ def setup_chain(self):
+ print "Initializing test directory "+self.options.tmpdir
+ initialize_chain_clean(self.options.tmpdir, 1)
+
+ def setup_network(self):
+ self.nodes = start_nodes(1, self.options.tmpdir,
+ extra_args=[['-debug', '-whitelist=127.0.0.1']],
+ binary=[self.options.testbinary])
+
+ def run_test(self):
+ test = TestManager()
+ test.add_new_connection(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test))
+ NetworkThread().start() # Start up network handling in another thread
+ test.run()
+
+if __name__ == '__main__':
+ MaxBlocksInFlightTest().main()
diff --git a/qa/rpc-tests/mempool_coinbase_spends.py b/qa/rpc-tests/mempool_coinbase_spends.py
index 853d031de4..c64a15b9f5 100755
--- a/qa/rpc-tests/mempool_coinbase_spends.py
+++ b/qa/rpc-tests/mempool_coinbase_spends.py
@@ -8,9 +8,8 @@
# that spend (directly or indirectly) coinbase transactions.
#
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
import os
import shutil
diff --git a/qa/rpc-tests/mempool_resurrect_test.py b/qa/rpc-tests/mempool_resurrect_test.py
index 6f7f577e36..19c74bb751 100755
--- a/qa/rpc-tests/mempool_resurrect_test.py
+++ b/qa/rpc-tests/mempool_resurrect_test.py
@@ -8,9 +8,8 @@
# the blockchain is re-organized.
#
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
import os
import shutil
@@ -34,7 +33,6 @@ class MempoolCoinbaseTest(BitcoinTestFramework):
def run_test(self):
node0_address = self.nodes[0].getnewaddress()
-
# Spend block 1/2/3's coinbase transactions
# Mine a block.
# Create three more transactions, spending the spends
diff --git a/qa/rpc-tests/mempool_spendcoinbase.py b/qa/rpc-tests/mempool_spendcoinbase.py
index ab5817c869..fc17c50692 100755
--- a/qa/rpc-tests/mempool_spendcoinbase.py
+++ b/qa/rpc-tests/mempool_spendcoinbase.py
@@ -13,9 +13,8 @@
# but less mature coinbase spends are NOT.
#
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
import os
import shutil
diff --git a/qa/rpc-tests/merkle_blocks.py b/qa/rpc-tests/merkle_blocks.py
new file mode 100755
index 0000000000..72a80ce6ca
--- /dev/null
+++ b/qa/rpc-tests/merkle_blocks.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python2
+# Copyright (c) 2014 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#
+# Test merkleblock fetch/validation
+#
+
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+import os
+import shutil
+
+class MerkleBlockTest(BitcoinTestFramework):
+
+ def setup_chain(self):
+ print("Initializing test directory "+self.options.tmpdir)
+ initialize_chain_clean(self.options.tmpdir, 4)
+
+ def setup_network(self):
+ self.nodes = []
+ # Nodes 0/1 are "wallet" nodes
+ self.nodes.append(start_node(0, self.options.tmpdir, ["-debug"]))
+ self.nodes.append(start_node(1, self.options.tmpdir, ["-debug"]))
+ # Nodes 2/3 are used for testing
+ self.nodes.append(start_node(2, self.options.tmpdir, ["-debug"]))
+ self.nodes.append(start_node(3, self.options.tmpdir, ["-debug", "-txindex"]))
+ connect_nodes(self.nodes[0], 1)
+ connect_nodes(self.nodes[0], 2)
+ connect_nodes(self.nodes[0], 3)
+
+ self.is_network_split = False
+ self.sync_all()
+
+ def run_test(self):
+ print "Mining blocks..."
+ self.nodes[0].generate(105)
+ self.sync_all()
+
+ chain_height = self.nodes[1].getblockcount()
+ assert_equal(chain_height, 105)
+ assert_equal(self.nodes[1].getbalance(), 0)
+ assert_equal(self.nodes[2].getbalance(), 0)
+
+ node0utxos = self.nodes[0].listunspent(1)
+ tx1 = self.nodes[0].createrawtransaction([node0utxos.pop()], {self.nodes[1].getnewaddress(): 50})
+ txid1 = self.nodes[0].sendrawtransaction(self.nodes[0].signrawtransaction(tx1)["hex"])
+ tx2 = self.nodes[0].createrawtransaction([node0utxos.pop()], {self.nodes[1].getnewaddress(): 50})
+ txid2 = self.nodes[0].sendrawtransaction(self.nodes[0].signrawtransaction(tx2)["hex"])
+ assert_raises(JSONRPCException, self.nodes[0].gettxoutproof, [txid1])
+
+ self.nodes[0].generate(1)
+ blockhash = self.nodes[0].getblockhash(chain_height + 1)
+ self.sync_all()
+
+ txlist = []
+ blocktxn = self.nodes[0].getblock(blockhash, True)["tx"]
+ txlist.append(blocktxn[1])
+ txlist.append(blocktxn[2])
+
+ assert_equal(self.nodes[2].verifytxoutproof(self.nodes[2].gettxoutproof([txid1])), [txid1])
+ assert_equal(self.nodes[2].verifytxoutproof(self.nodes[2].gettxoutproof([txid1, txid2])), txlist)
+ assert_equal(self.nodes[2].verifytxoutproof(self.nodes[2].gettxoutproof([txid1, txid2], blockhash)), txlist)
+
+ txin_spent = self.nodes[1].listunspent(1).pop()
+ tx3 = self.nodes[1].createrawtransaction([txin_spent], {self.nodes[0].getnewaddress(): 50})
+ self.nodes[0].sendrawtransaction(self.nodes[1].signrawtransaction(tx3)["hex"])
+ self.nodes[0].generate(1)
+ self.sync_all()
+
+ txid_spent = txin_spent["txid"]
+ txid_unspent = txid1 if txin_spent["txid"] != txid1 else txid2
+
+ # We cant find the block from a fully-spent tx
+ assert_raises(JSONRPCException, self.nodes[2].gettxoutproof, [txid_spent])
+ # ...but we can if we specify the block
+ assert_equal(self.nodes[2].verifytxoutproof(self.nodes[2].gettxoutproof([txid_spent], blockhash)), [txid_spent])
+ # ...or if the first tx is not fully-spent
+ assert_equal(self.nodes[2].verifytxoutproof(self.nodes[2].gettxoutproof([txid_unspent])), [txid_unspent])
+ try:
+ assert_equal(self.nodes[2].verifytxoutproof(self.nodes[2].gettxoutproof([txid1, txid2])), txlist)
+ except JSONRPCException:
+ assert_equal(self.nodes[2].verifytxoutproof(self.nodes[2].gettxoutproof([txid2, txid1])), txlist)
+ # ...or if we have a -txindex
+ assert_equal(self.nodes[2].verifytxoutproof(self.nodes[3].gettxoutproof([txid_spent])), [txid_spent])
+
+if __name__ == '__main__':
+ MerkleBlockTest().main()
diff --git a/qa/rpc-tests/nodehandling.py b/qa/rpc-tests/nodehandling.py
new file mode 100755
index 0000000000..9a77bd97e8
--- /dev/null
+++ b/qa/rpc-tests/nodehandling.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python2
+# Copyright (c) 2014 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#
+# Test node handling
+#
+
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+import base64
+
+try:
+ import http.client as httplib
+except ImportError:
+ import httplib
+try:
+ import urllib.parse as urlparse
+except ImportError:
+ import urlparse
+
+class NodeHandlingTest (BitcoinTestFramework):
+ def run_test(self):
+ ###########################
+ # setban/listbanned tests #
+ ###########################
+ assert_equal(len(self.nodes[2].getpeerinfo()), 4) #we should have 4 nodes at this point
+ self.nodes[2].setban("127.0.0.1", "add")
+ time.sleep(3) #wait till the nodes are disconected
+ assert_equal(len(self.nodes[2].getpeerinfo()), 0) #all nodes must be disconnected at this point
+ assert_equal(len(self.nodes[2].listbanned()), 1)
+ self.nodes[2].clearbanned()
+ assert_equal(len(self.nodes[2].listbanned()), 0)
+ self.nodes[2].setban("127.0.0.0/24", "add")
+ assert_equal(len(self.nodes[2].listbanned()), 1)
+ try:
+ self.nodes[2].setban("127.0.0.1", "add") #throws exception because 127.0.0.1 is within range 127.0.0.0/24
+ except:
+ pass
+ assert_equal(len(self.nodes[2].listbanned()), 1) #still only one banned ip because 127.0.0.1 is within the range of 127.0.0.0/24
+ try:
+ self.nodes[2].setban("127.0.0.1", "remove")
+ except:
+ pass
+ assert_equal(len(self.nodes[2].listbanned()), 1)
+ self.nodes[2].setban("127.0.0.0/24", "remove")
+ assert_equal(len(self.nodes[2].listbanned()), 0)
+ self.nodes[2].clearbanned()
+ assert_equal(len(self.nodes[2].listbanned()), 0)
+
+ ###########################
+ # RPC disconnectnode test #
+ ###########################
+ url = urlparse.urlparse(self.nodes[1].url)
+ self.nodes[0].disconnectnode(url.hostname+":"+str(p2p_port(1)))
+ time.sleep(2) #disconnecting a node needs a little bit of time
+ for node in self.nodes[0].getpeerinfo():
+ assert(node['addr'] != url.hostname+":"+str(p2p_port(1)))
+
+ connect_nodes_bi(self.nodes,0,1) #reconnect the node
+ found = False
+ for node in self.nodes[0].getpeerinfo():
+ if node['addr'] == url.hostname+":"+str(p2p_port(1)):
+ found = True
+ assert(found)
+
+if __name__ == '__main__':
+ NodeHandlingTest ().main ()
diff --git a/qa/rpc-tests/p2p-acceptblock.py b/qa/rpc-tests/p2p-acceptblock.py
new file mode 100755
index 0000000000..fcdd1e1b99
--- /dev/null
+++ b/qa/rpc-tests/p2p-acceptblock.py
@@ -0,0 +1,226 @@
+#!/usr/bin/env python2
+#
+# Distributed under the MIT/X11 software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#
+
+from test_framework.mininode import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+import time
+from test_framework.blocktools import create_block, create_coinbase
+
+'''
+AcceptBlockTest -- test processing of unrequested blocks.
+
+Since behavior differs when receiving unrequested blocks from whitelisted peers
+versus non-whitelisted peers, this tests the behavior of both (effectively two
+separate tests running in parallel).
+
+Setup: two nodes, node0 and node1, not connected to each other. Node0 does not
+whitelist localhost, but node1 does. They will each be on their own chain for
+this test.
+
+We have one NodeConn connection to each, test_node and white_node respectively.
+
+The test:
+1. Generate one block on each node, to leave IBD.
+
+2. Mine a new block on each tip, and deliver to each node from node's peer.
+ The tip should advance.
+
+3. Mine a block that forks the previous block, and deliver to each node from
+ corresponding peer.
+ Node0 should not process this block (just accept the header), because it is
+ unrequested and doesn't have more work than the tip.
+ Node1 should process because this is coming from a whitelisted peer.
+
+4. Send another block that builds on the forking block.
+ Node0 should process this block but be stuck on the shorter chain, because
+ it's missing an intermediate block.
+ Node1 should reorg to this longer chain.
+
+5. Send a duplicate of the block in #3 to Node0.
+ Node0 should not process the block because it is unrequested, and stay on
+ the shorter chain.
+
+6. Send Node0 an inv for the height 3 block produced in #4 above.
+ Node0 should figure out that Node0 has the missing height 2 block and send a
+ getdata.
+
+7. Send Node0 the missing block again.
+ Node0 should process and the tip should advance.
+'''
+
+# TestNode: bare-bones "peer". Used mostly as a conduit for a test to sending
+# p2p messages to a node, generating the messages in the main testing logic.
+class TestNode(NodeConnCB):
+ def __init__(self):
+ NodeConnCB.__init__(self)
+ self.create_callback_map()
+ self.connection = None
+
+ def add_connection(self, conn):
+ self.connection = conn
+
+ # Track the last getdata message we receive (used in the test)
+ def on_getdata(self, conn, message):
+ self.last_getdata = message
+
+ # Spin until verack message is received from the node.
+ # We use this to signal that our test can begin. This
+ # is called from the testing thread, so it needs to acquire
+ # the global lock.
+ def wait_for_verack(self):
+ while True:
+ with mininode_lock:
+ if self.verack_received:
+ return
+ time.sleep(0.05)
+
+ # Wrapper for the NodeConn's send_message function
+ def send_message(self, message):
+ self.connection.send_message(message)
+
+class AcceptBlockTest(BitcoinTestFramework):
+ def add_options(self, parser):
+ parser.add_option("--testbinary", dest="testbinary",
+ default=os.getenv("BITCOIND", "bitcoind"),
+ help="bitcoind binary to test")
+
+ def setup_chain(self):
+ initialize_chain_clean(self.options.tmpdir, 2)
+
+ def setup_network(self):
+ # Node0 will be used to test behavior of processing unrequested blocks
+ # from peers which are not whitelisted, while Node1 will be used for
+ # the whitelisted case.
+ self.nodes = []
+ self.nodes.append(start_node(0, self.options.tmpdir, ["-debug"],
+ binary=self.options.testbinary))
+ self.nodes.append(start_node(1, self.options.tmpdir,
+ ["-debug", "-whitelist=127.0.0.1"],
+ binary=self.options.testbinary))
+
+ def run_test(self):
+ # Setup the p2p connections and start up the network thread.
+ test_node = TestNode() # connects to node0 (not whitelisted)
+ white_node = TestNode() # connects to node1 (whitelisted)
+
+ connections = []
+ connections.append(NodeConn('127.0.0.1', p2p_port(0), self.nodes[0], test_node))
+ connections.append(NodeConn('127.0.0.1', p2p_port(1), self.nodes[1], white_node))
+ test_node.add_connection(connections[0])
+ white_node.add_connection(connections[1])
+
+ NetworkThread().start() # Start up network handling in another thread
+
+ # Test logic begins here
+ test_node.wait_for_verack()
+ white_node.wait_for_verack()
+
+ # 1. Have both nodes mine a block (leave IBD)
+ [ n.generate(1) for n in self.nodes ]
+ tips = [ int ("0x" + n.getbestblockhash() + "L", 0) for n in self.nodes ]
+
+ # 2. Send one block that builds on each tip.
+ # This should be accepted.
+ blocks_h2 = [] # the height 2 blocks on each node's chain
+ for i in xrange(2):
+ blocks_h2.append(create_block(tips[i], create_coinbase(), time.time()+1))
+ blocks_h2[i].solve()
+ test_node.send_message(msg_block(blocks_h2[0]))
+ white_node.send_message(msg_block(blocks_h2[1]))
+
+ time.sleep(1)
+ assert_equal(self.nodes[0].getblockcount(), 2)
+ assert_equal(self.nodes[1].getblockcount(), 2)
+ print "First height 2 block accepted by both nodes"
+
+ # 3. Send another block that builds on the original tip.
+ blocks_h2f = [] # Blocks at height 2 that fork off the main chain
+ for i in xrange(2):
+ blocks_h2f.append(create_block(tips[i], create_coinbase(), blocks_h2[i].nTime+1))
+ blocks_h2f[i].solve()
+ test_node.send_message(msg_block(blocks_h2f[0]))
+ white_node.send_message(msg_block(blocks_h2f[1]))
+
+ time.sleep(1) # Give time to process the block
+ for x in self.nodes[0].getchaintips():
+ if x['hash'] == blocks_h2f[0].hash:
+ assert_equal(x['status'], "headers-only")
+
+ for x in self.nodes[1].getchaintips():
+ if x['hash'] == blocks_h2f[1].hash:
+ assert_equal(x['status'], "valid-headers")
+
+ print "Second height 2 block accepted only from whitelisted peer"
+
+ # 4. Now send another block that builds on the forking chain.
+ blocks_h3 = []
+ for i in xrange(2):
+ blocks_h3.append(create_block(blocks_h2f[i].sha256, create_coinbase(), blocks_h2f[i].nTime+1))
+ blocks_h3[i].solve()
+ test_node.send_message(msg_block(blocks_h3[0]))
+ white_node.send_message(msg_block(blocks_h3[1]))
+
+ time.sleep(1)
+ # Since the earlier block was not processed by node0, the new block
+ # can't be fully validated.
+ for x in self.nodes[0].getchaintips():
+ if x['hash'] == blocks_h3[0].hash:
+ assert_equal(x['status'], "headers-only")
+
+ # But this block should be accepted by node0 since it has more work.
+ try:
+ self.nodes[0].getblock(blocks_h3[0].hash)
+ print "Unrequested more-work block accepted from non-whitelisted peer"
+ except:
+ raise AssertionError("Unrequested more work block was not processed")
+
+ # Node1 should have accepted and reorged.
+ assert_equal(self.nodes[1].getblockcount(), 3)
+ print "Successfully reorged to length 3 chain from whitelisted peer"
+
+ # 5. Test handling of unrequested block on the node that didn't process
+ # Should still not be processed (even though it has a child that has more
+ # work).
+ test_node.send_message(msg_block(blocks_h2f[0]))
+
+ # Here, if the sleep is too short, the test could falsely succeed (if the
+ # node hasn't processed the block by the time the sleep returns, and then
+ # the node processes it and incorrectly advances the tip).
+ # But this would be caught later on, when we verify that an inv triggers
+ # a getdata request for this block.
+ time.sleep(1)
+ assert_equal(self.nodes[0].getblockcount(), 2)
+ print "Unrequested block that would complete more-work chain was ignored"
+
+ # 6. Try to get node to request the missing block.
+ # Poke the node with an inv for block at height 3 and see if that
+ # triggers a getdata on block 2 (it should if block 2 is missing).
+ with mininode_lock:
+ # Clear state so we can check the getdata request
+ test_node.last_getdata = None
+ test_node.send_message(msg_inv([CInv(2, blocks_h3[0].sha256)]))
+
+ time.sleep(1)
+ with mininode_lock:
+ getdata = test_node.last_getdata
+
+ # Check that the getdata is for the right block
+ assert_equal(len(getdata.inv), 1)
+ assert_equal(getdata.inv[0].hash, blocks_h2f[0].sha256)
+ print "Inv at tip triggered getdata for unprocessed block"
+
+ # 7. Send the missing block for the third time (now it is requested)
+ test_node.send_message(msg_block(blocks_h2f[0]))
+
+ time.sleep(1)
+ assert_equal(self.nodes[0].getblockcount(), 3)
+ print "Successfully reorged to length 3 chain from non-whitelisted peer"
+
+ [ c.disconnect_node() for c in connections ]
+
+if __name__ == '__main__':
+ AcceptBlockTest().main()
diff --git a/qa/rpc-tests/proxy_test.py b/qa/rpc-tests/proxy_test.py
new file mode 100755
index 0000000000..3623c16162
--- /dev/null
+++ b/qa/rpc-tests/proxy_test.py
@@ -0,0 +1,180 @@
+#!/usr/bin/env python2
+# Copyright (c) 2015 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+import socket
+import traceback, sys
+from binascii import hexlify
+import time, os
+
+from test_framework.socks5 import Socks5Configuration, Socks5Command, Socks5Server, AddressType
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+'''
+Test plan:
+- Start bitcoind's with different proxy configurations
+- Use addnode to initiate connections
+- Verify that proxies are connected to, and the right connection command is given
+- Proxy configurations to test on bitcoind side:
+ - `-proxy` (proxy everything)
+ - `-onion` (proxy just onions)
+ - `-proxyrandomize` Circuit randomization
+- Proxy configurations to test on proxy side,
+ - support no authentication (other proxy)
+ - support no authentication + user/pass authentication (Tor)
+ - proxy on IPv6
+
+- Create various proxies (as threads)
+- Create bitcoinds that connect to them
+- Manipulate the bitcoinds using addnode (onetry) an observe effects
+
+addnode connect to IPv4
+addnode connect to IPv6
+addnode connect to onion
+addnode connect to generic DNS name
+'''
+
+class ProxyTest(BitcoinTestFramework):
+ def __init__(self):
+ # Create two proxies on different ports
+ # ... one unauthenticated
+ self.conf1 = Socks5Configuration()
+ self.conf1.addr = ('127.0.0.1', 13000 + (os.getpid() % 1000))
+ self.conf1.unauth = True
+ self.conf1.auth = False
+ # ... one supporting authenticated and unauthenticated (Tor)
+ self.conf2 = Socks5Configuration()
+ self.conf2.addr = ('127.0.0.1', 14000 + (os.getpid() % 1000))
+ self.conf2.unauth = True
+ self.conf2.auth = True
+ # ... one on IPv6 with similar configuration
+ self.conf3 = Socks5Configuration()
+ self.conf3.af = socket.AF_INET6
+ self.conf3.addr = ('::1', 15000 + (os.getpid() % 1000))
+ self.conf3.unauth = True
+ self.conf3.auth = True
+
+ self.serv1 = Socks5Server(self.conf1)
+ self.serv1.start()
+ self.serv2 = Socks5Server(self.conf2)
+ self.serv2.start()
+ self.serv3 = Socks5Server(self.conf3)
+ self.serv3.start()
+
+ def setup_nodes(self):
+ # Note: proxies are not used to connect to local nodes
+ # this is because the proxy to use is based on CService.GetNetwork(), which return NET_UNROUTABLE for localhost
+ return start_nodes(4, self.options.tmpdir, extra_args=[
+ ['-listen', '-debug=net', '-debug=proxy', '-proxy=%s:%i' % (self.conf1.addr),'-proxyrandomize=1'],
+ ['-listen', '-debug=net', '-debug=proxy', '-proxy=%s:%i' % (self.conf1.addr),'-onion=%s:%i' % (self.conf2.addr),'-proxyrandomize=0'],
+ ['-listen', '-debug=net', '-debug=proxy', '-proxy=%s:%i' % (self.conf2.addr),'-proxyrandomize=1'],
+ ['-listen', '-debug=net', '-debug=proxy', '-proxy=[%s]:%i' % (self.conf3.addr),'-proxyrandomize=0', '-noonion']
+ ])
+
+ def node_test(self, node, proxies, auth, test_onion=True):
+ rv = []
+ # Test: outgoing IPv4 connection through node
+ node.addnode("15.61.23.23:1234", "onetry")
+ cmd = proxies[0].queue.get()
+ assert(isinstance(cmd, Socks5Command))
+ # Note: bitcoind's SOCKS5 implementation only sends atyp DOMAINNAME, even if connecting directly to IPv4/IPv6
+ assert_equal(cmd.atyp, AddressType.DOMAINNAME)
+ assert_equal(cmd.addr, "15.61.23.23")
+ assert_equal(cmd.port, 1234)
+ if not auth:
+ assert_equal(cmd.username, None)
+ assert_equal(cmd.password, None)
+ rv.append(cmd)
+
+ # Test: outgoing IPv6 connection through node
+ node.addnode("[1233:3432:2434:2343:3234:2345:6546:4534]:5443", "onetry")
+ cmd = proxies[1].queue.get()
+ assert(isinstance(cmd, Socks5Command))
+ # Note: bitcoind's SOCKS5 implementation only sends atyp DOMAINNAME, even if connecting directly to IPv4/IPv6
+ assert_equal(cmd.atyp, AddressType.DOMAINNAME)
+ assert_equal(cmd.addr, "1233:3432:2434:2343:3234:2345:6546:4534")
+ assert_equal(cmd.port, 5443)
+ if not auth:
+ assert_equal(cmd.username, None)
+ assert_equal(cmd.password, None)
+ rv.append(cmd)
+
+ if test_onion:
+ # Test: outgoing onion connection through node
+ node.addnode("bitcoinostk4e4re.onion:8333", "onetry")
+ cmd = proxies[2].queue.get()
+ assert(isinstance(cmd, Socks5Command))
+ assert_equal(cmd.atyp, AddressType.DOMAINNAME)
+ assert_equal(cmd.addr, "bitcoinostk4e4re.onion")
+ assert_equal(cmd.port, 8333)
+ if not auth:
+ assert_equal(cmd.username, None)
+ assert_equal(cmd.password, None)
+ rv.append(cmd)
+
+ # Test: outgoing DNS name connection through node
+ node.addnode("node.noumenon:8333", "onetry")
+ cmd = proxies[3].queue.get()
+ assert(isinstance(cmd, Socks5Command))
+ assert_equal(cmd.atyp, AddressType.DOMAINNAME)
+ assert_equal(cmd.addr, "node.noumenon")
+ assert_equal(cmd.port, 8333)
+ if not auth:
+ assert_equal(cmd.username, None)
+ assert_equal(cmd.password, None)
+ rv.append(cmd)
+
+ return rv
+
+ def run_test(self):
+ # basic -proxy
+ self.node_test(self.nodes[0], [self.serv1, self.serv1, self.serv1, self.serv1], False)
+
+ # -proxy plus -onion
+ self.node_test(self.nodes[1], [self.serv1, self.serv1, self.serv2, self.serv1], False)
+
+ # -proxy plus -onion, -proxyrandomize
+ rv = self.node_test(self.nodes[2], [self.serv2, self.serv2, self.serv2, self.serv2], True)
+ # Check that credentials as used for -proxyrandomize connections are unique
+ credentials = set((x.username,x.password) for x in rv)
+ assert_equal(len(credentials), 4)
+
+ # proxy on IPv6 localhost
+ self.node_test(self.nodes[3], [self.serv3, self.serv3, self.serv3, self.serv3], False, False)
+
+ def networks_dict(d):
+ r = {}
+ for x in d['networks']:
+ r[x['name']] = x
+ return r
+
+ # test RPC getnetworkinfo
+ n0 = networks_dict(self.nodes[0].getnetworkinfo())
+ for net in ['ipv4','ipv6','onion']:
+ assert_equal(n0[net]['proxy'], '%s:%i' % (self.conf1.addr))
+ assert_equal(n0[net]['proxy_randomize_credentials'], True)
+ assert_equal(n0['onion']['reachable'], True)
+
+ n1 = networks_dict(self.nodes[1].getnetworkinfo())
+ for net in ['ipv4','ipv6']:
+ assert_equal(n1[net]['proxy'], '%s:%i' % (self.conf1.addr))
+ assert_equal(n1[net]['proxy_randomize_credentials'], False)
+ assert_equal(n1['onion']['proxy'], '%s:%i' % (self.conf2.addr))
+ assert_equal(n1['onion']['proxy_randomize_credentials'], False)
+ assert_equal(n1['onion']['reachable'], True)
+
+ n2 = networks_dict(self.nodes[2].getnetworkinfo())
+ for net in ['ipv4','ipv6','onion']:
+ assert_equal(n2[net]['proxy'], '%s:%i' % (self.conf2.addr))
+ assert_equal(n2[net]['proxy_randomize_credentials'], True)
+ assert_equal(n2['onion']['reachable'], True)
+
+ n3 = networks_dict(self.nodes[3].getnetworkinfo())
+ for net in ['ipv4','ipv6']:
+ assert_equal(n3[net]['proxy'], '[%s]:%i' % (self.conf3.addr))
+ assert_equal(n3[net]['proxy_randomize_credentials'], False)
+ assert_equal(n3['onion']['reachable'], False)
+
+if __name__ == '__main__':
+ ProxyTest().main()
+
diff --git a/qa/rpc-tests/pruning.py b/qa/rpc-tests/pruning.py
new file mode 100755
index 0000000000..2824c51ce7
--- /dev/null
+++ b/qa/rpc-tests/pruning.py
@@ -0,0 +1,356 @@
+#!/usr/bin/env python2
+# Copyright (c) 2014 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#
+# Test pruning code
+# ********
+# WARNING:
+# This test uses 4GB of disk space.
+# This test takes 30 mins or more (up to 2 hours)
+# ********
+
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+import os.path
+
+def calc_usage(blockdir):
+ return sum(os.path.getsize(blockdir+f) for f in os.listdir(blockdir) if os.path.isfile(blockdir+f))/(1024*1024)
+
+class PruneTest(BitcoinTestFramework):
+
+ def __init__(self):
+ self.utxo = []
+ self.address = ["",""]
+
+ # Some pre-processing to create a bunch of OP_RETURN txouts to insert into transactions we create
+ # So we have big transactions and full blocks to fill up our block files
+
+ # create one script_pubkey
+ script_pubkey = "6a4d0200" #OP_RETURN OP_PUSH2 512 bytes
+ for i in xrange (512):
+ script_pubkey = script_pubkey + "01"
+ # concatenate 128 txouts of above script_pubkey which we'll insert before the txout for change
+ self.txouts = "81"
+ for k in xrange(128):
+ # add txout value
+ self.txouts = self.txouts + "0000000000000000"
+ # add length of script_pubkey
+ self.txouts = self.txouts + "fd0402"
+ # add script_pubkey
+ self.txouts = self.txouts + script_pubkey
+
+
+ def setup_chain(self):
+ print("Initializing test directory "+self.options.tmpdir)
+ initialize_chain_clean(self.options.tmpdir, 3)
+
+ def setup_network(self):
+ self.nodes = []
+ self.is_network_split = False
+
+ # Create nodes 0 and 1 to mine
+ self.nodes.append(start_node(0, self.options.tmpdir, ["-debug","-maxreceivebuffer=20000","-blockmaxsize=999000", "-checkblocks=5"], timewait=900))
+ self.nodes.append(start_node(1, self.options.tmpdir, ["-debug","-maxreceivebuffer=20000","-blockmaxsize=999000", "-checkblocks=5"], timewait=900))
+
+ # Create node 2 to test pruning
+ self.nodes.append(start_node(2, self.options.tmpdir, ["-debug","-maxreceivebuffer=20000","-prune=550"], timewait=900))
+ self.prunedir = self.options.tmpdir+"/node2/regtest/blocks/"
+
+ self.address[0] = self.nodes[0].getnewaddress()
+ self.address[1] = self.nodes[1].getnewaddress()
+
+ connect_nodes(self.nodes[0], 1)
+ connect_nodes(self.nodes[1], 2)
+ connect_nodes(self.nodes[2], 0)
+ sync_blocks(self.nodes[0:3])
+
+ def create_big_chain(self):
+ # Start by creating some coinbases we can spend later
+ self.nodes[1].generate(200)
+ sync_blocks(self.nodes[0:2])
+ self.nodes[0].generate(150)
+ # Then mine enough full blocks to create more than 550MB of data
+ for i in xrange(645):
+ self.mine_full_block(self.nodes[0], self.address[0])
+
+ sync_blocks(self.nodes[0:3])
+
+ def test_height_min(self):
+ if not os.path.isfile(self.prunedir+"blk00000.dat"):
+ raise AssertionError("blk00000.dat is missing, pruning too early")
+ print "Success"
+ print "Though we're already using more than 550MB, current usage:", calc_usage(self.prunedir)
+ print "Mining 25 more blocks should cause the first block file to be pruned"
+ # Pruning doesn't run until we're allocating another chunk, 20 full blocks past the height cutoff will ensure this
+ for i in xrange(25):
+ self.mine_full_block(self.nodes[0],self.address[0])
+
+ waitstart = time.time()
+ while os.path.isfile(self.prunedir+"blk00000.dat"):
+ time.sleep(0.1)
+ if time.time() - waitstart > 10:
+ raise AssertionError("blk00000.dat not pruned when it should be")
+
+ print "Success"
+ usage = calc_usage(self.prunedir)
+ print "Usage should be below target:", usage
+ if (usage > 550):
+ raise AssertionError("Pruning target not being met")
+
+ def create_chain_with_staleblocks(self):
+ # Create stale blocks in manageable sized chunks
+ print "Mine 24 (stale) blocks on Node 1, followed by 25 (main chain) block reorg from Node 0, for 12 rounds"
+
+ for j in xrange(12):
+ # Disconnect node 0 so it can mine a longer reorg chain without knowing about node 1's soon-to-be-stale chain
+ # Node 2 stays connected, so it hears about the stale blocks and then reorg's when node0 reconnects
+ # Stopping node 0 also clears its mempool, so it doesn't have node1's transactions to accidentally mine
+ stop_node(self.nodes[0],0)
+ self.nodes[0]=start_node(0, self.options.tmpdir, ["-debug","-maxreceivebuffer=20000","-blockmaxsize=999000", "-checkblocks=5"], timewait=900)
+ # Mine 24 blocks in node 1
+ self.utxo = self.nodes[1].listunspent()
+ for i in xrange(24):
+ if j == 0:
+ self.mine_full_block(self.nodes[1],self.address[1])
+ else:
+ self.nodes[1].generate(1) #tx's already in mempool from previous disconnects
+
+ # Reorg back with 25 block chain from node 0
+ self.utxo = self.nodes[0].listunspent()
+ for i in xrange(25):
+ self.mine_full_block(self.nodes[0],self.address[0])
+
+ # Create connections in the order so both nodes can see the reorg at the same time
+ connect_nodes(self.nodes[1], 0)
+ connect_nodes(self.nodes[2], 0)
+ sync_blocks(self.nodes[0:3])
+
+ print "Usage can be over target because of high stale rate:", calc_usage(self.prunedir)
+
+ def reorg_test(self):
+ # Node 1 will mine a 300 block chain starting 287 blocks back from Node 0 and Node 2's tip
+ # This will cause Node 2 to do a reorg requiring 288 blocks of undo data to the reorg_test chain
+ # Reboot node 1 to clear its mempool (hopefully make the invalidate faster)
+ # Lower the block max size so we don't keep mining all our big mempool transactions (from disconnected blocks)
+ stop_node(self.nodes[1],1)
+ self.nodes[1]=start_node(1, self.options.tmpdir, ["-debug","-maxreceivebuffer=20000","-blockmaxsize=5000", "-checkblocks=5", "-disablesafemode"], timewait=900)
+
+ height = self.nodes[1].getblockcount()
+ print "Current block height:", height
+
+ invalidheight = height-287
+ badhash = self.nodes[1].getblockhash(invalidheight)
+ print "Invalidating block at height:",invalidheight,badhash
+ self.nodes[1].invalidateblock(badhash)
+
+ # We've now switched to our previously mined-24 block fork on node 1, but thats not what we want
+ # So invalidate that fork as well, until we're on the same chain as node 0/2 (but at an ancestor 288 blocks ago)
+ mainchainhash = self.nodes[0].getblockhash(invalidheight - 1)
+ curhash = self.nodes[1].getblockhash(invalidheight - 1)
+ while curhash != mainchainhash:
+ self.nodes[1].invalidateblock(curhash)
+ curhash = self.nodes[1].getblockhash(invalidheight - 1)
+
+ assert(self.nodes[1].getblockcount() == invalidheight - 1)
+ print "New best height", self.nodes[1].getblockcount()
+
+ # Reboot node1 to clear those giant tx's from mempool
+ stop_node(self.nodes[1],1)
+ self.nodes[1]=start_node(1, self.options.tmpdir, ["-debug","-maxreceivebuffer=20000","-blockmaxsize=5000", "-checkblocks=5", "-disablesafemode"], timewait=900)
+
+ print "Generating new longer chain of 300 more blocks"
+ self.nodes[1].generate(300)
+
+ print "Reconnect nodes"
+ connect_nodes(self.nodes[0], 1)
+ connect_nodes(self.nodes[2], 1)
+ sync_blocks(self.nodes[0:3])
+
+ print "Verify height on node 2:",self.nodes[2].getblockcount()
+ print "Usage possibly still high bc of stale blocks in block files:", calc_usage(self.prunedir)
+
+ print "Mine 220 more blocks so we have requisite history (some blocks will be big and cause pruning of previous chain)"
+ self.nodes[0].generate(220) #node 0 has many large tx's in its mempool from the disconnects
+ sync_blocks(self.nodes[0:3])
+
+ usage = calc_usage(self.prunedir)
+ print "Usage should be below target:", usage
+ if (usage > 550):
+ raise AssertionError("Pruning target not being met")
+
+ return invalidheight,badhash
+
+ def reorg_back(self):
+ # Verify that a block on the old main chain fork has been pruned away
+ try:
+ self.nodes[2].getblock(self.forkhash)
+ raise AssertionError("Old block wasn't pruned so can't test redownload")
+ except JSONRPCException as e:
+ print "Will need to redownload block",self.forkheight
+
+ # Verify that we have enough history to reorg back to the fork point
+ # Although this is more than 288 blocks, because this chain was written more recently
+ # and only its other 299 small and 220 large block are in the block files after it,
+ # its expected to still be retained
+ self.nodes[2].getblock(self.nodes[2].getblockhash(self.forkheight))
+
+ first_reorg_height = self.nodes[2].getblockcount()
+ curchainhash = self.nodes[2].getblockhash(self.mainchainheight)
+ self.nodes[2].invalidateblock(curchainhash)
+ goalbestheight = self.mainchainheight
+ goalbesthash = self.mainchainhash2
+
+ # As of 0.10 the current block download logic is not able to reorg to the original chain created in
+ # create_chain_with_stale_blocks because it doesn't know of any peer thats on that chain from which to
+ # redownload its missing blocks.
+ # Invalidate the reorg_test chain in node 0 as well, it can successfully switch to the original chain
+ # because it has all the block data.
+ # However it must mine enough blocks to have a more work chain than the reorg_test chain in order
+ # to trigger node 2's block download logic.
+ # At this point node 2 is within 288 blocks of the fork point so it will preserve its ability to reorg
+ if self.nodes[2].getblockcount() < self.mainchainheight:
+ blocks_to_mine = first_reorg_height + 1 - self.mainchainheight
+ print "Rewind node 0 to prev main chain to mine longer chain to trigger redownload. Blocks needed:", blocks_to_mine
+ self.nodes[0].invalidateblock(curchainhash)
+ assert(self.nodes[0].getblockcount() == self.mainchainheight)
+ assert(self.nodes[0].getbestblockhash() == self.mainchainhash2)
+ goalbesthash = self.nodes[0].generate(blocks_to_mine)[-1]
+ goalbestheight = first_reorg_height + 1
+
+ print "Verify node 2 reorged back to the main chain, some blocks of which it had to redownload"
+ waitstart = time.time()
+ while self.nodes[2].getblockcount() < goalbestheight:
+ time.sleep(0.1)
+ if time.time() - waitstart > 900:
+ raise AssertionError("Node 2 didn't reorg to proper height")
+ assert(self.nodes[2].getbestblockhash() == goalbesthash)
+ # Verify we can now have the data for a block previously pruned
+ assert(self.nodes[2].getblock(self.forkhash)["height"] == self.forkheight)
+
+ def mine_full_block(self, node, address):
+ # Want to create a full block
+ # We'll generate a 66k transaction below, and 14 of them is close to the 1MB block limit
+ for j in xrange(14):
+ if len(self.utxo) < 14:
+ self.utxo = node.listunspent()
+ inputs=[]
+ outputs = {}
+ t = self.utxo.pop()
+ inputs.append({ "txid" : t["txid"], "vout" : t["vout"]})
+ remchange = t["amount"] - Decimal("0.001000")
+ outputs[address]=remchange
+ # Create a basic transaction that will send change back to ourself after account for a fee
+ # And then insert the 128 generated transaction outs in the middle rawtx[92] is where the #
+ # of txouts is stored and is the only thing we overwrite from the original transaction
+ rawtx = node.createrawtransaction(inputs, outputs)
+ newtx = rawtx[0:92]
+ newtx = newtx + self.txouts
+ newtx = newtx + rawtx[94:]
+ # Appears to be ever so slightly faster to sign with SIGHASH_NONE
+ signresult = node.signrawtransaction(newtx,None,None,"NONE")
+ txid = node.sendrawtransaction(signresult["hex"], True)
+ # Mine a full sized block which will be these transactions we just created
+ node.generate(1)
+
+
+ def run_test(self):
+ print "Warning! This test requires 4GB of disk space and takes over 30 mins (up to 2 hours)"
+ print "Mining a big blockchain of 995 blocks"
+ self.create_big_chain()
+ # Chain diagram key:
+ # * blocks on main chain
+ # +,&,$,@ blocks on other forks
+ # X invalidated block
+ # N1 Node 1
+ #
+ # Start by mining a simple chain that all nodes have
+ # N0=N1=N2 **...*(995)
+
+ print "Check that we haven't started pruning yet because we're below PruneAfterHeight"
+ self.test_height_min()
+ # Extend this chain past the PruneAfterHeight
+ # N0=N1=N2 **...*(1020)
+
+ print "Check that we'll exceed disk space target if we have a very high stale block rate"
+ self.create_chain_with_staleblocks()
+ # Disconnect N0
+ # And mine a 24 block chain on N1 and a separate 25 block chain on N0
+ # N1=N2 **...*+...+(1044)
+ # N0 **...**...**(1045)
+ #
+ # reconnect nodes causing reorg on N1 and N2
+ # N1=N2 **...*(1020) *...**(1045)
+ # \
+ # +...+(1044)
+ #
+ # repeat this process until you have 12 stale forks hanging off the
+ # main chain on N1 and N2
+ # N0 *************************...***************************(1320)
+ #
+ # N1=N2 **...*(1020) *...**(1045) *.. ..**(1295) *...**(1320)
+ # \ \ \
+ # +...+(1044) &.. $...$(1319)
+
+ # Save some current chain state for later use
+ self.mainchainheight = self.nodes[2].getblockcount() #1320
+ self.mainchainhash2 = self.nodes[2].getblockhash(self.mainchainheight)
+
+ print "Check that we can survive a 288 block reorg still"
+ (self.forkheight,self.forkhash) = self.reorg_test() #(1033, )
+ # Now create a 288 block reorg by mining a longer chain on N1
+ # First disconnect N1
+ # Then invalidate 1033 on main chain and 1032 on fork so height is 1032 on main chain
+ # N1 **...*(1020) **...**(1032)X..
+ # \
+ # ++...+(1031)X..
+ #
+ # Now mine 300 more blocks on N1
+ # N1 **...*(1020) **...**(1032) @@...@(1332)
+ # \ \
+ # \ X...
+ # \ \
+ # ++...+(1031)X.. ..
+ #
+ # Reconnect nodes and mine 220 more blocks on N1
+ # N1 **...*(1020) **...**(1032) @@...@@@(1552)
+ # \ \
+ # \ X...
+ # \ \
+ # ++...+(1031)X.. ..
+ #
+ # N2 **...*(1020) **...**(1032) @@...@@@(1552)
+ # \ \
+ # \ *...**(1320)
+ # \ \
+ # ++...++(1044) ..
+ #
+ # N0 ********************(1032) @@...@@@(1552)
+ # \
+ # *...**(1320)
+
+ print "Test that we can rerequest a block we previously pruned if needed for a reorg"
+ self.reorg_back()
+ # Verify that N2 still has block 1033 on current chain (@), but not on main chain (*)
+ # Invalidate 1033 on current chain (@) on N2 and we should be able to reorg to
+ # original main chain (*), but will require redownload of some blocks
+ # In order to have a peer we think we can download from, must also perform this invalidation
+ # on N0 and mine a new longest chain to trigger.
+ # Final result:
+ # N0 ********************(1032) **...****(1553)
+ # \
+ # X@...@@@(1552)
+ #
+ # N2 **...*(1020) **...**(1032) **...****(1553)
+ # \ \
+ # \ X@...@@@(1552)
+ # \
+ # +..
+ #
+ # N1 doesn't change because 1033 on main chain (*) is invalid
+
+ print "Done"
+
+if __name__ == '__main__':
+ PruneTest().main()
diff --git a/qa/rpc-tests/python-bitcoinrpc/bitcoinrpc/.gitignore b/qa/rpc-tests/python-bitcoinrpc/bitcoinrpc/.gitignore
deleted file mode 100644
index 0d20b6487c..0000000000
--- a/qa/rpc-tests/python-bitcoinrpc/bitcoinrpc/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-*.pyc
diff --git a/qa/rpc-tests/python-bitcoinrpc/setup.py b/qa/rpc-tests/python-bitcoinrpc/setup.py
deleted file mode 100644
index 43cdb1c038..0000000000
--- a/qa/rpc-tests/python-bitcoinrpc/setup.py
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env python2
-
-from distutils.core import setup
-
-setup(name='python-bitcoinrpc',
- version='0.1',
- description='Enhanced version of python-jsonrpc for use with Bitcoin',
- long_description=open('README').read(),
- author='Jeff Garzik',
- author_email='<jgarzik@exmulti.com>',
- maintainer='Jeff Garzik',
- maintainer_email='<jgarzik@exmulti.com>',
- url='http://www.github.com/jgarzik/python-bitcoinrpc',
- packages=['bitcoinrpc'],
- classifiers=['License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)', 'Operating System :: OS Independent'])
diff --git a/qa/rpc-tests/rawtransactions.py b/qa/rpc-tests/rawtransactions.py
new file mode 100755
index 0000000000..1378514c84
--- /dev/null
+++ b/qa/rpc-tests/rawtransactions.py
@@ -0,0 +1,144 @@
+#!/usr/bin/env python2
+# Copyright (c) 2014 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#
+# Test re-org scenarios with a mempool that contains transactions
+# that spend (directly or indirectly) coinbase transactions.
+#
+
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+from pprint import pprint
+from time import sleep
+
+# Create one-input, one-output, no-fee transaction:
+class RawTransactionsTest(BitcoinTestFramework):
+
+ def setup_chain(self):
+ print("Initializing test directory "+self.options.tmpdir)
+ initialize_chain_clean(self.options.tmpdir, 3)
+
+ def setup_network(self, split=False):
+ self.nodes = start_nodes(3, self.options.tmpdir)
+
+ #connect to a local machine for debugging
+ #url = "http://bitcoinrpc:DP6DvqZtqXarpeNWyN3LZTFchCCyCUuHwNF7E8pX99x1@%s:%d" % ('127.0.0.1', 18332)
+ #proxy = AuthServiceProxy(url)
+ #proxy.url = url # store URL on proxy for info
+ #self.nodes.append(proxy)
+
+ connect_nodes_bi(self.nodes,0,1)
+ connect_nodes_bi(self.nodes,1,2)
+ connect_nodes_bi(self.nodes,0,2)
+
+ self.is_network_split=False
+ self.sync_all()
+
+ def run_test(self):
+
+ #prepare some coins for multiple *rawtransaction commands
+ self.nodes[2].generate(1)
+ self.nodes[0].generate(101)
+ self.sync_all()
+ self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.5);
+ self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),1.0);
+ self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(),5.0);
+ self.sync_all()
+ self.nodes[0].generate(5)
+ self.sync_all()
+
+ #########################################
+ # sendrawtransaction with missing input #
+ #########################################
+ inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1}] #won't exists
+ outputs = { self.nodes[0].getnewaddress() : 4.998 }
+ rawtx = self.nodes[2].createrawtransaction(inputs, outputs)
+ rawtx = self.nodes[2].signrawtransaction(rawtx)
+
+ errorString = ""
+ try:
+ rawtx = self.nodes[2].sendrawtransaction(rawtx['hex'])
+ except JSONRPCException,e:
+ errorString = e.error['message']
+
+ assert_equal("Missing inputs" in errorString, True);
+
+ #########################
+ # RAW TX MULTISIG TESTS #
+ #########################
+ # 2of2 test
+ addr1 = self.nodes[2].getnewaddress()
+ addr2 = self.nodes[2].getnewaddress()
+
+ addr1Obj = self.nodes[2].validateaddress(addr1)
+ addr2Obj = self.nodes[2].validateaddress(addr2)
+
+ mSigObj = self.nodes[2].addmultisigaddress(2, [addr1Obj['pubkey'], addr2Obj['pubkey']])
+ mSigObjValid = self.nodes[2].validateaddress(mSigObj)
+
+ #use balance deltas instead of absolute values
+ bal = self.nodes[2].getbalance()
+
+ # send 1.2 BTC to msig adr
+ txId = self.nodes[0].sendtoaddress(mSigObj, 1.2);
+ self.sync_all()
+ self.nodes[0].generate(1)
+ self.sync_all()
+ assert_equal(self.nodes[2].getbalance(), bal+Decimal('1.20000000')) #node2 has both keys of the 2of2 ms addr., tx should affect the balance
+
+
+
+
+ # 2of3 test from different nodes
+ bal = self.nodes[2].getbalance()
+ addr1 = self.nodes[1].getnewaddress()
+ addr2 = self.nodes[2].getnewaddress()
+ addr3 = self.nodes[2].getnewaddress()
+
+ addr1Obj = self.nodes[1].validateaddress(addr1)
+ addr2Obj = self.nodes[2].validateaddress(addr2)
+ addr3Obj = self.nodes[2].validateaddress(addr3)
+
+ mSigObj = self.nodes[2].addmultisigaddress(2, [addr1Obj['pubkey'], addr2Obj['pubkey'], addr3Obj['pubkey']])
+ mSigObjValid = self.nodes[2].validateaddress(mSigObj)
+
+ txId = self.nodes[0].sendtoaddress(mSigObj, 2.2);
+ decTx = self.nodes[0].gettransaction(txId)
+ rawTx = self.nodes[0].decoderawtransaction(decTx['hex'])
+ sPK = rawTx['vout'][0]['scriptPubKey']['hex']
+ self.sync_all()
+ self.nodes[0].generate(1)
+ self.sync_all()
+
+ #THIS IS A INCOMPLETE FEATURE
+ #NODE2 HAS TWO OF THREE KEY AND THE FUNDS SHOULD BE SPENDABLE AND COUNT AT BALANCE CALCULATION
+ assert_equal(self.nodes[2].getbalance(), bal) #for now, assume the funds of a 2of3 multisig tx are not marked as spendable
+
+ txDetails = self.nodes[0].gettransaction(txId, True)
+ rawTx = self.nodes[0].decoderawtransaction(txDetails['hex'])
+ vout = False
+ for outpoint in rawTx['vout']:
+ if outpoint['value'] == Decimal('2.20000000'):
+ vout = outpoint
+ break;
+
+ bal = self.nodes[0].getbalance()
+ inputs = [{ "txid" : txId, "vout" : vout['n'], "scriptPubKey" : vout['scriptPubKey']['hex']}]
+ outputs = { self.nodes[0].getnewaddress() : 2.19 }
+ rawTx = self.nodes[2].createrawtransaction(inputs, outputs)
+ rawTxPartialSigned = self.nodes[1].signrawtransaction(rawTx, inputs)
+ assert_equal(rawTxPartialSigned['complete'], False) #node1 only has one key, can't comp. sign the tx
+
+ rawTxSigned = self.nodes[2].signrawtransaction(rawTx, inputs)
+ assert_equal(rawTxSigned['complete'], True) #node2 can sign the tx compl., own two of three keys
+ self.nodes[2].sendrawtransaction(rawTxSigned['hex'])
+ rawTx = self.nodes[0].decoderawtransaction(rawTxSigned['hex'])
+ self.sync_all()
+ self.nodes[0].generate(1)
+ self.sync_all()
+ assert_equal(self.nodes[0].getbalance(), bal+Decimal('50.00000000')+Decimal('2.19000000')) #block reward + tx
+
+if __name__ == '__main__':
+ RawTransactionsTest().main()
diff --git a/qa/rpc-tests/receivedby.py b/qa/rpc-tests/receivedby.py
index 1a681e1aae..16d6bd4cf1 100755
--- a/qa/rpc-tests/receivedby.py
+++ b/qa/rpc-tests/receivedby.py
@@ -5,9 +5,8 @@
# Exercise the listreceivedbyaddress API
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
def get_sub_array_from_array(object_array, to_match):
diff --git a/qa/rpc-tests/reindex.py b/qa/rpc-tests/reindex.py
new file mode 100755
index 0000000000..f2e3f248ea
--- /dev/null
+++ b/qa/rpc-tests/reindex.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python2
+# Copyright (c) 2014 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#
+# Test -reindex with CheckBlockIndex
+#
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+import os.path
+
+class ReindexTest(BitcoinTestFramework):
+
+ def setup_chain(self):
+ print("Initializing test directory "+self.options.tmpdir)
+ initialize_chain_clean(self.options.tmpdir, 1)
+
+ def setup_network(self):
+ self.nodes = []
+ self.is_network_split = False
+ self.nodes.append(start_node(0, self.options.tmpdir))
+
+ def run_test(self):
+ self.nodes[0].generate(3)
+ stop_node(self.nodes[0], 0)
+ wait_bitcoinds()
+ self.nodes[0]=start_node(0, self.options.tmpdir, ["-debug", "-reindex", "-checkblockindex=1"])
+ assert_equal(self.nodes[0].getblockcount(), 3)
+ print "Success"
+
+if __name__ == '__main__':
+ ReindexTest().main()
diff --git a/qa/rpc-tests/rest.py b/qa/rpc-tests/rest.py
index 9b7008531c..6c51b2fcd9 100755
--- a/qa/rpc-tests/rest.py
+++ b/qa/rpc-tests/rest.py
@@ -7,9 +7,13 @@
# Test REST interface
#
-from test_framework import BitcoinTestFramework
-from util import *
+
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+from struct import *
+import binascii
import json
+import StringIO
try:
import http.client as httplib
@@ -20,45 +24,210 @@ try:
except ImportError:
import urlparse
-def http_get_call(host, port, path, response_object = 0):
+def deser_uint256(f):
+ r = 0
+ for i in range(8):
+ t = unpack(b"<I", f.read(4))[0]
+ r += t << (i * 32)
+ return r
+
+#allows simple http get calls with a request body
+def http_get_call(host, port, path, requestdata = '', response_object = 0):
conn = httplib.HTTPConnection(host, port)
- conn.request('GET', path)
+ conn.request('GET', path, requestdata)
if response_object:
return conn.getresponse()
return conn.getresponse().read()
-
class RESTTest (BitcoinTestFramework):
FORMAT_SEPARATOR = "."
+ def setup_chain(self):
+ print("Initializing test directory "+self.options.tmpdir)
+ initialize_chain_clean(self.options.tmpdir, 3)
+
+ def setup_network(self, split=False):
+ self.nodes = start_nodes(3, self.options.tmpdir)
+ connect_nodes_bi(self.nodes,0,1)
+ connect_nodes_bi(self.nodes,1,2)
+ connect_nodes_bi(self.nodes,0,2)
+ self.is_network_split=False
+ self.sync_all()
+
def run_test(self):
url = urlparse.urlparse(self.nodes[0].url)
+ print "Mining blocks..."
+
+ self.nodes[0].generate(1)
+ self.sync_all()
+ self.nodes[2].generate(100)
+ self.sync_all()
+
+ assert_equal(self.nodes[0].getbalance(), 50)
+
+ txid = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.1)
+ self.sync_all()
+ self.nodes[2].generate(1)
+ self.sync_all()
+ bb_hash = self.nodes[0].getbestblockhash()
+
+ assert_equal(self.nodes[1].getbalance(), Decimal("0.1")) #balance now should be 0.1 on node 1
+
+ # load the latest 0.1 tx over the REST API
+ json_string = http_get_call(url.hostname, url.port, '/rest/tx/'+txid+self.FORMAT_SEPARATOR+"json")
+ json_obj = json.loads(json_string)
+ vintx = json_obj['vin'][0]['txid'] # get the vin to later check for utxo (should be spent by then)
+ # get n of 0.1 outpoint
+ n = 0
+ for vout in json_obj['vout']:
+ if vout['value'] == 0.1:
+ n = vout['n']
+
+
+ ######################################
+ # GETUTXOS: query a unspent outpoint #
+ ######################################
+ json_request = '/checkmempool/'+txid+'-'+str(n)
+ json_string = http_get_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json')
+ json_obj = json.loads(json_string)
+
+ #check chainTip response
+ assert_equal(json_obj['chaintipHash'], bb_hash)
+
+ #make sure there is one utxo
+ assert_equal(len(json_obj['utxos']), 1)
+ assert_equal(json_obj['utxos'][0]['value'], 0.1)
+
+
+ ################################################
+ # GETUTXOS: now query a already spent outpoint #
+ ################################################
+ json_request = '/checkmempool/'+vintx+'-0'
+ json_string = http_get_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json')
+ json_obj = json.loads(json_string)
+
+ #check chainTip response
+ assert_equal(json_obj['chaintipHash'], bb_hash)
+
+ #make sure there is no utox in the response because this oupoint has been spent
+ assert_equal(len(json_obj['utxos']), 0)
+
+ #check bitmap
+ assert_equal(json_obj['bitmap'], "0")
+
+
+ ##################################################
+ # GETUTXOS: now check both with the same request #
+ ##################################################
+ json_request = '/checkmempool/'+txid+'-'+str(n)+'/'+vintx+'-0'
+ json_string = http_get_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json')
+ json_obj = json.loads(json_string)
+ assert_equal(len(json_obj['utxos']), 1)
+ assert_equal(json_obj['bitmap'], "10")
+
+ #test binary response
bb_hash = self.nodes[0].getbestblockhash()
+ binaryRequest = b'\x01\x02'
+ binaryRequest += binascii.unhexlify(txid)
+ binaryRequest += pack("i", n);
+ binaryRequest += binascii.unhexlify(vintx);
+ binaryRequest += pack("i", 0);
+
+ bin_response = http_get_call(url.hostname, url.port, '/rest/getutxos'+self.FORMAT_SEPARATOR+'bin', binaryRequest)
+ output = StringIO.StringIO()
+ output.write(bin_response)
+ output.seek(0)
+ chainHeight = unpack("i", output.read(4))[0]
+ hashFromBinResponse = hex(deser_uint256(output))[2:].zfill(65).rstrip("L")
+
+ assert_equal(bb_hash, hashFromBinResponse) #check if getutxo's chaintip during calculation was fine
+ assert_equal(chainHeight, 102) #chain height must be 102
+
+
+ ############################
+ # GETUTXOS: mempool checks #
+ ############################
+
+ # do a tx and don't sync
+ txid = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 0.1)
+ json_string = http_get_call(url.hostname, url.port, '/rest/tx/'+txid+self.FORMAT_SEPARATOR+"json")
+ json_obj = json.loads(json_string)
+ vintx = json_obj['vin'][0]['txid'] # get the vin to later check for utxo (should be spent by then)
+ # get n of 0.1 outpoint
+ n = 0
+ for vout in json_obj['vout']:
+ if vout['value'] == 0.1:
+ n = vout['n']
+
+ json_request = '/'+txid+'-'+str(n)
+ json_string = http_get_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json')
+ json_obj = json.loads(json_string)
+ assert_equal(len(json_obj['utxos']), 0) #there should be a outpoint because it has just added to the mempool
+
+ json_request = '/checkmempool/'+txid+'-'+str(n)
+ json_string = http_get_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json')
+ json_obj = json.loads(json_string)
+ assert_equal(len(json_obj['utxos']), 1) #there should be a outpoint because it has just added to the mempool
+
+ #do some invalid requests
+ json_request = '{"checkmempool'
+ response = http_get_call(url.hostname, url.port, '/rest/getutxos'+self.FORMAT_SEPARATOR+'json', json_request, True)
+ assert_equal(response.status, 500) #must be a 500 because we send a invalid json request
+
+ json_request = '{"checkmempool'
+ response = http_get_call(url.hostname, url.port, '/rest/getutxos'+self.FORMAT_SEPARATOR+'bin', json_request, True)
+ assert_equal(response.status, 500) #must be a 500 because we send a invalid bin request
+
+ response = http_get_call(url.hostname, url.port, '/rest/getutxos/checkmempool'+self.FORMAT_SEPARATOR+'bin', '', True)
+ assert_equal(response.status, 500) #must be a 500 because we send a invalid bin request
+
+ #test limits
+ json_request = '/checkmempool/'
+ for x in range(0, 20):
+ json_request += txid+'-'+str(n)+'/'
+ json_request = json_request.rstrip("/")
+ response = http_get_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json', '', True)
+ assert_equal(response.status, 500) #must be a 500 because we exceeding the limits
+
+ json_request = '/checkmempool/'
+ for x in range(0, 15):
+ json_request += txid+'-'+str(n)+'/'
+ json_request = json_request.rstrip("/");
+ response = http_get_call(url.hostname, url.port, '/rest/getutxos'+json_request+self.FORMAT_SEPARATOR+'json', '', True)
+ assert_equal(response.status, 200) #must be a 500 because we exceeding the limits
+
+ self.nodes[0].generate(1) #generate block to not affect upcomming tests
+ self.sync_all()
+
+ ################
+ # /rest/block/ #
+ ################
+
# check binary format
- response = http_get_call(url.hostname, url.port, '/rest/block/'+bb_hash+self.FORMAT_SEPARATOR+"bin", True)
+ response = http_get_call(url.hostname, url.port, '/rest/block/'+bb_hash+self.FORMAT_SEPARATOR+"bin", "", True)
assert_equal(response.status, 200)
assert_greater_than(int(response.getheader('content-length')), 80)
response_str = response.read()
# compare with block header
- response_header = http_get_call(url.hostname, url.port, '/rest/headers/1/'+bb_hash+self.FORMAT_SEPARATOR+"bin", True)
+ response_header = http_get_call(url.hostname, url.port, '/rest/headers/1/'+bb_hash+self.FORMAT_SEPARATOR+"bin", "", True)
assert_equal(response_header.status, 200)
assert_equal(int(response_header.getheader('content-length')), 80)
response_header_str = response_header.read()
assert_equal(response_str[0:80], response_header_str)
# check block hex format
- response_hex = http_get_call(url.hostname, url.port, '/rest/block/'+bb_hash+self.FORMAT_SEPARATOR+"hex", True)
+ response_hex = http_get_call(url.hostname, url.port, '/rest/block/'+bb_hash+self.FORMAT_SEPARATOR+"hex", "", True)
assert_equal(response_hex.status, 200)
assert_greater_than(int(response_hex.getheader('content-length')), 160)
response_hex_str = response_hex.read()
assert_equal(response_str.encode("hex")[0:160], response_hex_str[0:160])
# compare with hex block header
- response_header_hex = http_get_call(url.hostname, url.port, '/rest/headers/1/'+bb_hash+self.FORMAT_SEPARATOR+"hex", True)
+ response_header_hex = http_get_call(url.hostname, url.port, '/rest/headers/1/'+bb_hash+self.FORMAT_SEPARATOR+"hex", "", True)
assert_equal(response_header_hex.status, 200)
assert_greater_than(int(response_header_hex.getheader('content-length')), 160)
response_header_hex_str = response_header_hex.read()
@@ -77,10 +246,12 @@ class RESTTest (BitcoinTestFramework):
assert_equal(json_obj['txid'], tx_hash)
# check hex format response
- hex_string = http_get_call(url.hostname, url.port, '/rest/tx/'+tx_hash+self.FORMAT_SEPARATOR+"hex", True)
+ hex_string = http_get_call(url.hostname, url.port, '/rest/tx/'+tx_hash+self.FORMAT_SEPARATOR+"hex", "", True)
assert_equal(hex_string.status, 200)
assert_greater_than(int(response.getheader('content-length')), 10)
+
+
# check block tx details
# let's make 3 tx and mine them on node 1
txs = []
@@ -108,7 +279,7 @@ class RESTTest (BitcoinTestFramework):
#test rest bestblock
bb_hash = self.nodes[0].getbestblockhash()
-
+
json_string = http_get_call(url.hostname, url.port, '/rest/chaininfo.json')
json_obj = json.loads(json_string)
assert_equal(json_obj['bestblockhash'], bb_hash)
diff --git a/qa/rpc-tests/rpcbind_test.py b/qa/rpc-tests/rpcbind_test.py
index 655e00b6e7..04110c2831 100755
--- a/qa/rpc-tests/rpcbind_test.py
+++ b/qa/rpc-tests/rpcbind_test.py
@@ -8,7 +8,6 @@
# Add python-bitcoinrpc to module search path:
import os
import sys
-sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "python-bitcoinrpc"))
import json
import shutil
@@ -16,9 +15,8 @@ import subprocess
import tempfile
import traceback
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
-from netutil import *
+from test_framework.util import *
+from test_framework.netutil import *
def run_bind_test(tmpdir, allow_ips, connect_to, addresses, expected):
'''
diff --git a/qa/rpc-tests/script_test.py b/qa/rpc-tests/script_test.py
new file mode 100755
index 0000000000..860fa56b64
--- /dev/null
+++ b/qa/rpc-tests/script_test.py
@@ -0,0 +1,253 @@
+#!/usr/bin/env python2
+#
+# Distributed under the MIT/X11 software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#
+
+'''
+Test notes:
+This test uses the script_valid and script_invalid tests from the unittest
+framework to do end-to-end testing where we compare that two nodes agree on
+whether blocks containing a given test script are valid.
+
+We generally ignore the script flags associated with each test (since we lack
+the precision to test each script using those flags in this framework), but
+for tests with SCRIPT_VERIFY_P2SH, we can use a block time after the BIP16
+switchover date to try to test with that flag enabled (and for tests without
+that flag, we use a block time before the switchover date).
+
+NOTE: This test is very slow and may take more than 40 minutes to run.
+'''
+
+from test_framework.test_framework import ComparisonTestFramework
+from test_framework.util import *
+from test_framework.comptool import TestInstance, TestManager
+from test_framework.mininode import *
+from test_framework.blocktools import *
+from test_framework.script import *
+import logging
+import copy
+import json
+
+script_valid_file = "../../src/test/data/script_valid.json"
+script_invalid_file = "../../src/test/data/script_invalid.json"
+
+# Pass in a set of json files to open.
+class ScriptTestFile(object):
+
+ def __init__(self, files):
+ self.files = files
+ self.index = -1
+ self.data = []
+
+ def load_files(self):
+ for f in self.files:
+ self.data.extend(json.loads(open(os.path.dirname(os.path.abspath(__file__))+"/"+f).read()))
+
+ # Skip over records that are not long enough to be tests
+ def get_records(self):
+ while (self.index < len(self.data)):
+ if len(self.data[self.index]) >= 3:
+ yield self.data[self.index]
+ self.index += 1
+
+
+# Helper for parsing the flags specified in the .json files
+SCRIPT_VERIFY_NONE = 0
+SCRIPT_VERIFY_P2SH = 1
+SCRIPT_VERIFY_STRICTENC = 1 << 1
+SCRIPT_VERIFY_DERSIG = 1 << 2
+SCRIPT_VERIFY_LOW_S = 1 << 3
+SCRIPT_VERIFY_NULLDUMMY = 1 << 4
+SCRIPT_VERIFY_SIGPUSHONLY = 1 << 5
+SCRIPT_VERIFY_MINIMALDATA = 1 << 6
+SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS = 1 << 7
+SCRIPT_VERIFY_CLEANSTACK = 1 << 8
+
+flag_map = {
+ "": SCRIPT_VERIFY_NONE,
+ "NONE": SCRIPT_VERIFY_NONE,
+ "P2SH": SCRIPT_VERIFY_P2SH,
+ "STRICTENC": SCRIPT_VERIFY_STRICTENC,
+ "DERSIG": SCRIPT_VERIFY_DERSIG,
+ "LOW_S": SCRIPT_VERIFY_LOW_S,
+ "NULLDUMMY": SCRIPT_VERIFY_NULLDUMMY,
+ "SIGPUSHONLY": SCRIPT_VERIFY_SIGPUSHONLY,
+ "MINIMALDATA": SCRIPT_VERIFY_MINIMALDATA,
+ "DISCOURAGE_UPGRADABLE_NOPS": SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS,
+ "CLEANSTACK": SCRIPT_VERIFY_CLEANSTACK,
+}
+
+def ParseScriptFlags(flag_string):
+ flags = 0
+ for x in flag_string.split(","):
+ if x in flag_map:
+ flags |= flag_map[x]
+ else:
+ print "Error: unrecognized script flag: ", x
+ return flags
+
+'''
+Given a string that is a scriptsig or scriptpubkey from the .json files above,
+convert it to a CScript()
+'''
+# Replicates behavior from core_read.cpp
+def ParseScript(json_script):
+ script = json_script.split(" ")
+ parsed_script = CScript()
+ for x in script:
+ if len(x) == 0:
+ # Empty string, ignore.
+ pass
+ elif x.isdigit() or (len(x) >= 1 and x[0] == "-" and x[1:].isdigit()):
+ # Number
+ n = int(x, 0)
+ if (n == -1) or (n >= 1 and n <= 16):
+ parsed_script = CScript(bytes(parsed_script) + bytes(CScript([n])))
+ else:
+ parsed_script += CScriptNum(int(x, 0))
+ elif x.startswith("0x"):
+ # Raw hex data, inserted NOT pushed onto stack:
+ for i in xrange(2, len(x), 2):
+ parsed_script = CScript(bytes(parsed_script) + bytes(chr(int(x[i:i+2],16))))
+ elif x.startswith("'") and x.endswith("'") and len(x) >= 2:
+ # Single-quoted string, pushed as data.
+ parsed_script += CScript([x[1:-1]])
+ else:
+ # opcode, e.g. OP_ADD or ADD:
+ tryopname = "OP_" + x
+ if tryopname in OPCODES_BY_NAME:
+ parsed_script += CScriptOp(OPCODES_BY_NAME["OP_" + x])
+ else:
+ print "ParseScript: error parsing '%s'" % x
+ return ""
+ return parsed_script
+
+class TestBuilder(object):
+ def create_credit_tx(self, scriptPubKey):
+ # self.tx1 is a coinbase transaction, modeled after the one created by script_tests.cpp
+ # This allows us to reuse signatures created in the unit test framework.
+ self.tx1 = create_coinbase() # this has a bip34 scriptsig,
+ self.tx1.vin[0].scriptSig = CScript([0, 0]) # but this matches the unit tests
+ self.tx1.vout[0].nValue = 0
+ self.tx1.vout[0].scriptPubKey = scriptPubKey
+ self.tx1.rehash()
+ def create_spend_tx(self, scriptSig):
+ self.tx2 = create_transaction(self.tx1, 0, CScript(), 0)
+ self.tx2.vin[0].scriptSig = scriptSig
+ self.tx2.vout[0].scriptPubKey = CScript()
+ self.tx2.rehash()
+ def rehash(self):
+ self.tx1.rehash()
+ self.tx2.rehash()
+
+# This test uses the (default) two nodes provided by ComparisonTestFramework,
+# specified on the command line with --testbinary and --refbinary.
+# See comptool.py
+class ScriptTest(ComparisonTestFramework):
+
+ def run_test(self):
+ # Set up the comparison tool TestManager
+ test = TestManager(self, self.options.tmpdir)
+ test.add_all_connections(self.nodes)
+
+ # Load scripts
+ self.scripts = ScriptTestFile([script_valid_file, script_invalid_file])
+ self.scripts.load_files()
+
+ # Some variables we re-use between test instances (to build blocks)
+ self.tip = None
+ self.block_time = None
+
+ NetworkThread().start() # Start up network handling in another thread
+ test.run()
+
+ def generate_test_instance(self, pubkeystring, scriptsigstring):
+ scriptpubkey = ParseScript(pubkeystring)
+ scriptsig = ParseScript(scriptsigstring)
+
+ test = TestInstance(sync_every_block=False)
+ test_build = TestBuilder()
+ test_build.create_credit_tx(scriptpubkey)
+ test_build.create_spend_tx(scriptsig)
+ test_build.rehash()
+
+ block = create_block(self.tip, test_build.tx1, self.block_time)
+ self.block_time += 1
+ block.solve()
+ self.tip = block.sha256
+ test.blocks_and_transactions = [[block, True]]
+
+ for i in xrange(100):
+ block = create_block(self.tip, create_coinbase(), self.block_time)
+ self.block_time += 1
+ block.solve()
+ self.tip = block.sha256
+ test.blocks_and_transactions.append([block, True])
+
+ block = create_block(self.tip, create_coinbase(), self.block_time)
+ self.block_time += 1
+ block.vtx.append(test_build.tx2)
+ block.hashMerkleRoot = block.calc_merkle_root()
+ block.rehash()
+ block.solve()
+ test.blocks_and_transactions.append([block, None])
+ return test
+
+ # This generates the tests for TestManager.
+ def get_tests(self):
+ self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0)
+ self.block_time = 1333230000 # before the BIP16 switchover
+
+ '''
+ Create a new block with an anyone-can-spend coinbase
+ '''
+ block = create_block(self.tip, create_coinbase(), self.block_time)
+ self.block_time += 1
+ block.solve()
+ self.tip = block.sha256
+ yield TestInstance(objects=[[block, True]])
+
+ '''
+ Build out to 100 blocks total, maturing the coinbase.
+ '''
+ test = TestInstance(objects=[], sync_every_block=False, sync_every_tx=False)
+ for i in xrange(100):
+ b = create_block(self.tip, create_coinbase(), self.block_time)
+ b.solve()
+ test.blocks_and_transactions.append([b, True])
+ self.tip = b.sha256
+ self.block_time += 1
+ yield test
+
+ ''' Iterate through script tests. '''
+ counter = 0
+ for script_test in self.scripts.get_records():
+ ''' Reset the blockchain to genesis block + 100 blocks. '''
+ if self.nodes[0].getblockcount() > 101:
+ self.nodes[0].invalidateblock(self.nodes[0].getblockhash(102))
+ self.nodes[1].invalidateblock(self.nodes[1].getblockhash(102))
+
+ self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0)
+
+ [scriptsig, scriptpubkey, flags] = script_test[0:3]
+ flags = ParseScriptFlags(flags)
+
+ # We can use block time to determine whether the nodes should be
+ # enforcing BIP16.
+ #
+ # We intentionally let the block time grow by 1 each time.
+ # This forces the block hashes to differ between tests, so that
+ # a call to invalidateblock doesn't interfere with a later test.
+ if (flags & SCRIPT_VERIFY_P2SH):
+ self.block_time = 1333238400 + counter # Advance to enforcing BIP16
+ else:
+ self.block_time = 1333230000 + counter # Before the BIP16 switchover
+
+ print "Script test: [%s]" % script_test
+
+ yield self.generate_test_instance(scriptpubkey, scriptsig)
+ counter += 1
+
+if __name__ == '__main__':
+ ScriptTest().main()
diff --git a/qa/rpc-tests/signrawtransactions.py b/qa/rpc-tests/signrawtransactions.py
new file mode 100755
index 0000000000..d51d6ee610
--- /dev/null
+++ b/qa/rpc-tests/signrawtransactions.py
@@ -0,0 +1,109 @@
+#!/usr/bin/env python2
+# Copyright (c) 2015 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+
+
+class SignRawTransactionsTest(BitcoinTestFramework):
+ """Tests transaction signing via RPC command "signrawtransaction"."""
+
+ def setup_chain(self):
+ print('Initializing test directory ' + self.options.tmpdir)
+ initialize_chain_clean(self.options.tmpdir, 1)
+
+ def setup_network(self, split=False):
+ self.nodes = start_nodes(1, self.options.tmpdir)
+ self.is_network_split = False
+
+ def successful_signing_test(self):
+ """Creates and signs a valid raw transaction with one input.
+
+ Expected results:
+
+ 1) The transaction has a complete set of signatures
+ 2) No script verification error occurred"""
+ privKeys = ['cUeKHd5orzT3mz8P9pxyREHfsWtVfgsfDjiZZBcjUBAaGk1BTj7N']
+
+ inputs = [
+ # Valid pay-to-pubkey script
+ {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0,
+ 'scriptPubKey': '76a91460baa0f494b38ce3c940dea67f3804dc52d1fb9488ac'}
+ ]
+
+ outputs = {'mpLQjfK79b7CCV4VMJWEWAj5Mpx8Up5zxB': 0.1}
+
+ rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
+ rawTxSigned = self.nodes[0].signrawtransaction(rawTx, inputs, privKeys)
+
+ # 1) The transaction has a complete set of signatures
+ assert 'complete' in rawTxSigned
+ assert_equal(rawTxSigned['complete'], True)
+
+ # 2) No script verification error occurred
+ assert 'errors' not in rawTxSigned
+
+ def script_verification_error_test(self):
+ """Creates and signs a raw transaction with valid (vin 0), invalid (vin 1) and one missing (vin 2) input script.
+
+ Expected results:
+
+ 3) The transaction has no complete set of signatures
+ 4) Two script verification errors occurred
+ 5) Script verification errors have certain properties ("txid", "vout", "scriptSig", "sequence", "error")
+ 6) The verification errors refer to the invalid (vin 1) and missing input (vin 2)"""
+ privKeys = ['cUeKHd5orzT3mz8P9pxyREHfsWtVfgsfDjiZZBcjUBAaGk1BTj7N']
+
+ inputs = [
+ # Valid pay-to-pubkey script
+ {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0},
+ # Invalid script
+ {'txid': '5b8673686910442c644b1f4993d8f7753c7c8fcb5c87ee40d56eaeef25204547', 'vout': 7},
+ # Missing scriptPubKey
+ {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 1},
+ ]
+
+ scripts = [
+ # Valid pay-to-pubkey script
+ {'txid': '9b907ef1e3c26fc71fe4a4b3580bc75264112f95050014157059c736f0202e71', 'vout': 0,
+ 'scriptPubKey': '76a91460baa0f494b38ce3c940dea67f3804dc52d1fb9488ac'},
+ # Invalid script
+ {'txid': '5b8673686910442c644b1f4993d8f7753c7c8fcb5c87ee40d56eaeef25204547', 'vout': 7,
+ 'scriptPubKey': 'badbadbadbad'}
+ ]
+
+ outputs = {'mpLQjfK79b7CCV4VMJWEWAj5Mpx8Up5zxB': 0.1}
+
+ rawTx = self.nodes[0].createrawtransaction(inputs, outputs)
+ rawTxSigned = self.nodes[0].signrawtransaction(rawTx, scripts, privKeys)
+
+ # 3) The transaction has no complete set of signatures
+ assert 'complete' in rawTxSigned
+ assert_equal(rawTxSigned['complete'], False)
+
+ # 4) Two script verification errors occurred
+ assert 'errors' in rawTxSigned
+ assert_equal(len(rawTxSigned['errors']), 2)
+
+ # 5) Script verification errors have certain properties
+ assert 'txid' in rawTxSigned['errors'][0]
+ assert 'vout' in rawTxSigned['errors'][0]
+ assert 'scriptSig' in rawTxSigned['errors'][0]
+ assert 'sequence' in rawTxSigned['errors'][0]
+ assert 'error' in rawTxSigned['errors'][0]
+
+ # 6) The verification errors refer to the invalid (vin 1) and missing input (vin 2)
+ assert_equal(rawTxSigned['errors'][0]['txid'], inputs[1]['txid'])
+ assert_equal(rawTxSigned['errors'][0]['vout'], inputs[1]['vout'])
+ assert_equal(rawTxSigned['errors'][1]['txid'], inputs[2]['txid'])
+ assert_equal(rawTxSigned['errors'][1]['vout'], inputs[2]['vout'])
+
+ def run_test(self):
+ self.successful_signing_test()
+ self.script_verification_error_test()
+
+
+if __name__ == '__main__':
+ SignRawTransactionsTest().main()
diff --git a/qa/rpc-tests/smartfees.py b/qa/rpc-tests/smartfees.py
index 4eb8bb4842..c15c5fda09 100755
--- a/qa/rpc-tests/smartfees.py
+++ b/qa/rpc-tests/smartfees.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python2
-# Copyright (c) 2014 The Bitcoin Core developers
+# Copyright (c) 2014-2015 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,86 +7,252 @@
# Test fee estimation code
#
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
+
+# Construct 2 trivial P2SH's and the ScriptSigs that spend them
+# So we can create many many transactions without needing to spend
+# time signing.
+P2SH_1 = "2MySexEGVzZpRgNQ1JdjdP5bRETznm3roQ2" # P2SH of "OP_1 OP_DROP"
+P2SH_2 = "2NBdpwq8Aoo1EEKEXPNrKvr5xQr3M9UfcZA" # P2SH of "OP_2 OP_DROP"
+# Associated ScriptSig's to spend satisfy P2SH_1 and P2SH_2
+# 4 bytes of OP_TRUE and push 2-byte redeem script of "OP_1 OP_DROP" or "OP_2 OP_DROP"
+SCRIPT_SIG = ["0451025175", "0451025275"]
+
+def satoshi_round(amount):
+ return Decimal(amount).quantize(Decimal('0.00000001'), rounding=ROUND_DOWN)
+
+def small_txpuzzle_randfee(from_node, conflist, unconflist, amount, min_fee, fee_increment):
+ '''
+ Create and send a transaction with a random fee.
+ The transaction pays to a trival P2SH script, and assumes that its inputs
+ are of the same form.
+ The function takes a list of confirmed outputs and unconfirmed outputs
+ and attempts to use the confirmed list first for its inputs.
+ It adds the newly created outputs to the unconfirmed list.
+ Returns (raw transaction, fee)
+ '''
+ # It's best to exponentially distribute our random fees
+ # because the buckets are exponentially spaced.
+ # Exponentially distributed from 1-128 * fee_increment
+ rand_fee = float(fee_increment)*(1.1892**random.randint(0,28))
+ # Total fee ranges from min_fee to min_fee + 127*fee_increment
+ fee = min_fee - fee_increment + satoshi_round(rand_fee)
+ inputs = []
+ total_in = Decimal("0.00000000")
+ while total_in <= (amount + fee) and len(conflist) > 0:
+ t = conflist.pop(0)
+ total_in += t["amount"]
+ inputs.append({ "txid" : t["txid"], "vout" : t["vout"]} )
+ if total_in <= amount + fee:
+ while total_in <= (amount + fee) and len(unconflist) > 0:
+ t = unconflist.pop(0)
+ total_in += t["amount"]
+ inputs.append({ "txid" : t["txid"], "vout" : t["vout"]} )
+ if total_in <= amount + fee:
+ raise RuntimeError("Insufficient funds: need %d, have %d"%(amount+fee, total_in))
+ outputs = {}
+ outputs[P2SH_1] = total_in - amount - fee
+ outputs[P2SH_2] = amount
+ rawtx = from_node.createrawtransaction(inputs, outputs)
+ # Createrawtransaction constructions a transaction that is ready to be signed
+ # These transactions don't need to be signed, but we still have to insert the ScriptSig
+ # that will satisfy the ScriptPubKey.
+ completetx = rawtx[0:10]
+ inputnum = 0
+ for inp in inputs:
+ completetx += rawtx[10+82*inputnum:82+82*inputnum]
+ completetx += SCRIPT_SIG[inp["vout"]]
+ completetx += rawtx[84+82*inputnum:92+82*inputnum]
+ inputnum += 1
+ completetx += rawtx[10+82*inputnum:]
+ txid = from_node.sendrawtransaction(completetx, True)
+ unconflist.append({ "txid" : txid, "vout" : 0 , "amount" : total_in - amount - fee})
+ unconflist.append({ "txid" : txid, "vout" : 1 , "amount" : amount})
+
+ return (completetx, fee)
+
+def split_inputs(from_node, txins, txouts, initial_split = False):
+ '''
+ We need to generate a lot of very small inputs so we can generate a ton of transactions
+ and they will have low priority.
+ This function takes an input from txins, and creates and sends a transaction
+ which splits the value into 2 outputs which are appended to txouts.
+ '''
+ prevtxout = txins.pop()
+ inputs = []
+ outputs = {}
+ inputs.append({ "txid" : prevtxout["txid"], "vout" : prevtxout["vout"] })
+ half_change = satoshi_round(prevtxout["amount"]/2)
+ rem_change = prevtxout["amount"] - half_change - Decimal("0.00001000")
+ outputs[P2SH_1] = half_change
+ outputs[P2SH_2] = rem_change
+ rawtx = from_node.createrawtransaction(inputs, outputs)
+ # If this is the initial split we actually need to sign the transaction
+ # Otherwise we just need to insert the property ScriptSig
+ if (initial_split) :
+ completetx = from_node.signrawtransaction(rawtx)["hex"]
+ else :
+ completetx = rawtx[0:82] + SCRIPT_SIG[prevtxout["vout"]] + rawtx[84:]
+ txid = from_node.sendrawtransaction(completetx, True)
+ txouts.append({ "txid" : txid, "vout" : 0 , "amount" : half_change})
+ txouts.append({ "txid" : txid, "vout" : 1 , "amount" : rem_change})
+
+def check_estimates(node, fees_seen, max_invalid, print_estimates = True):
+ '''
+ This function calls estimatefee and verifies that the estimates
+ meet certain invariants.
+ '''
+ all_estimates = [ node.estimatefee(i) for i in range(1,26) ]
+ if print_estimates:
+ print([str(all_estimates[e-1]) for e in [1,2,3,6,15,25]])
+ delta = 1.0e-6 # account for rounding error
+ last_e = max(fees_seen)
+ for e in filter(lambda x: x >= 0, all_estimates):
+ # Estimates should be within the bounds of what transactions fees actually were:
+ if float(e)+delta < min(fees_seen) or float(e)-delta > max(fees_seen):
+ raise AssertionError("Estimated fee (%f) out of range (%f,%f)"
+ %(float(e), min(fees_seen), max(fees_seen)))
+ # Estimates should be monotonically decreasing
+ if float(e)-delta > last_e:
+ raise AssertionError("Estimated fee (%f) larger than last fee (%f) for lower number of confirms"
+ %(float(e),float(last_e)))
+ last_e = e
+ valid_estimate = False
+ invalid_estimates = 0
+ for e in all_estimates:
+ if e >= 0:
+ valid_estimate = True
+ else:
+ invalid_estimates += 1
+ # Once we're at a high enough confirmation count that we can give an estimate
+ # We should have estimates for all higher confirmation counts
+ if valid_estimate and e < 0:
+ raise AssertionError("Invalid estimate appears at higher confirm count than valid estimate")
+ # Check on the expected number of different confirmation counts
+ # that we might not have valid estimates for
+ if invalid_estimates > max_invalid:
+ raise AssertionError("More than (%d) invalid estimates"%(max_invalid))
+ return all_estimates
+
class EstimateFeeTest(BitcoinTestFramework):
def setup_network(self):
+ '''
+ We'll setup the network to have 3 nodes that all mine with different parameters.
+ But first we need to use one node to create a lot of small low priority outputs
+ which we will use to generate our transactions.
+ '''
self.nodes = []
- self.nodes.append(start_node(0, self.options.tmpdir,
- ["-debug=mempool", "-debug=estimatefee", "-relaypriority=0"]))
- # Node1 mines small-but-not-tiny blocks, and allows free transactions.
+ # Use node0 to mine blocks for input splitting
+ self.nodes.append(start_node(0, self.options.tmpdir, ["-maxorphantx=1000",
+ "-relaypriority=0", "-whitelist=127.0.0.1"]))
+
+ print("This test is time consuming, please be patient")
+ print("Splitting inputs to small size so we can generate low priority tx's")
+ self.txouts = []
+ self.txouts2 = []
+ # Split a coinbase into two transaction puzzle outputs
+ split_inputs(self.nodes[0], self.nodes[0].listunspent(0), self.txouts, True)
+
+ # Mine
+ while (len(self.nodes[0].getrawmempool()) > 0):
+ self.nodes[0].generate(1)
+
+ # Repeatedly split those 2 outputs, doubling twice for each rep
+ # Use txouts to monitor the available utxo, since these won't be tracked in wallet
+ reps = 0
+ while (reps < 5):
+ #Double txouts to txouts2
+ while (len(self.txouts)>0):
+ split_inputs(self.nodes[0], self.txouts, self.txouts2)
+ while (len(self.nodes[0].getrawmempool()) > 0):
+ self.nodes[0].generate(1)
+ #Double txouts2 to txouts
+ while (len(self.txouts2)>0):
+ split_inputs(self.nodes[0], self.txouts2, self.txouts)
+ while (len(self.nodes[0].getrawmempool()) > 0):
+ self.nodes[0].generate(1)
+ reps += 1
+ print("Finished splitting")
+
+ # Now we can connect the other nodes, didn't want to connect them earlier
+ # so the estimates would not be affected by the splitting transactions
+ # Node1 mines small blocks but that are bigger than the expected transaction rate,
+ # and allows free transactions.
# NOTE: the CreateNewBlock code starts counting block size at 1,000 bytes,
- # so blockmaxsize of 2,000 is really just 1,000 bytes (room enough for
- # 6 or 7 transactions)
+ # (17k is room enough for 110 or so transactions)
self.nodes.append(start_node(1, self.options.tmpdir,
- ["-blockprioritysize=1500", "-blockmaxsize=2000",
- "-debug=mempool", "-debug=estimatefee", "-relaypriority=0"]))
+ ["-blockprioritysize=1500", "-blockmaxsize=18000",
+ "-maxorphantx=1000", "-relaypriority=0", "-debug=estimatefee"]))
connect_nodes(self.nodes[1], 0)
# Node2 is a stingy miner, that
- # produces very small blocks (room for only 3 or so transactions)
- node2args = [ "-blockprioritysize=0", "-blockmaxsize=1500",
- "-debug=mempool", "-debug=estimatefee", "-relaypriority=0"]
+ # produces too small blocks (room for only 70 or so transactions)
+ node2args = ["-blockprioritysize=0", "-blockmaxsize=12000", "-maxorphantx=1000", "-relaypriority=0"]
+
self.nodes.append(start_node(2, self.options.tmpdir, node2args))
- connect_nodes(self.nodes[2], 0)
+ connect_nodes(self.nodes[0], 2)
+ connect_nodes(self.nodes[2], 1)
self.is_network_split = False
self.sync_all()
-
+
+ def transact_and_mine(self, numblocks, mining_node):
+ min_fee = Decimal("0.00001")
+ # We will now mine numblocks blocks generating on average 100 transactions between each block
+ # We shuffle our confirmed txout set before each set of transactions
+ # small_txpuzzle_randfee will use the transactions that have inputs already in the chain when possible
+ # resorting to tx's that depend on the mempool when those run out
+ for i in range(numblocks):
+ random.shuffle(self.confutxo)
+ for j in range(random.randrange(100-50,100+50)):
+ from_index = random.randint(1,2)
+ (txhex, fee) = small_txpuzzle_randfee(self.nodes[from_index], self.confutxo,
+ self.memutxo, Decimal("0.005"), min_fee, min_fee)
+ tx_kbytes = (len(txhex)/2)/1000.0
+ self.fees_per_kb.append(float(fee)/tx_kbytes)
+ sync_mempools(self.nodes[0:3],.1)
+ mined = mining_node.getblock(mining_node.generate(1)[0],True)["tx"]
+ sync_blocks(self.nodes[0:3],.1)
+ #update which txouts are confirmed
+ newmem = []
+ for utx in self.memutxo:
+ if utx["txid"] in mined:
+ self.confutxo.append(utx)
+ else:
+ newmem.append(utx)
+ self.memutxo = newmem
def run_test(self):
- # Prime the memory pool with pairs of transactions
- # (high-priority, random fee and zero-priority, random fee)
- min_fee = Decimal("0.001")
- fees_per_kb = [];
- for i in range(12):
- (txid, txhex, fee) = random_zeropri_transaction(self.nodes, Decimal("1.1"),
- min_fee, min_fee, 20)
- tx_kbytes = (len(txhex)/2)/1000.0
- fees_per_kb.append(float(fee)/tx_kbytes)
-
- # Mine blocks with node2 until the memory pool clears:
- count_start = self.nodes[2].getblockcount()
- while len(self.nodes[2].getrawmempool()) > 0:
- self.nodes[2].generate(1)
- self.sync_all()
-
- all_estimates = [ self.nodes[0].estimatefee(i) for i in range(1,20) ]
- print("Fee estimates, super-stingy miner: "+str([str(e) for e in all_estimates]))
+ self.fees_per_kb = []
+ self.memutxo = []
+ self.confutxo = self.txouts # Start with the set of confirmed txouts after splitting
+ print("Checking estimates for 1/2/3/6/15/25 blocks")
+ print("Creating transactions and mining them with a huge block size")
+ # Create transactions and mine 20 big blocks with node 0 such that the mempool is always emptied
+ self.transact_and_mine(30, self.nodes[0])
+ check_estimates(self.nodes[1], self.fees_per_kb, 1)
- # Estimates should be within the bounds of what transactions fees actually were:
- delta = 1.0e-6 # account for rounding error
- for e in filter(lambda x: x >= 0, all_estimates):
- if float(e)+delta < min(fees_per_kb) or float(e)-delta > max(fees_per_kb):
- raise AssertionError("Estimated fee (%f) out of range (%f,%f)"%(float(e), min_fee_kb, max_fee_kb))
-
- # Generate transactions while mining 30 more blocks, this time with node1:
- for i in range(30):
- for j in range(random.randrange(6-4,6+4)):
- (txid, txhex, fee) = random_transaction(self.nodes, Decimal("1.1"),
- Decimal("0.0"), min_fee, 20)
- tx_kbytes = (len(txhex)/2)/1000.0
- fees_per_kb.append(float(fee)/tx_kbytes)
- self.nodes[1].generate(1)
- self.sync_all()
+ print("Creating transactions and mining them with a block size that can't keep up")
+ # Create transactions and mine 30 small blocks with node 2, but create txs faster than we can mine
+ self.transact_and_mine(20, self.nodes[2])
+ check_estimates(self.nodes[1], self.fees_per_kb, 3)
- all_estimates = [ self.nodes[0].estimatefee(i) for i in range(1,20) ]
- print("Fee estimates, more generous miner: "+str([ str(e) for e in all_estimates]))
- for e in filter(lambda x: x >= 0, all_estimates):
- if float(e)+delta < min(fees_per_kb) or float(e)-delta > max(fees_per_kb):
- raise AssertionError("Estimated fee (%f) out of range (%f,%f)"%(float(e), min_fee_kb, max_fee_kb))
+ print("Creating transactions and mining them at a block size that is just big enough")
+ # Generate transactions while mining 40 more blocks, this time with node1
+ # which mines blocks with capacity just above the rate that transactions are being created
+ self.transact_and_mine(40, self.nodes[1])
+ check_estimates(self.nodes[1], self.fees_per_kb, 2)
# Finish by mining a normal-sized block:
- while len(self.nodes[0].getrawmempool()) > 0:
- self.nodes[0].generate(1)
- self.sync_all()
-
- final_estimates = [ self.nodes[0].estimatefee(i) for i in range(1,20) ]
- print("Final fee estimates: "+str([ str(e) for e in final_estimates]))
+ while len(self.nodes[1].getrawmempool()) > 0:
+ self.nodes[1].generate(1)
+ sync_blocks(self.nodes[0:3],.1)
+ print("Final estimates after emptying mempools")
+ check_estimates(self.nodes[1], self.fees_per_kb, 2)
if __name__ == '__main__':
EstimateFeeTest().main()
diff --git a/qa/rpc-tests/python-bitcoinrpc/bitcoinrpc/__init__.py b/qa/rpc-tests/test_framework/__init__.py
index e69de29bb2..e69de29bb2 100644
--- a/qa/rpc-tests/python-bitcoinrpc/bitcoinrpc/__init__.py
+++ b/qa/rpc-tests/test_framework/__init__.py
diff --git a/qa/rpc-tests/python-bitcoinrpc/bitcoinrpc/authproxy.py b/qa/rpc-tests/test_framework/authproxy.py
index bc7d655fdf..bc7d655fdf 100644
--- a/qa/rpc-tests/python-bitcoinrpc/bitcoinrpc/authproxy.py
+++ b/qa/rpc-tests/test_framework/authproxy.py
diff --git a/qa/rpc-tests/test_framework/bignum.py b/qa/rpc-tests/test_framework/bignum.py
new file mode 100644
index 0000000000..b0c58ccd47
--- /dev/null
+++ b/qa/rpc-tests/test_framework/bignum.py
@@ -0,0 +1,102 @@
+#
+#
+# bignum.py
+#
+# This file is copied from python-bitcoinlib.
+#
+# Distributed under the MIT/X11 software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#
+
+"""Bignum routines"""
+
+from __future__ import absolute_import, division, print_function, unicode_literals
+
+import struct
+
+
+# generic big endian MPI format
+
+def bn_bytes(v, have_ext=False):
+ ext = 0
+ if have_ext:
+ ext = 1
+ return ((v.bit_length()+7)//8) + ext
+
+def bn2bin(v):
+ s = bytearray()
+ i = bn_bytes(v)
+ while i > 0:
+ s.append((v >> ((i-1) * 8)) & 0xff)
+ i -= 1
+ return s
+
+def bin2bn(s):
+ l = 0
+ for ch in s:
+ l = (l << 8) | ch
+ return l
+
+def bn2mpi(v):
+ have_ext = False
+ if v.bit_length() > 0:
+ have_ext = (v.bit_length() & 0x07) == 0
+
+ neg = False
+ if v < 0:
+ neg = True
+ v = -v
+
+ s = struct.pack(b">I", bn_bytes(v, have_ext))
+ ext = bytearray()
+ if have_ext:
+ ext.append(0)
+ v_bin = bn2bin(v)
+ if neg:
+ if have_ext:
+ ext[0] |= 0x80
+ else:
+ v_bin[0] |= 0x80
+ return s + ext + v_bin
+
+def mpi2bn(s):
+ if len(s) < 4:
+ return None
+ s_size = bytes(s[:4])
+ v_len = struct.unpack(b">I", s_size)[0]
+ if len(s) != (v_len + 4):
+ return None
+ if v_len == 0:
+ return 0
+
+ v_str = bytearray(s[4:])
+ neg = False
+ i = v_str[0]
+ if i & 0x80:
+ neg = True
+ i &= ~0x80
+ v_str[0] = i
+
+ v = bin2bn(v_str)
+
+ if neg:
+ return -v
+ return v
+
+# bitcoin-specific little endian format, with implicit size
+def mpi2vch(s):
+ r = s[4:] # strip size
+ r = r[::-1] # reverse string, converting BE->LE
+ return r
+
+def bn2vch(v):
+ return bytes(mpi2vch(bn2mpi(v)))
+
+def vch2mpi(s):
+ r = struct.pack(b">I", len(s)) # size
+ r += s[::-1] # reverse string, converting LE->BE
+ return r
+
+def vch2bn(s):
+ return mpi2bn(vch2mpi(s))
+
diff --git a/qa/rpc-tests/test_framework/blockstore.py b/qa/rpc-tests/test_framework/blockstore.py
new file mode 100644
index 0000000000..c57b6df81b
--- /dev/null
+++ b/qa/rpc-tests/test_framework/blockstore.py
@@ -0,0 +1,127 @@
+# BlockStore: a helper class that keeps a map of blocks and implements
+# helper functions for responding to getheaders and getdata,
+# and for constructing a getheaders message
+#
+
+from mininode import *
+import dbm
+
+class BlockStore(object):
+ def __init__(self, datadir):
+ self.blockDB = dbm.open(datadir + "/blocks", 'c')
+ self.currentBlock = 0L
+
+ def close(self):
+ self.blockDB.close()
+
+ def get(self, blockhash):
+ serialized_block = None
+ try:
+ serialized_block = self.blockDB[repr(blockhash)]
+ except KeyError:
+ return None
+ f = cStringIO.StringIO(serialized_block)
+ ret = CBlock()
+ ret.deserialize(f)
+ ret.calc_sha256()
+ return ret
+
+ # Note: this pulls full blocks out of the database just to retrieve
+ # the headers -- perhaps we could keep a separate data structure
+ # to avoid this overhead.
+ def headers_for(self, locator, hash_stop, current_tip=None):
+ if current_tip is None:
+ current_tip = self.currentBlock
+ current_block = self.get(current_tip)
+ if current_block is None:
+ return None
+
+ response = msg_headers()
+ headersList = [ CBlockHeader(current_block) ]
+ maxheaders = 2000
+ while (headersList[0].sha256 not in locator.vHave):
+ prevBlockHash = headersList[0].hashPrevBlock
+ prevBlock = self.get(prevBlockHash)
+ if prevBlock is not None:
+ headersList.insert(0, CBlockHeader(prevBlock))
+ else:
+ break
+ headersList = headersList[:maxheaders] # truncate if we have too many
+ hashList = [x.sha256 for x in headersList]
+ index = len(headersList)
+ if (hash_stop in hashList):
+ index = hashList.index(hash_stop)+1
+ response.headers = headersList[:index]
+ return response
+
+ def add_block(self, block):
+ block.calc_sha256()
+ try:
+ self.blockDB[repr(block.sha256)] = bytes(block.serialize())
+ except TypeError as e:
+ print "Unexpected error: ", sys.exc_info()[0], e.args
+ self.currentBlock = block.sha256
+
+ def get_blocks(self, inv):
+ responses = []
+ for i in inv:
+ if (i.type == 2): # MSG_BLOCK
+ block = self.get(i.hash)
+ if block is not None:
+ responses.append(msg_block(block))
+ return responses
+
+ def get_locator(self, current_tip=None):
+ if current_tip is None:
+ current_tip = self.currentBlock
+ r = []
+ counter = 0
+ step = 1
+ lastBlock = self.get(current_tip)
+ while lastBlock is not None:
+ r.append(lastBlock.hashPrevBlock)
+ for i in range(step):
+ lastBlock = self.get(lastBlock.hashPrevBlock)
+ if lastBlock is None:
+ break
+ counter += 1
+ if counter > 10:
+ step *= 2
+ locator = CBlockLocator()
+ locator.vHave = r
+ return locator
+
+class TxStore(object):
+ def __init__(self, datadir):
+ self.txDB = dbm.open(datadir + "/transactions", 'c')
+
+ def close(self):
+ self.txDB.close()
+
+ def get(self, txhash):
+ serialized_tx = None
+ try:
+ serialized_tx = self.txDB[repr(txhash)]
+ except KeyError:
+ return None
+ f = cStringIO.StringIO(serialized_tx)
+ ret = CTransaction()
+ ret.deserialize(f)
+ ret.calc_sha256()
+ return ret
+
+ def add_transaction(self, tx):
+ tx.calc_sha256()
+ try:
+ self.txDB[repr(tx.sha256)] = bytes(tx.serialize())
+ except TypeError as e:
+ print "Unexpected error: ", sys.exc_info()[0], e.args
+
+ def get_transactions(self, inv):
+ responses = []
+ for i in inv:
+ if (i.type == 1): # MSG_TX
+ tx = self.get(i.hash)
+ if tx is not None:
+ responses.append(msg_tx(tx))
+ return responses
diff --git a/qa/rpc-tests/test_framework/blocktools.py b/qa/rpc-tests/test_framework/blocktools.py
new file mode 100644
index 0000000000..f397fe7cd6
--- /dev/null
+++ b/qa/rpc-tests/test_framework/blocktools.py
@@ -0,0 +1,65 @@
+# blocktools.py - utilities for manipulating blocks and transactions
+#
+# Distributed under the MIT/X11 software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#
+
+from mininode import *
+from script import CScript, CScriptOp
+
+# Create a block (with regtest difficulty)
+def create_block(hashprev, coinbase, nTime=None):
+ block = CBlock()
+ if nTime is None:
+ import time
+ block.nTime = int(time.time()+600)
+ else:
+ block.nTime = nTime
+ block.hashPrevBlock = hashprev
+ block.nBits = 0x207fffff # Will break after a difficulty adjustment...
+ block.vtx.append(coinbase)
+ block.hashMerkleRoot = block.calc_merkle_root()
+ block.calc_sha256()
+ return block
+
+def serialize_script_num(value):
+ r = bytearray(0)
+ if value == 0:
+ return r
+ neg = value < 0
+ absvalue = -value if neg else value
+ while (absvalue):
+ r.append(chr(absvalue & 0xff))
+ absvalue >>= 8
+ if r[-1] & 0x80:
+ r.append(0x80 if neg else 0)
+ elif neg:
+ r[-1] |= 0x80
+ return r
+
+counter=1
+# Create an anyone-can-spend coinbase transaction, assuming no miner fees
+def create_coinbase(heightAdjust = 0):
+ global counter
+ coinbase = CTransaction()
+ coinbase.vin.append(CTxIn(COutPoint(0, 0xffffffff),
+ ser_string(serialize_script_num(counter+heightAdjust)), 0xffffffff))
+ counter += 1
+ coinbaseoutput = CTxOut()
+ coinbaseoutput.nValue = 50*100000000
+ halvings = int((counter+heightAdjust)/150) # regtest
+ coinbaseoutput.nValue >>= halvings
+ coinbaseoutput.scriptPubKey = ""
+ coinbase.vout = [ coinbaseoutput ]
+ coinbase.calc_sha256()
+ return coinbase
+
+# Create a transaction with an anyone-can-spend output, that spends the
+# nth output of prevtx.
+def create_transaction(prevtx, n, sig, value):
+ tx = CTransaction()
+ assert(n < len(prevtx.vout))
+ tx.vin.append(CTxIn(COutPoint(prevtx.sha256, n), sig, 0xffffffff))
+ tx.vout.append(CTxOut(value, ""))
+ tx.calc_sha256()
+ return tx
diff --git a/qa/rpc-tests/test_framework/comptool.py b/qa/rpc-tests/test_framework/comptool.py
new file mode 100755
index 0000000000..23a979250c
--- /dev/null
+++ b/qa/rpc-tests/test_framework/comptool.py
@@ -0,0 +1,341 @@
+#!/usr/bin/env python2
+#
+# Distributed under the MIT/X11 software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#
+
+from mininode import *
+from blockstore import BlockStore, TxStore
+from util import p2p_port
+
+'''
+This is a tool for comparing two or more bitcoinds to each other
+using a script provided.
+
+To use, create a class that implements get_tests(), and pass it in
+as the test generator to TestManager. get_tests() should be a python
+generator that returns TestInstance objects. See below for definition.
+'''
+
+# TestNode behaves as follows:
+# Configure with a BlockStore and TxStore
+# on_inv: log the message but don't request
+# on_headers: log the chain tip
+# on_pong: update ping response map (for synchronization)
+# on_getheaders: provide headers via BlockStore
+# on_getdata: provide blocks via BlockStore
+
+global mininode_lock
+
+class TestNode(NodeConnCB):
+
+ def __init__(self, block_store, tx_store):
+ NodeConnCB.__init__(self)
+ self.create_callback_map()
+ self.conn = None
+ self.bestblockhash = None
+ self.block_store = block_store
+ self.block_request_map = {}
+ self.tx_store = tx_store
+ self.tx_request_map = {}
+
+ # When the pingmap is non-empty we're waiting for
+ # a response
+ self.pingMap = {}
+ self.lastInv = []
+
+ def add_connection(self, conn):
+ self.conn = conn
+
+ def on_headers(self, conn, message):
+ if len(message.headers) > 0:
+ best_header = message.headers[-1]
+ best_header.calc_sha256()
+ self.bestblockhash = best_header.sha256
+
+ def on_getheaders(self, conn, message):
+ response = self.block_store.headers_for(message.locator, message.hashstop)
+ if response is not None:
+ conn.send_message(response)
+
+ def on_getdata(self, conn, message):
+ [conn.send_message(r) for r in self.block_store.get_blocks(message.inv)]
+ [conn.send_message(r) for r in self.tx_store.get_transactions(message.inv)]
+
+ for i in message.inv:
+ if i.type == 1:
+ self.tx_request_map[i.hash] = True
+ elif i.type == 2:
+ self.block_request_map[i.hash] = True
+
+ def on_inv(self, conn, message):
+ self.lastInv = [x.hash for x in message.inv]
+
+ def on_pong(self, conn, message):
+ try:
+ del self.pingMap[message.nonce]
+ except KeyError:
+ raise AssertionError("Got pong for unknown ping [%s]" % repr(message))
+
+ def send_inv(self, obj):
+ mtype = 2 if isinstance(obj, CBlock) else 1
+ self.conn.send_message(msg_inv([CInv(mtype, obj.sha256)]))
+
+ def send_getheaders(self):
+ # We ask for headers from their last tip.
+ m = msg_getheaders()
+ m.locator = self.block_store.get_locator(self.bestblockhash)
+ self.conn.send_message(m)
+
+ # This assumes BIP31
+ def send_ping(self, nonce):
+ self.pingMap[nonce] = True
+ self.conn.send_message(msg_ping(nonce))
+
+ def received_ping_response(self, nonce):
+ return nonce not in self.pingMap
+
+ def send_mempool(self):
+ self.lastInv = []
+ self.conn.send_message(msg_mempool())
+
+# TestInstance:
+#
+# Instances of these are generated by the test generator, and fed into the
+# comptool.
+#
+# "blocks_and_transactions" should be an array of [obj, True/False/None]:
+# - obj is either a CBlock or a CTransaction, and
+# - the second value indicates whether the object should be accepted
+# into the blockchain or mempool (for tests where we expect a certain
+# answer), or "None" if we don't expect a certain answer and are just
+# comparing the behavior of the nodes being tested.
+# sync_every_block: if True, then each block will be inv'ed, synced, and
+# nodes will be tested based on the outcome for the block. If False,
+# then inv's accumulate until all blocks are processed (or max inv size
+# is reached) and then sent out in one inv message. Then the final block
+# will be synced across all connections, and the outcome of the final
+# block will be tested.
+# sync_every_tx: analagous to behavior for sync_every_block, except if outcome
+# on the final tx is None, then contents of entire mempool are compared
+# across all connections. (If outcome of final tx is specified as true
+# or false, then only the last tx is tested against outcome.)
+
+class TestInstance(object):
+ def __init__(self, objects=[], sync_every_block=True, sync_every_tx=False):
+ self.blocks_and_transactions = objects
+ self.sync_every_block = sync_every_block
+ self.sync_every_tx = sync_every_tx
+
+class TestManager(object):
+
+ def __init__(self, testgen, datadir):
+ self.test_generator = testgen
+ self.connections = []
+ self.block_store = BlockStore(datadir)
+ self.tx_store = TxStore(datadir)
+ self.ping_counter = 1
+
+ def add_all_connections(self, nodes):
+ for i in range(len(nodes)):
+ # Create a p2p connection to each node
+ self.connections.append(NodeConn('127.0.0.1', p2p_port(i),
+ nodes[i], TestNode(self.block_store, self.tx_store)))
+ # Make sure the TestNode (callback class) has a reference to its
+ # associated NodeConn
+ self.connections[-1].cb.add_connection(self.connections[-1])
+
+ def wait_for_verack(self):
+ sleep_time = 0.05
+ max_tries = 10 / sleep_time # Wait at most 10 seconds
+ while max_tries > 0:
+ done = True
+ with mininode_lock:
+ for c in self.connections:
+ if c.cb.verack_received is False:
+ done = False
+ break
+ if done:
+ break
+ time.sleep(sleep_time)
+
+ def wait_for_pings(self, counter):
+ received_pongs = False
+ while received_pongs is not True:
+ time.sleep(0.05)
+ received_pongs = True
+ with mininode_lock:
+ for c in self.connections:
+ if c.cb.received_ping_response(counter) is not True:
+ received_pongs = False
+ break
+
+ # sync_blocks: Wait for all connections to request the blockhash given
+ # then send get_headers to find out the tip of each node, and synchronize
+ # the response by using a ping (and waiting for pong with same nonce).
+ def sync_blocks(self, blockhash, num_blocks):
+ # Wait for nodes to request block (50ms sleep * 20 tries * num_blocks)
+ max_tries = 20*num_blocks
+ while max_tries > 0:
+ with mininode_lock:
+ results = [ blockhash in c.cb.block_request_map and
+ c.cb.block_request_map[blockhash] for c in self.connections ]
+ if False not in results:
+ break
+ time.sleep(0.05)
+ max_tries -= 1
+
+ # --> error if not requested
+ if max_tries == 0:
+ # print [ c.cb.block_request_map for c in self.connections ]
+ raise AssertionError("Not all nodes requested block")
+ # --> Answer request (we did this inline!)
+
+ # Send getheaders message
+ [ c.cb.send_getheaders() for c in self.connections ]
+
+ # Send ping and wait for response -- synchronization hack
+ [ c.cb.send_ping(self.ping_counter) for c in self.connections ]
+ self.wait_for_pings(self.ping_counter)
+ self.ping_counter += 1
+
+ # Analogous to sync_block (see above)
+ def sync_transaction(self, txhash, num_events):
+ # Wait for nodes to request transaction (50ms sleep * 20 tries * num_events)
+ max_tries = 20*num_events
+ while max_tries > 0:
+ with mininode_lock:
+ results = [ txhash in c.cb.tx_request_map and
+ c.cb.tx_request_map[txhash] for c in self.connections ]
+ if False not in results:
+ break
+ time.sleep(0.05)
+ max_tries -= 1
+
+ # --> error if not requested
+ if max_tries == 0:
+ # print [ c.cb.tx_request_map for c in self.connections ]
+ raise AssertionError("Not all nodes requested transaction")
+ # --> Answer request (we did this inline!)
+
+ # Get the mempool
+ [ c.cb.send_mempool() for c in self.connections ]
+
+ # Send ping and wait for response -- synchronization hack
+ [ c.cb.send_ping(self.ping_counter) for c in self.connections ]
+ self.wait_for_pings(self.ping_counter)
+ self.ping_counter += 1
+
+ # Sort inv responses from each node
+ with mininode_lock:
+ [ c.cb.lastInv.sort() for c in self.connections ]
+
+ # Verify that the tip of each connection all agree with each other, and
+ # with the expected outcome (if given)
+ def check_results(self, blockhash, outcome):
+ with mininode_lock:
+ for c in self.connections:
+ if outcome is None:
+ if c.cb.bestblockhash != self.connections[0].cb.bestblockhash:
+ return False
+ elif ((c.cb.bestblockhash == blockhash) != outcome):
+ # print c.cb.bestblockhash, blockhash, outcome
+ return False
+ return True
+
+ # Either check that the mempools all agree with each other, or that
+ # txhash's presence in the mempool matches the outcome specified.
+ # This is somewhat of a strange comparison, in that we're either comparing
+ # a particular tx to an outcome, or the entire mempools altogether;
+ # perhaps it would be useful to add the ability to check explicitly that
+ # a particular tx's existence in the mempool is the same across all nodes.
+ def check_mempool(self, txhash, outcome):
+ with mininode_lock:
+ for c in self.connections:
+ if outcome is None:
+ # Make sure the mempools agree with each other
+ if c.cb.lastInv != self.connections[0].cb.lastInv:
+ # print c.rpc.getrawmempool()
+ return False
+ elif ((txhash in c.cb.lastInv) != outcome):
+ # print c.rpc.getrawmempool(), c.cb.lastInv
+ return False
+ return True
+
+ def run(self):
+ # Wait until verack is received
+ self.wait_for_verack()
+
+ test_number = 1
+ for test_instance in self.test_generator.get_tests():
+ # We use these variables to keep track of the last block
+ # and last transaction in the tests, which are used
+ # if we're not syncing on every block or every tx.
+ [ block, block_outcome ] = [ None, None ]
+ [ tx, tx_outcome ] = [ None, None ]
+ invqueue = []
+
+ for b_or_t, outcome in test_instance.blocks_and_transactions:
+ # Determine if we're dealing with a block or tx
+ if isinstance(b_or_t, CBlock): # Block test runner
+ block = b_or_t
+ block_outcome = outcome
+ # Add to shared block_store, set as current block
+ with mininode_lock:
+ self.block_store.add_block(block)
+ for c in self.connections:
+ c.cb.block_request_map[block.sha256] = False
+ # Either send inv's to each node and sync, or add
+ # to invqueue for later inv'ing.
+ if (test_instance.sync_every_block):
+ [ c.cb.send_inv(block) for c in self.connections ]
+ self.sync_blocks(block.sha256, 1)
+ if (not self.check_results(block.sha256, outcome)):
+ raise AssertionError("Test failed at test %d" % test_number)
+ else:
+ invqueue.append(CInv(2, block.sha256))
+ else: # Tx test runner
+ assert(isinstance(b_or_t, CTransaction))
+ tx = b_or_t
+ tx_outcome = outcome
+ # Add to shared tx store and clear map entry
+ with mininode_lock:
+ self.tx_store.add_transaction(tx)
+ for c in self.connections:
+ c.cb.tx_request_map[tx.sha256] = False
+ # Again, either inv to all nodes or save for later
+ if (test_instance.sync_every_tx):
+ [ c.cb.send_inv(tx) for c in self.connections ]
+ self.sync_transaction(tx.sha256, 1)
+ if (not self.check_mempool(tx.sha256, outcome)):
+ raise AssertionError("Test failed at test %d" % test_number)
+ else:
+ invqueue.append(CInv(1, tx.sha256))
+ # Ensure we're not overflowing the inv queue
+ if len(invqueue) == MAX_INV_SZ:
+ [ c.send_message(msg_inv(invqueue)) for c in self.connections ]
+ invqueue = []
+
+ # Do final sync if we weren't syncing on every block or every tx.
+ if (not test_instance.sync_every_block and block is not None):
+ if len(invqueue) > 0:
+ [ c.send_message(msg_inv(invqueue)) for c in self.connections ]
+ invqueue = []
+ self.sync_blocks(block.sha256,
+ len(test_instance.blocks_and_transactions))
+ if (not self.check_results(block.sha256, block_outcome)):
+ raise AssertionError("Block test failed at test %d" % test_number)
+ if (not test_instance.sync_every_tx and tx is not None):
+ if len(invqueue) > 0:
+ [ c.send_message(msg_inv(invqueue)) for c in self.connections ]
+ invqueue = []
+ self.sync_transaction(tx.sha256, len(test_instance.blocks_and_transactions))
+ if (not self.check_mempool(tx.sha256, tx_outcome)):
+ raise AssertionError("Mempool test failed at test %d" % test_number)
+
+ print "Test %d: PASS" % test_number, [ c.rpc.getblockcount() for c in self.connections ]
+ test_number += 1
+
+ self.block_store.close()
+ self.tx_store.close()
+ [ c.disconnect_node() for c in self.connections ]
diff --git a/qa/rpc-tests/test_framework/mininode.py b/qa/rpc-tests/test_framework/mininode.py
new file mode 100755
index 0000000000..b7d78e74fa
--- /dev/null
+++ b/qa/rpc-tests/test_framework/mininode.py
@@ -0,0 +1,1256 @@
+# mininode.py - Bitcoin P2P network half-a-node
+#
+# Distributed under the MIT/X11 software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#
+# This python code was modified from ArtForz' public domain half-a-node, as
+# found in the mini-node branch of http://github.com/jgarzik/pynode.
+#
+# NodeConn: an object which manages p2p connectivity to a bitcoin node
+# NodeConnCB: a base class that describes the interface for receiving
+# callbacks with network messages from a NodeConn
+# CBlock, CTransaction, CBlockHeader, CTxIn, CTxOut, etc....:
+# data structures that should map to corresponding structures in
+# bitcoin/primitives
+# msg_block, msg_tx, msg_headers, etc.:
+# data structures that represent network messages
+# ser_*, deser_*: functions that handle serialization/deserialization
+
+
+import struct
+import socket
+import asyncore
+import binascii
+import time
+import sys
+import random
+import cStringIO
+import hashlib
+from threading import RLock
+from threading import Thread
+import logging
+import copy
+
+BIP0031_VERSION = 60000
+MY_VERSION = 60001 # past bip-31 for ping/pong
+MY_SUBVERSION = "/python-mininode-tester:0.0.1/"
+
+MAX_INV_SZ = 50000
+
+# Keep our own socket map for asyncore, so that we can track disconnects
+# ourselves (to workaround an issue with closing an asyncore socket when
+# using select)
+mininode_socket_map = dict()
+
+# One lock for synchronizing all data access between the networking thread (see
+# NetworkThread below) and the thread running the test logic. For simplicity,
+# NodeConn acquires this lock whenever delivering a message to to a NodeConnCB,
+# and whenever adding anything to the send buffer (in send_message()). This
+# lock should be acquired in the thread running the test logic to synchronize
+# access to any data shared with the NodeConnCB or NodeConn.
+mininode_lock = RLock()
+
+# Serialization/deserialization tools
+def sha256(s):
+ return hashlib.new('sha256', s).digest()
+
+
+def hash256(s):
+ return sha256(sha256(s))
+
+
+def deser_string(f):
+ nit = struct.unpack("<B", f.read(1))[0]
+ if nit == 253:
+ nit = struct.unpack("<H", f.read(2))[0]
+ elif nit == 254:
+ nit = struct.unpack("<I", f.read(4))[0]
+ elif nit == 255:
+ nit = struct.unpack("<Q", f.read(8))[0]
+ return f.read(nit)
+
+
+def ser_string(s):
+ if len(s) < 253:
+ return chr(len(s)) + s
+ elif len(s) < 0x10000:
+ return chr(253) + struct.pack("<H", len(s)) + s
+ elif len(s) < 0x100000000L:
+ return chr(254) + struct.pack("<I", len(s)) + s
+ return chr(255) + struct.pack("<Q", len(s)) + s
+
+
+def deser_uint256(f):
+ r = 0L
+ for i in xrange(8):
+ t = struct.unpack("<I", f.read(4))[0]
+ r += t << (i * 32)
+ return r
+
+
+def ser_uint256(u):
+ rs = ""
+ for i in xrange(8):
+ rs += struct.pack("<I", u & 0xFFFFFFFFL)
+ u >>= 32
+ return rs
+
+
+def uint256_from_str(s):
+ r = 0L
+ t = struct.unpack("<IIIIIIII", s[:32])
+ for i in xrange(8):
+ r += t[i] << (i * 32)
+ return r
+
+
+def uint256_from_compact(c):
+ nbytes = (c >> 24) & 0xFF
+ v = (c & 0xFFFFFFL) << (8 * (nbytes - 3))
+ return v
+
+
+def deser_vector(f, c):
+ nit = struct.unpack("<B", f.read(1))[0]
+ if nit == 253:
+ nit = struct.unpack("<H", f.read(2))[0]
+ elif nit == 254:
+ nit = struct.unpack("<I", f.read(4))[0]
+ elif nit == 255:
+ nit = struct.unpack("<Q", f.read(8))[0]
+ r = []
+ for i in xrange(nit):
+ t = c()
+ t.deserialize(f)
+ r.append(t)
+ return r
+
+
+def ser_vector(l):
+ r = ""
+ if len(l) < 253:
+ r = chr(len(l))
+ elif len(l) < 0x10000:
+ r = chr(253) + struct.pack("<H", len(l))
+ elif len(l) < 0x100000000L:
+ r = chr(254) + struct.pack("<I", len(l))
+ else:
+ r = chr(255) + struct.pack("<Q", len(l))
+ for i in l:
+ r += i.serialize()
+ return r
+
+
+def deser_uint256_vector(f):
+ nit = struct.unpack("<B", f.read(1))[0]
+ if nit == 253:
+ nit = struct.unpack("<H", f.read(2))[0]
+ elif nit == 254:
+ nit = struct.unpack("<I", f.read(4))[0]
+ elif nit == 255:
+ nit = struct.unpack("<Q", f.read(8))[0]
+ r = []
+ for i in xrange(nit):
+ t = deser_uint256(f)
+ r.append(t)
+ return r
+
+
+def ser_uint256_vector(l):
+ r = ""
+ if len(l) < 253:
+ r = chr(len(l))
+ elif len(l) < 0x10000:
+ r = chr(253) + struct.pack("<H", len(l))
+ elif len(l) < 0x100000000L:
+ r = chr(254) + struct.pack("<I", len(l))
+ else:
+ r = chr(255) + struct.pack("<Q", len(l))
+ for i in l:
+ r += ser_uint256(i)
+ return r
+
+
+def deser_string_vector(f):
+ nit = struct.unpack("<B", f.read(1))[0]
+ if nit == 253:
+ nit = struct.unpack("<H", f.read(2))[0]
+ elif nit == 254:
+ nit = struct.unpack("<I", f.read(4))[0]
+ elif nit == 255:
+ nit = struct.unpack("<Q", f.read(8))[0]
+ r = []
+ for i in xrange(nit):
+ t = deser_string(f)
+ r.append(t)
+ return r
+
+
+def ser_string_vector(l):
+ r = ""
+ if len(l) < 253:
+ r = chr(len(l))
+ elif len(l) < 0x10000:
+ r = chr(253) + struct.pack("<H", len(l))
+ elif len(l) < 0x100000000L:
+ r = chr(254) + struct.pack("<I", len(l))
+ else:
+ r = chr(255) + struct.pack("<Q", len(l))
+ for sv in l:
+ r += ser_string(sv)
+ return r
+
+
+def deser_int_vector(f):
+ nit = struct.unpack("<B", f.read(1))[0]
+ if nit == 253:
+ nit = struct.unpack("<H", f.read(2))[0]
+ elif nit == 254:
+ nit = struct.unpack("<I", f.read(4))[0]
+ elif nit == 255:
+ nit = struct.unpack("<Q", f.read(8))[0]
+ r = []
+ for i in xrange(nit):
+ t = struct.unpack("<i", f.read(4))[0]
+ r.append(t)
+ return r
+
+
+def ser_int_vector(l):
+ r = ""
+ if len(l) < 253:
+ r = chr(len(l))
+ elif len(l) < 0x10000:
+ r = chr(253) + struct.pack("<H", len(l))
+ elif len(l) < 0x100000000L:
+ r = chr(254) + struct.pack("<I", len(l))
+ else:
+ r = chr(255) + struct.pack("<Q", len(l))
+ for i in l:
+ r += struct.pack("<i", i)
+ return r
+
+
+# Objects that map to bitcoind objects, which can be serialized/deserialized
+
+class CAddress(object):
+ def __init__(self):
+ self.nServices = 1
+ self.pchReserved = "\x00" * 10 + "\xff" * 2
+ self.ip = "0.0.0.0"
+ self.port = 0
+
+ def deserialize(self, f):
+ self.nServices = struct.unpack("<Q", f.read(8))[0]
+ self.pchReserved = f.read(12)
+ self.ip = socket.inet_ntoa(f.read(4))
+ self.port = struct.unpack(">H", f.read(2))[0]
+
+ def serialize(self):
+ r = ""
+ r += struct.pack("<Q", self.nServices)
+ r += self.pchReserved
+ r += socket.inet_aton(self.ip)
+ r += struct.pack(">H", self.port)
+ return r
+
+ def __repr__(self):
+ return "CAddress(nServices=%i ip=%s port=%i)" % (self.nServices,
+ self.ip, self.port)
+
+
+class CInv(object):
+ typemap = {
+ 0: "Error",
+ 1: "TX",
+ 2: "Block"}
+
+ def __init__(self, t=0, h=0L):
+ self.type = t
+ self.hash = h
+
+ def deserialize(self, f):
+ self.type = struct.unpack("<i", f.read(4))[0]
+ self.hash = deser_uint256(f)
+
+ def serialize(self):
+ r = ""
+ r += struct.pack("<i", self.type)
+ r += ser_uint256(self.hash)
+ return r
+
+ def __repr__(self):
+ return "CInv(type=%s hash=%064x)" \
+ % (self.typemap[self.type], self.hash)
+
+
+class CBlockLocator(object):
+ def __init__(self):
+ self.nVersion = MY_VERSION
+ self.vHave = []
+
+ def deserialize(self, f):
+ self.nVersion = struct.unpack("<i", f.read(4))[0]
+ self.vHave = deser_uint256_vector(f)
+
+ def serialize(self):
+ r = ""
+ r += struct.pack("<i", self.nVersion)
+ r += ser_uint256_vector(self.vHave)
+ return r
+
+ def __repr__(self):
+ return "CBlockLocator(nVersion=%i vHave=%s)" \
+ % (self.nVersion, repr(self.vHave))
+
+
+class COutPoint(object):
+ def __init__(self, hash=0, n=0):
+ self.hash = hash
+ self.n = n
+
+ def deserialize(self, f):
+ self.hash = deser_uint256(f)
+ self.n = struct.unpack("<I", f.read(4))[0]
+
+ def serialize(self):
+ r = ""
+ r += ser_uint256(self.hash)
+ r += struct.pack("<I", self.n)
+ return r
+
+ def __repr__(self):
+ return "COutPoint(hash=%064x n=%i)" % (self.hash, self.n)
+
+
+class CTxIn(object):
+ def __init__(self, outpoint=None, scriptSig="", nSequence=0):
+ if outpoint is None:
+ self.prevout = COutPoint()
+ else:
+ self.prevout = outpoint
+ self.scriptSig = scriptSig
+ self.nSequence = nSequence
+
+ def deserialize(self, f):
+ self.prevout = COutPoint()
+ self.prevout.deserialize(f)
+ self.scriptSig = deser_string(f)
+ self.nSequence = struct.unpack("<I", f.read(4))[0]
+
+ def serialize(self):
+ r = ""
+ r += self.prevout.serialize()
+ r += ser_string(self.scriptSig)
+ r += struct.pack("<I", self.nSequence)
+ return r
+
+ def __repr__(self):
+ return "CTxIn(prevout=%s scriptSig=%s nSequence=%i)" \
+ % (repr(self.prevout), binascii.hexlify(self.scriptSig),
+ self.nSequence)
+
+
+class CTxOut(object):
+ def __init__(self, nValue=0, scriptPubKey=""):
+ self.nValue = nValue
+ self.scriptPubKey = scriptPubKey
+
+ def deserialize(self, f):
+ self.nValue = struct.unpack("<q", f.read(8))[0]
+ self.scriptPubKey = deser_string(f)
+
+ def serialize(self):
+ r = ""
+ r += struct.pack("<q", self.nValue)
+ r += ser_string(self.scriptPubKey)
+ return r
+
+ def __repr__(self):
+ return "CTxOut(nValue=%i.%08i scriptPubKey=%s)" \
+ % (self.nValue // 100000000, self.nValue % 100000000,
+ binascii.hexlify(self.scriptPubKey))
+
+
+class CTransaction(object):
+ def __init__(self, tx=None):
+ if tx is None:
+ self.nVersion = 1
+ self.vin = []
+ self.vout = []
+ self.nLockTime = 0
+ self.sha256 = None
+ self.hash = None
+ else:
+ self.nVersion = tx.nVersion
+ self.vin = copy.deepcopy(tx.vin)
+ self.vout = copy.deepcopy(tx.vout)
+ self.nLockTime = tx.nLockTime
+ self.sha256 = None
+ self.hash = None
+
+ def deserialize(self, f):
+ self.nVersion = struct.unpack("<i", f.read(4))[0]
+ self.vin = deser_vector(f, CTxIn)
+ self.vout = deser_vector(f, CTxOut)
+ self.nLockTime = struct.unpack("<I", f.read(4))[0]
+ self.sha256 = None
+ self.hash = None
+
+ def serialize(self):
+ r = ""
+ r += struct.pack("<i", self.nVersion)
+ r += ser_vector(self.vin)
+ r += ser_vector(self.vout)
+ r += struct.pack("<I", self.nLockTime)
+ return r
+
+ def rehash(self):
+ self.sha256 = None
+ self.calc_sha256()
+
+ def calc_sha256(self):
+ if self.sha256 is None:
+ self.sha256 = uint256_from_str(hash256(self.serialize()))
+ self.hash = hash256(self.serialize())[::-1].encode('hex_codec')
+
+ def is_valid(self):
+ self.calc_sha256()
+ for tout in self.vout:
+ if tout.nValue < 0 or tout.nValue > 21000000L * 100000000L:
+ return False
+ return True
+
+ def __repr__(self):
+ return "CTransaction(nVersion=%i vin=%s vout=%s nLockTime=%i)" \
+ % (self.nVersion, repr(self.vin), repr(self.vout), self.nLockTime)
+
+
+class CBlockHeader(object):
+ def __init__(self, header=None):
+ if header is None:
+ self.set_null()
+ else:
+ self.nVersion = header.nVersion
+ self.hashPrevBlock = header.hashPrevBlock
+ self.hashMerkleRoot = header.hashMerkleRoot
+ self.nTime = header.nTime
+ self.nBits = header.nBits
+ self.nNonce = header.nNonce
+ self.sha256 = header.sha256
+ self.hash = header.hash
+ self.calc_sha256()
+
+ def set_null(self):
+ self.nVersion = 1
+ self.hashPrevBlock = 0
+ self.hashMerkleRoot = 0
+ self.nTime = 0
+ self.nBits = 0
+ self.nNonce = 0
+ self.sha256 = None
+ self.hash = None
+
+ def deserialize(self, f):
+ self.nVersion = struct.unpack("<i", f.read(4))[0]
+ self.hashPrevBlock = deser_uint256(f)
+ self.hashMerkleRoot = deser_uint256(f)
+ self.nTime = struct.unpack("<I", f.read(4))[0]
+ self.nBits = struct.unpack("<I", f.read(4))[0]
+ self.nNonce = struct.unpack("<I", f.read(4))[0]
+ self.sha256 = None
+ self.hash = None
+
+ def serialize(self):
+ r = ""
+ r += struct.pack("<i", self.nVersion)
+ r += ser_uint256(self.hashPrevBlock)
+ r += ser_uint256(self.hashMerkleRoot)
+ r += struct.pack("<I", self.nTime)
+ r += struct.pack("<I", self.nBits)
+ r += struct.pack("<I", self.nNonce)
+ return r
+
+ def calc_sha256(self):
+ if self.sha256 is None:
+ r = ""
+ r += struct.pack("<i", self.nVersion)
+ r += ser_uint256(self.hashPrevBlock)
+ r += ser_uint256(self.hashMerkleRoot)
+ r += struct.pack("<I", self.nTime)
+ r += struct.pack("<I", self.nBits)
+ r += struct.pack("<I", self.nNonce)
+ self.sha256 = uint256_from_str(hash256(r))
+ self.hash = hash256(r)[::-1].encode('hex_codec')
+
+ def rehash(self):
+ self.sha256 = None
+ self.calc_sha256()
+ return self.sha256
+
+ def __repr__(self):
+ return "CBlockHeader(nVersion=%i hashPrevBlock=%064x hashMerkleRoot=%064x nTime=%s nBits=%08x nNonce=%08x)" \
+ % (self.nVersion, self.hashPrevBlock, self.hashMerkleRoot,
+ time.ctime(self.nTime), self.nBits, self.nNonce)
+
+
+class CBlock(CBlockHeader):
+ def __init__(self, header=None):
+ super(CBlock, self).__init__(header)
+ self.vtx = []
+
+ def deserialize(self, f):
+ super(CBlock, self).deserialize(f)
+ self.vtx = deser_vector(f, CTransaction)
+
+ def serialize(self):
+ r = ""
+ r += super(CBlock, self).serialize()
+ r += ser_vector(self.vtx)
+ return r
+
+ def calc_merkle_root(self):
+ hashes = []
+ for tx in self.vtx:
+ tx.calc_sha256()
+ hashes.append(ser_uint256(tx.sha256))
+ while len(hashes) > 1:
+ newhashes = []
+ for i in xrange(0, len(hashes), 2):
+ i2 = min(i+1, len(hashes)-1)
+ newhashes.append(hash256(hashes[i] + hashes[i2]))
+ hashes = newhashes
+ return uint256_from_str(hashes[0])
+
+ def is_valid(self):
+ self.calc_sha256()
+ target = uint256_from_compact(self.nBits)
+ if self.sha256 > target:
+ return False
+ for tx in self.vtx:
+ if not tx.is_valid():
+ return False
+ if self.calc_merkle_root() != self.hashMerkleRoot:
+ return False
+ return True
+
+ def solve(self):
+ self.calc_sha256()
+ target = uint256_from_compact(self.nBits)
+ while self.sha256 > target:
+ self.nNonce += 1
+ self.rehash()
+
+ def __repr__(self):
+ return "CBlock(nVersion=%i hashPrevBlock=%064x hashMerkleRoot=%064x nTime=%s nBits=%08x nNonce=%08x vtx=%s)" \
+ % (self.nVersion, self.hashPrevBlock, self.hashMerkleRoot,
+ time.ctime(self.nTime), self.nBits, self.nNonce, repr(self.vtx))
+
+
+class CUnsignedAlert(object):
+ def __init__(self):
+ self.nVersion = 1
+ self.nRelayUntil = 0
+ self.nExpiration = 0
+ self.nID = 0
+ self.nCancel = 0
+ self.setCancel = []
+ self.nMinVer = 0
+ self.nMaxVer = 0
+ self.setSubVer = []
+ self.nPriority = 0
+ self.strComment = ""
+ self.strStatusBar = ""
+ self.strReserved = ""
+
+ def deserialize(self, f):
+ self.nVersion = struct.unpack("<i", f.read(4))[0]
+ self.nRelayUntil = struct.unpack("<q", f.read(8))[0]
+ self.nExpiration = struct.unpack("<q", f.read(8))[0]
+ self.nID = struct.unpack("<i", f.read(4))[0]
+ self.nCancel = struct.unpack("<i", f.read(4))[0]
+ self.setCancel = deser_int_vector(f)
+ self.nMinVer = struct.unpack("<i", f.read(4))[0]
+ self.nMaxVer = struct.unpack("<i", f.read(4))[0]
+ self.setSubVer = deser_string_vector(f)
+ self.nPriority = struct.unpack("<i", f.read(4))[0]
+ self.strComment = deser_string(f)
+ self.strStatusBar = deser_string(f)
+ self.strReserved = deser_string(f)
+
+ def serialize(self):
+ r = ""
+ r += struct.pack("<i", self.nVersion)
+ r += struct.pack("<q", self.nRelayUntil)
+ r += struct.pack("<q", self.nExpiration)
+ r += struct.pack("<i", self.nID)
+ r += struct.pack("<i", self.nCancel)
+ r += ser_int_vector(self.setCancel)
+ r += struct.pack("<i", self.nMinVer)
+ r += struct.pack("<i", self.nMaxVer)
+ r += ser_string_vector(self.setSubVer)
+ r += struct.pack("<i", self.nPriority)
+ r += ser_string(self.strComment)
+ r += ser_string(self.strStatusBar)
+ r += ser_string(self.strReserved)
+ return r
+
+ def __repr__(self):
+ return "CUnsignedAlert(nVersion %d, nRelayUntil %d, nExpiration %d, nID %d, nCancel %d, nMinVer %d, nMaxVer %d, nPriority %d, strComment %s, strStatusBar %s, strReserved %s)" \
+ % (self.nVersion, self.nRelayUntil, self.nExpiration, self.nID,
+ self.nCancel, self.nMinVer, self.nMaxVer, self.nPriority,
+ self.strComment, self.strStatusBar, self.strReserved)
+
+
+class CAlert(object):
+ def __init__(self):
+ self.vchMsg = ""
+ self.vchSig = ""
+
+ def deserialize(self, f):
+ self.vchMsg = deser_string(f)
+ self.vchSig = deser_string(f)
+
+ def serialize(self):
+ r = ""
+ r += ser_string(self.vchMsg)
+ r += ser_string(self.vchSig)
+ return r
+
+ def __repr__(self):
+ return "CAlert(vchMsg.sz %d, vchSig.sz %d)" \
+ % (len(self.vchMsg), len(self.vchSig))
+
+
+# Objects that correspond to messages on the wire
+class msg_version(object):
+ command = "version"
+
+ def __init__(self):
+ self.nVersion = MY_VERSION
+ self.nServices = 1
+ self.nTime = time.time()
+ self.addrTo = CAddress()
+ self.addrFrom = CAddress()
+ self.nNonce = random.getrandbits(64)
+ self.strSubVer = MY_SUBVERSION
+ self.nStartingHeight = -1
+
+ def deserialize(self, f):
+ self.nVersion = struct.unpack("<i", f.read(4))[0]
+ if self.nVersion == 10300:
+ self.nVersion = 300
+ self.nServices = struct.unpack("<Q", f.read(8))[0]
+ self.nTime = struct.unpack("<q", f.read(8))[0]
+ self.addrTo = CAddress()
+ self.addrTo.deserialize(f)
+ if self.nVersion >= 106:
+ self.addrFrom = CAddress()
+ self.addrFrom.deserialize(f)
+ self.nNonce = struct.unpack("<Q", f.read(8))[0]
+ self.strSubVer = deser_string(f)
+ if self.nVersion >= 209:
+ self.nStartingHeight = struct.unpack("<i", f.read(4))[0]
+ else:
+ self.nStartingHeight = None
+ else:
+ self.addrFrom = None
+ self.nNonce = None
+ self.strSubVer = None
+ self.nStartingHeight = None
+
+ def serialize(self):
+ r = ""
+ r += struct.pack("<i", self.nVersion)
+ r += struct.pack("<Q", self.nServices)
+ r += struct.pack("<q", self.nTime)
+ r += self.addrTo.serialize()
+ r += self.addrFrom.serialize()
+ r += struct.pack("<Q", self.nNonce)
+ r += ser_string(self.strSubVer)
+ r += struct.pack("<i", self.nStartingHeight)
+ return r
+
+ def __repr__(self):
+ return 'msg_version(nVersion=%i nServices=%i nTime=%s addrTo=%s addrFrom=%s nNonce=0x%016X strSubVer=%s nStartingHeight=%i)' \
+ % (self.nVersion, self.nServices, time.ctime(self.nTime),
+ repr(self.addrTo), repr(self.addrFrom), self.nNonce,
+ self.strSubVer, self.nStartingHeight)
+
+
+class msg_verack(object):
+ command = "verack"
+
+ def __init__(self):
+ pass
+
+ def deserialize(self, f):
+ pass
+
+ def serialize(self):
+ return ""
+
+ def __repr__(self):
+ return "msg_verack()"
+
+
+class msg_addr(object):
+ command = "addr"
+
+ def __init__(self):
+ self.addrs = []
+
+ def deserialize(self, f):
+ self.addrs = deser_vector(f, CAddress)
+
+ def serialize(self):
+ return ser_vector(self.addrs)
+
+ def __repr__(self):
+ return "msg_addr(addrs=%s)" % (repr(self.addrs))
+
+
+class msg_alert(object):
+ command = "alert"
+
+ def __init__(self):
+ self.alert = CAlert()
+
+ def deserialize(self, f):
+ self.alert = CAlert()
+ self.alert.deserialize(f)
+
+ def serialize(self):
+ r = ""
+ r += self.alert.serialize()
+ return r
+
+ def __repr__(self):
+ return "msg_alert(alert=%s)" % (repr(self.alert), )
+
+
+class msg_inv(object):
+ command = "inv"
+
+ def __init__(self, inv=None):
+ if inv is None:
+ self.inv = []
+ else:
+ self.inv = inv
+
+ def deserialize(self, f):
+ self.inv = deser_vector(f, CInv)
+
+ def serialize(self):
+ return ser_vector(self.inv)
+
+ def __repr__(self):
+ return "msg_inv(inv=%s)" % (repr(self.inv))
+
+
+class msg_getdata(object):
+ command = "getdata"
+
+ def __init__(self):
+ self.inv = []
+
+ def deserialize(self, f):
+ self.inv = deser_vector(f, CInv)
+
+ def serialize(self):
+ return ser_vector(self.inv)
+
+ def __repr__(self):
+ return "msg_getdata(inv=%s)" % (repr(self.inv))
+
+
+class msg_getblocks(object):
+ command = "getblocks"
+
+ def __init__(self):
+ self.locator = CBlockLocator()
+ self.hashstop = 0L
+
+ def deserialize(self, f):
+ self.locator = CBlockLocator()
+ self.locator.deserialize(f)
+ self.hashstop = deser_uint256(f)
+
+ def serialize(self):
+ r = ""
+ r += self.locator.serialize()
+ r += ser_uint256(self.hashstop)
+ return r
+
+ def __repr__(self):
+ return "msg_getblocks(locator=%s hashstop=%064x)" \
+ % (repr(self.locator), self.hashstop)
+
+
+class msg_tx(object):
+ command = "tx"
+
+ def __init__(self, tx=CTransaction()):
+ self.tx = tx
+
+ def deserialize(self, f):
+ self.tx.deserialize(f)
+
+ def serialize(self):
+ return self.tx.serialize()
+
+ def __repr__(self):
+ return "msg_tx(tx=%s)" % (repr(self.tx))
+
+
+class msg_block(object):
+ command = "block"
+
+ def __init__(self, block=None):
+ if block is None:
+ self.block = CBlock()
+ else:
+ self.block = block
+
+ def deserialize(self, f):
+ self.block.deserialize(f)
+
+ def serialize(self):
+ return self.block.serialize()
+
+ def __repr__(self):
+ return "msg_block(block=%s)" % (repr(self.block))
+
+
+class msg_getaddr(object):
+ command = "getaddr"
+
+ def __init__(self):
+ pass
+
+ def deserialize(self, f):
+ pass
+
+ def serialize(self):
+ return ""
+
+ def __repr__(self):
+ return "msg_getaddr()"
+
+
+class msg_ping_prebip31(object):
+ command = "ping"
+
+ def __init__(self):
+ pass
+
+ def deserialize(self, f):
+ pass
+
+ def serialize(self):
+ return ""
+
+ def __repr__(self):
+ return "msg_ping() (pre-bip31)"
+
+
+class msg_ping(object):
+ command = "ping"
+
+ def __init__(self, nonce=0L):
+ self.nonce = nonce
+
+ def deserialize(self, f):
+ self.nonce = struct.unpack("<Q", f.read(8))[0]
+
+ def serialize(self):
+ r = ""
+ r += struct.pack("<Q", self.nonce)
+ return r
+
+ def __repr__(self):
+ return "msg_ping(nonce=%08x)" % self.nonce
+
+
+class msg_pong(object):
+ command = "pong"
+
+ def __init__(self, nonce=0L):
+ self.nonce = nonce
+
+ def deserialize(self, f):
+ self.nonce = struct.unpack("<Q", f.read(8))[0]
+
+ def serialize(self):
+ r = ""
+ r += struct.pack("<Q", self.nonce)
+ return r
+
+ def __repr__(self):
+ return "msg_pong(nonce=%08x)" % self.nonce
+
+
+class msg_mempool(object):
+ command = "mempool"
+
+ def __init__(self):
+ pass
+
+ def deserialize(self, f):
+ pass
+
+ def serialize(self):
+ return ""
+
+ def __repr__(self):
+ return "msg_mempool()"
+
+
+# getheaders message has
+# number of entries
+# vector of hashes
+# hash_stop (hash of last desired block header, 0 to get as many as possible)
+class msg_getheaders(object):
+ command = "getheaders"
+
+ def __init__(self):
+ self.locator = CBlockLocator()
+ self.hashstop = 0L
+
+ def deserialize(self, f):
+ self.locator = CBlockLocator()
+ self.locator.deserialize(f)
+ self.hashstop = deser_uint256(f)
+
+ def serialize(self):
+ r = ""
+ r += self.locator.serialize()
+ r += ser_uint256(self.hashstop)
+ return r
+
+ def __repr__(self):
+ return "msg_getheaders(locator=%s, stop=%064x)" \
+ % (repr(self.locator), self.hashstop)
+
+
+# headers message has
+# <count> <vector of block headers>
+class msg_headers(object):
+ command = "headers"
+
+ def __init__(self):
+ self.headers = []
+
+ def deserialize(self, f):
+ # comment in bitcoind indicates these should be deserialized as blocks
+ blocks = deser_vector(f, CBlock)
+ for x in blocks:
+ self.headers.append(CBlockHeader(x))
+
+ def serialize(self):
+ blocks = [CBlock(x) for x in self.headers]
+ return ser_vector(blocks)
+
+ def __repr__(self):
+ return "msg_headers(headers=%s)" % repr(self.headers)
+
+
+class msg_reject(object):
+ command = "reject"
+
+ def __init__(self):
+ self.message = ""
+ self.code = ""
+ self.reason = ""
+ self.data = 0L
+
+ def deserialize(self, f):
+ self.message = deser_string(f)
+ self.code = struct.unpack("<B", f.read(1))[0]
+ self.reason = deser_string(f)
+ if (self.message == "block" or self.message == "tx"):
+ self.data = deser_uint256(f)
+
+ def serialize(self):
+ r = ser_string(self.message)
+ r += struct.pack("<B", self.code)
+ r += ser_string(self.reason)
+ if (self.message == "block" or self.message == "tx"):
+ r += ser_uint256(self.data)
+ return r
+
+ def __repr__(self):
+ return "msg_reject: %s %d %s [%064x]" \
+ % (self.message, self.code, self.reason, self.data)
+
+
+# This is what a callback should look like for NodeConn
+# Reimplement the on_* functions to provide handling for events
+class NodeConnCB(object):
+ def __init__(self):
+ self.verack_received = False
+
+ # Derived classes should call this function once to set the message map
+ # which associates the derived classes' functions to incoming messages
+ def create_callback_map(self):
+ self.cbmap = {
+ "version": self.on_version,
+ "verack": self.on_verack,
+ "addr": self.on_addr,
+ "alert": self.on_alert,
+ "inv": self.on_inv,
+ "getdata": self.on_getdata,
+ "getblocks": self.on_getblocks,
+ "tx": self.on_tx,
+ "block": self.on_block,
+ "getaddr": self.on_getaddr,
+ "ping": self.on_ping,
+ "pong": self.on_pong,
+ "headers": self.on_headers,
+ "getheaders": self.on_getheaders,
+ "reject": self.on_reject,
+ "mempool": self.on_mempool
+ }
+
+ def deliver(self, conn, message):
+ with mininode_lock:
+ try:
+ self.cbmap[message.command](conn, message)
+ except:
+ print "ERROR delivering %s (%s)" % (repr(message),
+ sys.exc_info()[0])
+
+ def on_version(self, conn, message):
+ if message.nVersion >= 209:
+ conn.send_message(msg_verack())
+ conn.ver_send = min(MY_VERSION, message.nVersion)
+ if message.nVersion < 209:
+ conn.ver_recv = conn.ver_send
+
+ def on_verack(self, conn, message):
+ conn.ver_recv = conn.ver_send
+ self.verack_received = True
+
+ def on_inv(self, conn, message):
+ want = msg_getdata()
+ for i in message.inv:
+ if i.type != 0:
+ want.inv.append(i)
+ if len(want.inv):
+ conn.send_message(want)
+
+ def on_addr(self, conn, message): pass
+ def on_alert(self, conn, message): pass
+ def on_getdata(self, conn, message): pass
+ def on_getblocks(self, conn, message): pass
+ def on_tx(self, conn, message): pass
+ def on_block(self, conn, message): pass
+ def on_getaddr(self, conn, message): pass
+ def on_headers(self, conn, message): pass
+ def on_getheaders(self, conn, message): pass
+ def on_ping(self, conn, message):
+ if conn.ver_send > BIP0031_VERSION:
+ conn.send_message(msg_pong(message.nonce))
+ def on_reject(self, conn, message): pass
+ def on_close(self, conn): pass
+ def on_mempool(self, conn): pass
+ def on_pong(self, conn, message): pass
+
+
+# The actual NodeConn class
+# This class provides an interface for a p2p connection to a specified node
+class NodeConn(asyncore.dispatcher):
+ messagemap = {
+ "version": msg_version,
+ "verack": msg_verack,
+ "addr": msg_addr,
+ "alert": msg_alert,
+ "inv": msg_inv,
+ "getdata": msg_getdata,
+ "getblocks": msg_getblocks,
+ "tx": msg_tx,
+ "block": msg_block,
+ "getaddr": msg_getaddr,
+ "ping": msg_ping,
+ "pong": msg_pong,
+ "headers": msg_headers,
+ "getheaders": msg_getheaders,
+ "reject": msg_reject,
+ "mempool": msg_mempool
+ }
+ MAGIC_BYTES = {
+ "mainnet": "\xf9\xbe\xb4\xd9", # mainnet
+ "testnet3": "\x0b\x11\x09\x07", # testnet3
+ "regtest": "\xfa\xbf\xb5\xda" # regtest
+ }
+
+ def __init__(self, dstaddr, dstport, rpc, callback, net="regtest"):
+ asyncore.dispatcher.__init__(self, map=mininode_socket_map)
+ self.log = logging.getLogger("NodeConn(%s:%d)" % (dstaddr, dstport))
+ self.dstaddr = dstaddr
+ self.dstport = dstport
+ self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.sendbuf = ""
+ self.recvbuf = ""
+ self.ver_send = 209
+ self.ver_recv = 209
+ self.last_sent = 0
+ self.state = "connecting"
+ self.network = net
+ self.cb = callback
+ self.disconnect = False
+
+ # stuff version msg into sendbuf
+ vt = msg_version()
+ vt.addrTo.ip = self.dstaddr
+ vt.addrTo.port = self.dstport
+ vt.addrFrom.ip = "0.0.0.0"
+ vt.addrFrom.port = 0
+ self.send_message(vt, True)
+ print 'MiniNode: Connecting to Bitcoin Node IP # ' + dstaddr + ':' \
+ + str(dstport)
+
+ try:
+ self.connect((dstaddr, dstport))
+ except:
+ self.handle_close()
+ self.rpc = rpc
+
+ def show_debug_msg(self, msg):
+ self.log.debug(msg)
+
+ def handle_connect(self):
+ self.show_debug_msg("MiniNode: Connected & Listening: \n")
+ self.state = "connected"
+
+ def handle_close(self):
+ self.show_debug_msg("MiniNode: Closing Connection to %s:%d... "
+ % (self.dstaddr, self.dstport))
+ self.state = "closed"
+ self.recvbuf = ""
+ self.sendbuf = ""
+ try:
+ self.close()
+ except:
+ pass
+ self.cb.on_close(self)
+
+ def handle_read(self):
+ try:
+ t = self.recv(8192)
+ if len(t) > 0:
+ self.recvbuf += t
+ self.got_data()
+ except:
+ pass
+
+ def readable(self):
+ return True
+
+ def writable(self):
+ with mininode_lock:
+ length = len(self.sendbuf)
+ return (length > 0)
+
+ def handle_write(self):
+ with mininode_lock:
+ try:
+ sent = self.send(self.sendbuf)
+ except:
+ self.handle_close()
+ return
+ self.sendbuf = self.sendbuf[sent:]
+
+ def got_data(self):
+ while True:
+ if len(self.recvbuf) < 4:
+ return
+ if self.recvbuf[:4] != self.MAGIC_BYTES[self.network]:
+ raise ValueError("got garbage %s" % repr(self.recvbuf))
+ if self.ver_recv < 209:
+ if len(self.recvbuf) < 4 + 12 + 4:
+ return
+ command = self.recvbuf[4:4+12].split("\x00", 1)[0]
+ msglen = struct.unpack("<i", self.recvbuf[4+12:4+12+4])[0]
+ checksum = None
+ if len(self.recvbuf) < 4 + 12 + 4 + msglen:
+ return
+ msg = self.recvbuf[4+12+4:4+12+4+msglen]
+ self.recvbuf = self.recvbuf[4+12+4+msglen:]
+ else:
+ if len(self.recvbuf) < 4 + 12 + 4 + 4:
+ return
+ command = self.recvbuf[4:4+12].split("\x00", 1)[0]
+ msglen = struct.unpack("<i", self.recvbuf[4+12:4+12+4])[0]
+ checksum = self.recvbuf[4+12+4:4+12+4+4]
+ if len(self.recvbuf) < 4 + 12 + 4 + 4 + msglen:
+ return
+ msg = self.recvbuf[4+12+4+4:4+12+4+4+msglen]
+ th = sha256(msg)
+ h = sha256(th)
+ if checksum != h[:4]:
+ raise ValueError("got bad checksum " + repr(self.recvbuf))
+ self.recvbuf = self.recvbuf[4+12+4+4+msglen:]
+ if command in self.messagemap:
+ f = cStringIO.StringIO(msg)
+ t = self.messagemap[command]()
+ t.deserialize(f)
+ self.got_message(t)
+ else:
+ self.show_debug_msg("Unknown command: '" + command + "' " +
+ repr(msg))
+
+ def send_message(self, message, pushbuf=False):
+ if self.state != "connected" and not pushbuf:
+ return
+ self.show_debug_msg("Send %s" % repr(message))
+ command = message.command
+ data = message.serialize()
+ tmsg = self.MAGIC_BYTES[self.network]
+ tmsg += command
+ tmsg += "\x00" * (12 - len(command))
+ tmsg += struct.pack("<I", len(data))
+ if self.ver_send >= 209:
+ th = sha256(data)
+ h = sha256(th)
+ tmsg += h[:4]
+ tmsg += data
+ with mininode_lock:
+ self.sendbuf += tmsg
+ self.last_sent = time.time()
+
+ def got_message(self, message):
+ if message.command == "version":
+ if message.nVersion <= BIP0031_VERSION:
+ self.messagemap['ping'] = msg_ping_prebip31
+ if self.last_sent + 30 * 60 < time.time():
+ self.send_message(self.messagemap['ping']())
+ self.show_debug_msg("Recv %s" % repr(message))
+ self.cb.deliver(self, message)
+
+ def disconnect_node(self):
+ self.disconnect = True
+
+
+class NetworkThread(Thread):
+ def run(self):
+ while mininode_socket_map:
+ # We check for whether to disconnect outside of the asyncore
+ # loop to workaround the behavior of asyncore when using
+ # select
+ disconnected = []
+ for fd, obj in mininode_socket_map.items():
+ if obj.disconnect:
+ disconnected.append(obj)
+ [ obj.handle_close() for obj in disconnected ]
+ asyncore.loop(0.1, use_poll=True, map=mininode_socket_map, count=1)
+
+
+# An exception we can raise if we detect a potential disconnect
+# (p2p or rpc) before the test is complete
+class EarlyDisconnectError(Exception):
+ def __init__(self, value):
+ self.value = value
+
+ def __str__(self):
+ return repr(self.value)
diff --git a/qa/rpc-tests/netutil.py b/qa/rpc-tests/test_framework/netutil.py
index b30a88a4f7..b30a88a4f7 100644
--- a/qa/rpc-tests/netutil.py
+++ b/qa/rpc-tests/test_framework/netutil.py
diff --git a/qa/rpc-tests/test_framework/script.py b/qa/rpc-tests/test_framework/script.py
new file mode 100644
index 0000000000..e37ab5d45a
--- /dev/null
+++ b/qa/rpc-tests/test_framework/script.py
@@ -0,0 +1,896 @@
+#
+# script.py
+#
+# This file is modified from python-bitcoinlib.
+#
+# Distributed under the MIT/X11 software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#
+
+"""Scripts
+
+Functionality to build scripts, as well as SignatureHash().
+"""
+
+from __future__ import absolute_import, division, print_function, unicode_literals
+
+from test_framework.mininode import CTransaction, CTxOut, hash256
+
+import sys
+bchr = chr
+bord = ord
+if sys.version > '3':
+ long = int
+ bchr = lambda x: bytes([x])
+ bord = lambda x: x
+
+import copy
+import struct
+
+import test_framework.bignum
+
+MAX_SCRIPT_SIZE = 10000
+MAX_SCRIPT_ELEMENT_SIZE = 520
+MAX_SCRIPT_OPCODES = 201
+
+OPCODE_NAMES = {}
+
+_opcode_instances = []
+class CScriptOp(int):
+ """A single script opcode"""
+ __slots__ = []
+
+ @staticmethod
+ def encode_op_pushdata(d):
+ """Encode a PUSHDATA op, returning bytes"""
+ if len(d) < 0x4c:
+ return b'' + bchr(len(d)) + d # OP_PUSHDATA
+ elif len(d) <= 0xff:
+ return b'\x4c' + bchr(len(d)) + d # OP_PUSHDATA1
+ elif len(d) <= 0xffff:
+ return b'\x4d' + struct.pack(b'<H', len(d)) + d # OP_PUSHDATA2
+ elif len(d) <= 0xffffffff:
+ return b'\x4e' + struct.pack(b'<I', len(d)) + d # OP_PUSHDATA4
+ else:
+ raise ValueError("Data too long to encode in a PUSHDATA op")
+
+ @staticmethod
+ def encode_op_n(n):
+ """Encode a small integer op, returning an opcode"""
+ if not (0 <= n <= 16):
+ raise ValueError('Integer must be in range 0 <= n <= 16, got %d' % n)
+
+ if n == 0:
+ return OP_0
+ else:
+ return CScriptOp(OP_1 + n-1)
+
+ def decode_op_n(self):
+ """Decode a small integer opcode, returning an integer"""
+ if self == OP_0:
+ return 0
+
+ if not (self == OP_0 or OP_1 <= self <= OP_16):
+ raise ValueError('op %r is not an OP_N' % self)
+
+ return int(self - OP_1+1)
+
+ def is_small_int(self):
+ """Return true if the op pushes a small integer to the stack"""
+ if 0x51 <= self <= 0x60 or self == 0:
+ return True
+ else:
+ return False
+
+ def __str__(self):
+ return repr(self)
+
+ def __repr__(self):
+ if self in OPCODE_NAMES:
+ return OPCODE_NAMES[self]
+ else:
+ return 'CScriptOp(0x%x)' % self
+
+ def __new__(cls, n):
+ try:
+ return _opcode_instances[n]
+ except IndexError:
+ assert len(_opcode_instances) == n
+ _opcode_instances.append(super(CScriptOp, cls).__new__(cls, n))
+ return _opcode_instances[n]
+
+# Populate opcode instance table
+for n in range(0xff+1):
+ CScriptOp(n)
+
+
+# push value
+OP_0 = CScriptOp(0x00)
+OP_FALSE = OP_0
+OP_PUSHDATA1 = CScriptOp(0x4c)
+OP_PUSHDATA2 = CScriptOp(0x4d)
+OP_PUSHDATA4 = CScriptOp(0x4e)
+OP_1NEGATE = CScriptOp(0x4f)
+OP_RESERVED = CScriptOp(0x50)
+OP_1 = CScriptOp(0x51)
+OP_TRUE=OP_1
+OP_2 = CScriptOp(0x52)
+OP_3 = CScriptOp(0x53)
+OP_4 = CScriptOp(0x54)
+OP_5 = CScriptOp(0x55)
+OP_6 = CScriptOp(0x56)
+OP_7 = CScriptOp(0x57)
+OP_8 = CScriptOp(0x58)
+OP_9 = CScriptOp(0x59)
+OP_10 = CScriptOp(0x5a)
+OP_11 = CScriptOp(0x5b)
+OP_12 = CScriptOp(0x5c)
+OP_13 = CScriptOp(0x5d)
+OP_14 = CScriptOp(0x5e)
+OP_15 = CScriptOp(0x5f)
+OP_16 = CScriptOp(0x60)
+
+# control
+OP_NOP = CScriptOp(0x61)
+OP_VER = CScriptOp(0x62)
+OP_IF = CScriptOp(0x63)
+OP_NOTIF = CScriptOp(0x64)
+OP_VERIF = CScriptOp(0x65)
+OP_VERNOTIF = CScriptOp(0x66)
+OP_ELSE = CScriptOp(0x67)
+OP_ENDIF = CScriptOp(0x68)
+OP_VERIFY = CScriptOp(0x69)
+OP_RETURN = CScriptOp(0x6a)
+
+# stack ops
+OP_TOALTSTACK = CScriptOp(0x6b)
+OP_FROMALTSTACK = CScriptOp(0x6c)
+OP_2DROP = CScriptOp(0x6d)
+OP_2DUP = CScriptOp(0x6e)
+OP_3DUP = CScriptOp(0x6f)
+OP_2OVER = CScriptOp(0x70)
+OP_2ROT = CScriptOp(0x71)
+OP_2SWAP = CScriptOp(0x72)
+OP_IFDUP = CScriptOp(0x73)
+OP_DEPTH = CScriptOp(0x74)
+OP_DROP = CScriptOp(0x75)
+OP_DUP = CScriptOp(0x76)
+OP_NIP = CScriptOp(0x77)
+OP_OVER = CScriptOp(0x78)
+OP_PICK = CScriptOp(0x79)
+OP_ROLL = CScriptOp(0x7a)
+OP_ROT = CScriptOp(0x7b)
+OP_SWAP = CScriptOp(0x7c)
+OP_TUCK = CScriptOp(0x7d)
+
+# splice ops
+OP_CAT = CScriptOp(0x7e)
+OP_SUBSTR = CScriptOp(0x7f)
+OP_LEFT = CScriptOp(0x80)
+OP_RIGHT = CScriptOp(0x81)
+OP_SIZE = CScriptOp(0x82)
+
+# bit logic
+OP_INVERT = CScriptOp(0x83)
+OP_AND = CScriptOp(0x84)
+OP_OR = CScriptOp(0x85)
+OP_XOR = CScriptOp(0x86)
+OP_EQUAL = CScriptOp(0x87)
+OP_EQUALVERIFY = CScriptOp(0x88)
+OP_RESERVED1 = CScriptOp(0x89)
+OP_RESERVED2 = CScriptOp(0x8a)
+
+# numeric
+OP_1ADD = CScriptOp(0x8b)
+OP_1SUB = CScriptOp(0x8c)
+OP_2MUL = CScriptOp(0x8d)
+OP_2DIV = CScriptOp(0x8e)
+OP_NEGATE = CScriptOp(0x8f)
+OP_ABS = CScriptOp(0x90)
+OP_NOT = CScriptOp(0x91)
+OP_0NOTEQUAL = CScriptOp(0x92)
+
+OP_ADD = CScriptOp(0x93)
+OP_SUB = CScriptOp(0x94)
+OP_MUL = CScriptOp(0x95)
+OP_DIV = CScriptOp(0x96)
+OP_MOD = CScriptOp(0x97)
+OP_LSHIFT = CScriptOp(0x98)
+OP_RSHIFT = CScriptOp(0x99)
+
+OP_BOOLAND = CScriptOp(0x9a)
+OP_BOOLOR = CScriptOp(0x9b)
+OP_NUMEQUAL = CScriptOp(0x9c)
+OP_NUMEQUALVERIFY = CScriptOp(0x9d)
+OP_NUMNOTEQUAL = CScriptOp(0x9e)
+OP_LESSTHAN = CScriptOp(0x9f)
+OP_GREATERTHAN = CScriptOp(0xa0)
+OP_LESSTHANOREQUAL = CScriptOp(0xa1)
+OP_GREATERTHANOREQUAL = CScriptOp(0xa2)
+OP_MIN = CScriptOp(0xa3)
+OP_MAX = CScriptOp(0xa4)
+
+OP_WITHIN = CScriptOp(0xa5)
+
+# crypto
+OP_RIPEMD160 = CScriptOp(0xa6)
+OP_SHA1 = CScriptOp(0xa7)
+OP_SHA256 = CScriptOp(0xa8)
+OP_HASH160 = CScriptOp(0xa9)
+OP_HASH256 = CScriptOp(0xaa)
+OP_CODESEPARATOR = CScriptOp(0xab)
+OP_CHECKSIG = CScriptOp(0xac)
+OP_CHECKSIGVERIFY = CScriptOp(0xad)
+OP_CHECKMULTISIG = CScriptOp(0xae)
+OP_CHECKMULTISIGVERIFY = CScriptOp(0xaf)
+
+# expansion
+OP_NOP1 = CScriptOp(0xb0)
+OP_NOP2 = CScriptOp(0xb1)
+OP_NOP3 = CScriptOp(0xb2)
+OP_NOP4 = CScriptOp(0xb3)
+OP_NOP5 = CScriptOp(0xb4)
+OP_NOP6 = CScriptOp(0xb5)
+OP_NOP7 = CScriptOp(0xb6)
+OP_NOP8 = CScriptOp(0xb7)
+OP_NOP9 = CScriptOp(0xb8)
+OP_NOP10 = CScriptOp(0xb9)
+
+# template matching params
+OP_SMALLINTEGER = CScriptOp(0xfa)
+OP_PUBKEYS = CScriptOp(0xfb)
+OP_PUBKEYHASH = CScriptOp(0xfd)
+OP_PUBKEY = CScriptOp(0xfe)
+
+OP_INVALIDOPCODE = CScriptOp(0xff)
+
+VALID_OPCODES = {
+ OP_1NEGATE,
+ OP_RESERVED,
+ OP_1,
+ OP_2,
+ OP_3,
+ OP_4,
+ OP_5,
+ OP_6,
+ OP_7,
+ OP_8,
+ OP_9,
+ OP_10,
+ OP_11,
+ OP_12,
+ OP_13,
+ OP_14,
+ OP_15,
+ OP_16,
+
+ OP_NOP,
+ OP_VER,
+ OP_IF,
+ OP_NOTIF,
+ OP_VERIF,
+ OP_VERNOTIF,
+ OP_ELSE,
+ OP_ENDIF,
+ OP_VERIFY,
+ OP_RETURN,
+
+ OP_TOALTSTACK,
+ OP_FROMALTSTACK,
+ OP_2DROP,
+ OP_2DUP,
+ OP_3DUP,
+ OP_2OVER,
+ OP_2ROT,
+ OP_2SWAP,
+ OP_IFDUP,
+ OP_DEPTH,
+ OP_DROP,
+ OP_DUP,
+ OP_NIP,
+ OP_OVER,
+ OP_PICK,
+ OP_ROLL,
+ OP_ROT,
+ OP_SWAP,
+ OP_TUCK,
+
+ OP_CAT,
+ OP_SUBSTR,
+ OP_LEFT,
+ OP_RIGHT,
+ OP_SIZE,
+
+ OP_INVERT,
+ OP_AND,
+ OP_OR,
+ OP_XOR,
+ OP_EQUAL,
+ OP_EQUALVERIFY,
+ OP_RESERVED1,
+ OP_RESERVED2,
+
+ OP_1ADD,
+ OP_1SUB,
+ OP_2MUL,
+ OP_2DIV,
+ OP_NEGATE,
+ OP_ABS,
+ OP_NOT,
+ OP_0NOTEQUAL,
+
+ OP_ADD,
+ OP_SUB,
+ OP_MUL,
+ OP_DIV,
+ OP_MOD,
+ OP_LSHIFT,
+ OP_RSHIFT,
+
+ OP_BOOLAND,
+ OP_BOOLOR,
+ OP_NUMEQUAL,
+ OP_NUMEQUALVERIFY,
+ OP_NUMNOTEQUAL,
+ OP_LESSTHAN,
+ OP_GREATERTHAN,
+ OP_LESSTHANOREQUAL,
+ OP_GREATERTHANOREQUAL,
+ OP_MIN,
+ OP_MAX,
+
+ OP_WITHIN,
+
+ OP_RIPEMD160,
+ OP_SHA1,
+ OP_SHA256,
+ OP_HASH160,
+ OP_HASH256,
+ OP_CODESEPARATOR,
+ OP_CHECKSIG,
+ OP_CHECKSIGVERIFY,
+ OP_CHECKMULTISIG,
+ OP_CHECKMULTISIGVERIFY,
+
+ OP_NOP1,
+ OP_NOP2,
+ OP_NOP3,
+ OP_NOP4,
+ OP_NOP5,
+ OP_NOP6,
+ OP_NOP7,
+ OP_NOP8,
+ OP_NOP9,
+ OP_NOP10,
+
+ OP_SMALLINTEGER,
+ OP_PUBKEYS,
+ OP_PUBKEYHASH,
+ OP_PUBKEY,
+}
+
+OPCODE_NAMES.update({
+ OP_0 : 'OP_0',
+ OP_PUSHDATA1 : 'OP_PUSHDATA1',
+ OP_PUSHDATA2 : 'OP_PUSHDATA2',
+ OP_PUSHDATA4 : 'OP_PUSHDATA4',
+ OP_1NEGATE : 'OP_1NEGATE',
+ OP_RESERVED : 'OP_RESERVED',
+ OP_1 : 'OP_1',
+ OP_2 : 'OP_2',
+ OP_3 : 'OP_3',
+ OP_4 : 'OP_4',
+ OP_5 : 'OP_5',
+ OP_6 : 'OP_6',
+ OP_7 : 'OP_7',
+ OP_8 : 'OP_8',
+ OP_9 : 'OP_9',
+ OP_10 : 'OP_10',
+ OP_11 : 'OP_11',
+ OP_12 : 'OP_12',
+ OP_13 : 'OP_13',
+ OP_14 : 'OP_14',
+ OP_15 : 'OP_15',
+ OP_16 : 'OP_16',
+ OP_NOP : 'OP_NOP',
+ OP_VER : 'OP_VER',
+ OP_IF : 'OP_IF',
+ OP_NOTIF : 'OP_NOTIF',
+ OP_VERIF : 'OP_VERIF',
+ OP_VERNOTIF : 'OP_VERNOTIF',
+ OP_ELSE : 'OP_ELSE',
+ OP_ENDIF : 'OP_ENDIF',
+ OP_VERIFY : 'OP_VERIFY',
+ OP_RETURN : 'OP_RETURN',
+ OP_TOALTSTACK : 'OP_TOALTSTACK',
+ OP_FROMALTSTACK : 'OP_FROMALTSTACK',
+ OP_2DROP : 'OP_2DROP',
+ OP_2DUP : 'OP_2DUP',
+ OP_3DUP : 'OP_3DUP',
+ OP_2OVER : 'OP_2OVER',
+ OP_2ROT : 'OP_2ROT',
+ OP_2SWAP : 'OP_2SWAP',
+ OP_IFDUP : 'OP_IFDUP',
+ OP_DEPTH : 'OP_DEPTH',
+ OP_DROP : 'OP_DROP',
+ OP_DUP : 'OP_DUP',
+ OP_NIP : 'OP_NIP',
+ OP_OVER : 'OP_OVER',
+ OP_PICK : 'OP_PICK',
+ OP_ROLL : 'OP_ROLL',
+ OP_ROT : 'OP_ROT',
+ OP_SWAP : 'OP_SWAP',
+ OP_TUCK : 'OP_TUCK',
+ OP_CAT : 'OP_CAT',
+ OP_SUBSTR : 'OP_SUBSTR',
+ OP_LEFT : 'OP_LEFT',
+ OP_RIGHT : 'OP_RIGHT',
+ OP_SIZE : 'OP_SIZE',
+ OP_INVERT : 'OP_INVERT',
+ OP_AND : 'OP_AND',
+ OP_OR : 'OP_OR',
+ OP_XOR : 'OP_XOR',
+ OP_EQUAL : 'OP_EQUAL',
+ OP_EQUALVERIFY : 'OP_EQUALVERIFY',
+ OP_RESERVED1 : 'OP_RESERVED1',
+ OP_RESERVED2 : 'OP_RESERVED2',
+ OP_1ADD : 'OP_1ADD',
+ OP_1SUB : 'OP_1SUB',
+ OP_2MUL : 'OP_2MUL',
+ OP_2DIV : 'OP_2DIV',
+ OP_NEGATE : 'OP_NEGATE',
+ OP_ABS : 'OP_ABS',
+ OP_NOT : 'OP_NOT',
+ OP_0NOTEQUAL : 'OP_0NOTEQUAL',
+ OP_ADD : 'OP_ADD',
+ OP_SUB : 'OP_SUB',
+ OP_MUL : 'OP_MUL',
+ OP_DIV : 'OP_DIV',
+ OP_MOD : 'OP_MOD',
+ OP_LSHIFT : 'OP_LSHIFT',
+ OP_RSHIFT : 'OP_RSHIFT',
+ OP_BOOLAND : 'OP_BOOLAND',
+ OP_BOOLOR : 'OP_BOOLOR',
+ OP_NUMEQUAL : 'OP_NUMEQUAL',
+ OP_NUMEQUALVERIFY : 'OP_NUMEQUALVERIFY',
+ OP_NUMNOTEQUAL : 'OP_NUMNOTEQUAL',
+ OP_LESSTHAN : 'OP_LESSTHAN',
+ OP_GREATERTHAN : 'OP_GREATERTHAN',
+ OP_LESSTHANOREQUAL : 'OP_LESSTHANOREQUAL',
+ OP_GREATERTHANOREQUAL : 'OP_GREATERTHANOREQUAL',
+ OP_MIN : 'OP_MIN',
+ OP_MAX : 'OP_MAX',
+ OP_WITHIN : 'OP_WITHIN',
+ OP_RIPEMD160 : 'OP_RIPEMD160',
+ OP_SHA1 : 'OP_SHA1',
+ OP_SHA256 : 'OP_SHA256',
+ OP_HASH160 : 'OP_HASH160',
+ OP_HASH256 : 'OP_HASH256',
+ OP_CODESEPARATOR : 'OP_CODESEPARATOR',
+ OP_CHECKSIG : 'OP_CHECKSIG',
+ OP_CHECKSIGVERIFY : 'OP_CHECKSIGVERIFY',
+ OP_CHECKMULTISIG : 'OP_CHECKMULTISIG',
+ OP_CHECKMULTISIGVERIFY : 'OP_CHECKMULTISIGVERIFY',
+ OP_NOP1 : 'OP_NOP1',
+ OP_NOP2 : 'OP_NOP2',
+ OP_NOP3 : 'OP_NOP3',
+ OP_NOP4 : 'OP_NOP4',
+ OP_NOP5 : 'OP_NOP5',
+ OP_NOP6 : 'OP_NOP6',
+ OP_NOP7 : 'OP_NOP7',
+ OP_NOP8 : 'OP_NOP8',
+ OP_NOP9 : 'OP_NOP9',
+ OP_NOP10 : 'OP_NOP10',
+ OP_SMALLINTEGER : 'OP_SMALLINTEGER',
+ OP_PUBKEYS : 'OP_PUBKEYS',
+ OP_PUBKEYHASH : 'OP_PUBKEYHASH',
+ OP_PUBKEY : 'OP_PUBKEY',
+ OP_INVALIDOPCODE : 'OP_INVALIDOPCODE',
+})
+
+OPCODES_BY_NAME = {
+ 'OP_0' : OP_0,
+ 'OP_PUSHDATA1' : OP_PUSHDATA1,
+ 'OP_PUSHDATA2' : OP_PUSHDATA2,
+ 'OP_PUSHDATA4' : OP_PUSHDATA4,
+ 'OP_1NEGATE' : OP_1NEGATE,
+ 'OP_RESERVED' : OP_RESERVED,
+ 'OP_1' : OP_1,
+ 'OP_2' : OP_2,
+ 'OP_3' : OP_3,
+ 'OP_4' : OP_4,
+ 'OP_5' : OP_5,
+ 'OP_6' : OP_6,
+ 'OP_7' : OP_7,
+ 'OP_8' : OP_8,
+ 'OP_9' : OP_9,
+ 'OP_10' : OP_10,
+ 'OP_11' : OP_11,
+ 'OP_12' : OP_12,
+ 'OP_13' : OP_13,
+ 'OP_14' : OP_14,
+ 'OP_15' : OP_15,
+ 'OP_16' : OP_16,
+ 'OP_NOP' : OP_NOP,
+ 'OP_VER' : OP_VER,
+ 'OP_IF' : OP_IF,
+ 'OP_NOTIF' : OP_NOTIF,
+ 'OP_VERIF' : OP_VERIF,
+ 'OP_VERNOTIF' : OP_VERNOTIF,
+ 'OP_ELSE' : OP_ELSE,
+ 'OP_ENDIF' : OP_ENDIF,
+ 'OP_VERIFY' : OP_VERIFY,
+ 'OP_RETURN' : OP_RETURN,
+ 'OP_TOALTSTACK' : OP_TOALTSTACK,
+ 'OP_FROMALTSTACK' : OP_FROMALTSTACK,
+ 'OP_2DROP' : OP_2DROP,
+ 'OP_2DUP' : OP_2DUP,
+ 'OP_3DUP' : OP_3DUP,
+ 'OP_2OVER' : OP_2OVER,
+ 'OP_2ROT' : OP_2ROT,
+ 'OP_2SWAP' : OP_2SWAP,
+ 'OP_IFDUP' : OP_IFDUP,
+ 'OP_DEPTH' : OP_DEPTH,
+ 'OP_DROP' : OP_DROP,
+ 'OP_DUP' : OP_DUP,
+ 'OP_NIP' : OP_NIP,
+ 'OP_OVER' : OP_OVER,
+ 'OP_PICK' : OP_PICK,
+ 'OP_ROLL' : OP_ROLL,
+ 'OP_ROT' : OP_ROT,
+ 'OP_SWAP' : OP_SWAP,
+ 'OP_TUCK' : OP_TUCK,
+ 'OP_CAT' : OP_CAT,
+ 'OP_SUBSTR' : OP_SUBSTR,
+ 'OP_LEFT' : OP_LEFT,
+ 'OP_RIGHT' : OP_RIGHT,
+ 'OP_SIZE' : OP_SIZE,
+ 'OP_INVERT' : OP_INVERT,
+ 'OP_AND' : OP_AND,
+ 'OP_OR' : OP_OR,
+ 'OP_XOR' : OP_XOR,
+ 'OP_EQUAL' : OP_EQUAL,
+ 'OP_EQUALVERIFY' : OP_EQUALVERIFY,
+ 'OP_RESERVED1' : OP_RESERVED1,
+ 'OP_RESERVED2' : OP_RESERVED2,
+ 'OP_1ADD' : OP_1ADD,
+ 'OP_1SUB' : OP_1SUB,
+ 'OP_2MUL' : OP_2MUL,
+ 'OP_2DIV' : OP_2DIV,
+ 'OP_NEGATE' : OP_NEGATE,
+ 'OP_ABS' : OP_ABS,
+ 'OP_NOT' : OP_NOT,
+ 'OP_0NOTEQUAL' : OP_0NOTEQUAL,
+ 'OP_ADD' : OP_ADD,
+ 'OP_SUB' : OP_SUB,
+ 'OP_MUL' : OP_MUL,
+ 'OP_DIV' : OP_DIV,
+ 'OP_MOD' : OP_MOD,
+ 'OP_LSHIFT' : OP_LSHIFT,
+ 'OP_RSHIFT' : OP_RSHIFT,
+ 'OP_BOOLAND' : OP_BOOLAND,
+ 'OP_BOOLOR' : OP_BOOLOR,
+ 'OP_NUMEQUAL' : OP_NUMEQUAL,
+ 'OP_NUMEQUALVERIFY' : OP_NUMEQUALVERIFY,
+ 'OP_NUMNOTEQUAL' : OP_NUMNOTEQUAL,
+ 'OP_LESSTHAN' : OP_LESSTHAN,
+ 'OP_GREATERTHAN' : OP_GREATERTHAN,
+ 'OP_LESSTHANOREQUAL' : OP_LESSTHANOREQUAL,
+ 'OP_GREATERTHANOREQUAL' : OP_GREATERTHANOREQUAL,
+ 'OP_MIN' : OP_MIN,
+ 'OP_MAX' : OP_MAX,
+ 'OP_WITHIN' : OP_WITHIN,
+ 'OP_RIPEMD160' : OP_RIPEMD160,
+ 'OP_SHA1' : OP_SHA1,
+ 'OP_SHA256' : OP_SHA256,
+ 'OP_HASH160' : OP_HASH160,
+ 'OP_HASH256' : OP_HASH256,
+ 'OP_CODESEPARATOR' : OP_CODESEPARATOR,
+ 'OP_CHECKSIG' : OP_CHECKSIG,
+ 'OP_CHECKSIGVERIFY' : OP_CHECKSIGVERIFY,
+ 'OP_CHECKMULTISIG' : OP_CHECKMULTISIG,
+ 'OP_CHECKMULTISIGVERIFY' : OP_CHECKMULTISIGVERIFY,
+ 'OP_NOP1' : OP_NOP1,
+ 'OP_NOP2' : OP_NOP2,
+ 'OP_NOP3' : OP_NOP3,
+ 'OP_NOP4' : OP_NOP4,
+ 'OP_NOP5' : OP_NOP5,
+ 'OP_NOP6' : OP_NOP6,
+ 'OP_NOP7' : OP_NOP7,
+ 'OP_NOP8' : OP_NOP8,
+ 'OP_NOP9' : OP_NOP9,
+ 'OP_NOP10' : OP_NOP10,
+ 'OP_SMALLINTEGER' : OP_SMALLINTEGER,
+ 'OP_PUBKEYS' : OP_PUBKEYS,
+ 'OP_PUBKEYHASH' : OP_PUBKEYHASH,
+ 'OP_PUBKEY' : OP_PUBKEY,
+}
+
+class CScriptInvalidError(Exception):
+ """Base class for CScript exceptions"""
+ pass
+
+class CScriptTruncatedPushDataError(CScriptInvalidError):
+ """Invalid pushdata due to truncation"""
+ def __init__(self, msg, data):
+ self.data = data
+ super(CScriptTruncatedPushDataError, self).__init__(msg)
+
+# This is used, eg, for blockchain heights in coinbase scripts (bip34)
+class CScriptNum(object):
+ def __init__(self, d=0):
+ self.value = d
+
+ @staticmethod
+ def encode(obj):
+ r = bytearray(0)
+ if obj.value == 0:
+ return bytes(r)
+ neg = obj.value < 0
+ absvalue = -obj.value if neg else obj.value
+ while (absvalue):
+ r.append(chr(absvalue & 0xff))
+ absvalue >>= 8
+ if r[-1] & 0x80:
+ r.append(0x80 if neg else 0)
+ elif neg:
+ r[-1] |= 0x80
+ return bytes(bchr(len(r)) + r)
+
+
+class CScript(bytes):
+ """Serialized script
+
+ A bytes subclass, so you can use this directly whenever bytes are accepted.
+ Note that this means that indexing does *not* work - you'll get an index by
+ byte rather than opcode. This format was chosen for efficiency so that the
+ general case would not require creating a lot of little CScriptOP objects.
+
+ iter(script) however does iterate by opcode.
+ """
+ @classmethod
+ def __coerce_instance(cls, other):
+ # Coerce other into bytes
+ if isinstance(other, CScriptOp):
+ other = bchr(other)
+ elif isinstance(other, CScriptNum):
+ if (other.value == 0):
+ other = bchr(CScriptOp(OP_0))
+ else:
+ other = CScriptNum.encode(other)
+ elif isinstance(other, (int, long)):
+ if 0 <= other <= 16:
+ other = bytes(bchr(CScriptOp.encode_op_n(other)))
+ elif other == -1:
+ other = bytes(bchr(OP_1NEGATE))
+ else:
+ other = CScriptOp.encode_op_pushdata(bignum.bn2vch(other))
+ elif isinstance(other, (bytes, bytearray)):
+ other = CScriptOp.encode_op_pushdata(other)
+ return other
+
+ def __add__(self, other):
+ # Do the coercion outside of the try block so that errors in it are
+ # noticed.
+ other = self.__coerce_instance(other)
+
+ try:
+ # bytes.__add__ always returns bytes instances unfortunately
+ return CScript(super(CScript, self).__add__(other))
+ except TypeError:
+ raise TypeError('Can not add a %r instance to a CScript' % other.__class__)
+
+ def join(self, iterable):
+ # join makes no sense for a CScript()
+ raise NotImplementedError
+
+ def __new__(cls, value=b''):
+ if isinstance(value, bytes) or isinstance(value, bytearray):
+ return super(CScript, cls).__new__(cls, value)
+ else:
+ def coerce_iterable(iterable):
+ for instance in iterable:
+ yield cls.__coerce_instance(instance)
+ # Annoyingly on both python2 and python3 bytes.join() always
+ # returns a bytes instance even when subclassed.
+ return super(CScript, cls).__new__(cls, b''.join(coerce_iterable(value)))
+
+ def raw_iter(self):
+ """Raw iteration
+
+ Yields tuples of (opcode, data, sop_idx) so that the different possible
+ PUSHDATA encodings can be accurately distinguished, as well as
+ determining the exact opcode byte indexes. (sop_idx)
+ """
+ i = 0
+ while i < len(self):
+ sop_idx = i
+ opcode = bord(self[i])
+ i += 1
+
+ if opcode > OP_PUSHDATA4:
+ yield (opcode, None, sop_idx)
+ else:
+ datasize = None
+ pushdata_type = None
+ if opcode < OP_PUSHDATA1:
+ pushdata_type = 'PUSHDATA(%d)' % opcode
+ datasize = opcode
+
+ elif opcode == OP_PUSHDATA1:
+ pushdata_type = 'PUSHDATA1'
+ if i >= len(self):
+ raise CScriptInvalidError('PUSHDATA1: missing data length')
+ datasize = bord(self[i])
+ i += 1
+
+ elif opcode == OP_PUSHDATA2:
+ pushdata_type = 'PUSHDATA2'
+ if i + 1 >= len(self):
+ raise CScriptInvalidError('PUSHDATA2: missing data length')
+ datasize = bord(self[i]) + (bord(self[i+1]) << 8)
+ i += 2
+
+ elif opcode == OP_PUSHDATA4:
+ pushdata_type = 'PUSHDATA4'
+ if i + 3 >= len(self):
+ raise CScriptInvalidError('PUSHDATA4: missing data length')
+ datasize = bord(self[i]) + (bord(self[i+1]) << 8) + (bord(self[i+2]) << 16) + (bord(self[i+3]) << 24)
+ i += 4
+
+ else:
+ assert False # shouldn't happen
+
+
+ data = bytes(self[i:i+datasize])
+
+ # Check for truncation
+ if len(data) < datasize:
+ raise CScriptTruncatedPushDataError('%s: truncated data' % pushdata_type, data)
+
+ i += datasize
+
+ yield (opcode, data, sop_idx)
+
+ def __iter__(self):
+ """'Cooked' iteration
+
+ Returns either a CScriptOP instance, an integer, or bytes, as
+ appropriate.
+
+ See raw_iter() if you need to distinguish the different possible
+ PUSHDATA encodings.
+ """
+ for (opcode, data, sop_idx) in self.raw_iter():
+ if data is not None:
+ yield data
+ else:
+ opcode = CScriptOp(opcode)
+
+ if opcode.is_small_int():
+ yield opcode.decode_op_n()
+ else:
+ yield CScriptOp(opcode)
+
+ def __repr__(self):
+ # For Python3 compatibility add b before strings so testcases don't
+ # need to change
+ def _repr(o):
+ if isinstance(o, bytes):
+ return "x('%s')" % binascii.hexlify(o).decode('utf8')
+ else:
+ return repr(o)
+
+ ops = []
+ i = iter(self)
+ while True:
+ op = None
+ try:
+ op = _repr(next(i))
+ except CScriptTruncatedPushDataError as err:
+ op = '%s...<ERROR: %s>' % (_repr(err.data), err)
+ break
+ except CScriptInvalidError as err:
+ op = '<ERROR: %s>' % err
+ break
+ except StopIteration:
+ break
+ finally:
+ if op is not None:
+ ops.append(op)
+
+ return "CScript([%s])" % ', '.join(ops)
+
+ def GetSigOpCount(self, fAccurate):
+ """Get the SigOp count.
+
+ fAccurate - Accurately count CHECKMULTISIG, see BIP16 for details.
+
+ Note that this is consensus-critical.
+ """
+ n = 0
+ lastOpcode = OP_INVALIDOPCODE
+ for (opcode, data, sop_idx) in self.raw_iter():
+ if opcode in (OP_CHECKSIG, OP_CHECKSIGVERIFY):
+ n += 1
+ elif opcode in (OP_CHECKMULTISIG, OP_CHECKMULTISIGVERIFY):
+ if fAccurate and (OP_1 <= lastOpcode <= OP_16):
+ n += opcode.decode_op_n()
+ else:
+ n += 20
+ lastOpcode = opcode
+ return n
+
+
+SIGHASH_ALL = 1
+SIGHASH_NONE = 2
+SIGHASH_SINGLE = 3
+SIGHASH_ANYONECANPAY = 0x80
+
+def FindAndDelete(script, sig):
+ """Consensus critical, see FindAndDelete() in Satoshi codebase"""
+ r = b''
+ last_sop_idx = sop_idx = 0
+ skip = True
+ for (opcode, data, sop_idx) in script.raw_iter():
+ if not skip:
+ r += script[last_sop_idx:sop_idx]
+ last_sop_idx = sop_idx
+ if script[sop_idx:sop_idx + len(sig)] == sig:
+ skip = True
+ else:
+ skip = False
+ if not skip:
+ r += script[last_sop_idx:]
+ return CScript(r)
+
+
+def SignatureHash(script, txTo, inIdx, hashtype):
+ """Consensus-correct SignatureHash
+
+ Returns (hash, err) to precisely match the consensus-critical behavior of
+ the SIGHASH_SINGLE bug. (inIdx is *not* checked for validity)
+ """
+ HASH_ONE = b'\x01\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'
+
+ if inIdx >= len(txTo.vin):
+ return (HASH_ONE, "inIdx %d out of range (%d)" % (inIdx, len(txTo.vin)))
+ txtmp = CTransaction(txTo)
+
+ for txin in txtmp.vin:
+ txin.scriptSig = b''
+ txtmp.vin[inIdx].scriptSig = FindAndDelete(script, CScript([OP_CODESEPARATOR]))
+
+ if (hashtype & 0x1f) == SIGHASH_NONE:
+ txtmp.vout = []
+
+ for i in range(len(txtmp.vin)):
+ if i != inIdx:
+ txtmp.vin[i].nSequence = 0
+
+ elif (hashtype & 0x1f) == SIGHASH_SINGLE:
+ outIdx = inIdx
+ if outIdx >= len(txtmp.vout):
+ return (HASH_ONE, "outIdx %d out of range (%d)" % (outIdx, len(txtmp.vout)))
+
+ tmp = txtmp.vout[outIdx]
+ txtmp.vout = []
+ for i in range(outIdx):
+ txtmp.vout.append(CTxOut())
+ txtmp.vout.append(tmp)
+
+ for i in range(len(txtmp.vin)):
+ if i != inIdx:
+ txtmp.vin[i].nSequence = 0
+
+ if hashtype & SIGHASH_ANYONECANPAY:
+ tmp = txtmp.vin[inIdx]
+ txtmp.vin = []
+ txtmp.vin.append(tmp)
+
+ s = txtmp.serialize()
+ s += struct.pack(b"<I", hashtype)
+
+ hash = hash256(s)
+
+ return (hash, None)
diff --git a/qa/rpc-tests/test_framework/socks5.py b/qa/rpc-tests/test_framework/socks5.py
new file mode 100644
index 0000000000..1dbfb98d5d
--- /dev/null
+++ b/qa/rpc-tests/test_framework/socks5.py
@@ -0,0 +1,160 @@
+# Copyright (c) 2015 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+'''
+Dummy Socks5 server for testing.
+'''
+from __future__ import print_function, division, unicode_literals
+import socket, threading, Queue
+import traceback, sys
+
+### Protocol constants
+class Command:
+ CONNECT = 0x01
+
+class AddressType:
+ IPV4 = 0x01
+ DOMAINNAME = 0x03
+ IPV6 = 0x04
+
+### Utility functions
+def recvall(s, n):
+ '''Receive n bytes from a socket, or fail'''
+ rv = bytearray()
+ while n > 0:
+ d = s.recv(n)
+ if not d:
+ raise IOError('Unexpected end of stream')
+ rv.extend(d)
+ n -= len(d)
+ return rv
+
+### Implementation classes
+class Socks5Configuration(object):
+ '''Proxy configuration'''
+ def __init__(self):
+ self.addr = None # Bind address (must be set)
+ self.af = socket.AF_INET # Bind address family
+ self.unauth = False # Support unauthenticated
+ self.auth = False # Support authentication
+
+class Socks5Command(object):
+ '''Information about an incoming socks5 command'''
+ def __init__(self, cmd, atyp, addr, port, username, password):
+ self.cmd = cmd # Command (one of Command.*)
+ self.atyp = atyp # Address type (one of AddressType.*)
+ self.addr = addr # Address
+ self.port = port # Port to connect to
+ self.username = username
+ self.password = password
+ def __repr__(self):
+ return 'Socks5Command(%s,%s,%s,%s,%s,%s)' % (self.cmd, self.atyp, self.addr, self.port, self.username, self.password)
+
+class Socks5Connection(object):
+ def __init__(self, serv, conn, peer):
+ self.serv = serv
+ self.conn = conn
+ self.peer = peer
+
+ def handle(self):
+ '''
+ Handle socks5 request according to RFC1928
+ '''
+ try:
+ # Verify socks version
+ ver = recvall(self.conn, 1)[0]
+ if ver != 0x05:
+ raise IOError('Invalid socks version %i' % ver)
+ # Choose authentication method
+ nmethods = recvall(self.conn, 1)[0]
+ methods = bytearray(recvall(self.conn, nmethods))
+ method = None
+ if 0x02 in methods and self.serv.conf.auth:
+ method = 0x02 # username/password
+ elif 0x00 in methods and self.serv.conf.unauth:
+ method = 0x00 # unauthenticated
+ if method is None:
+ raise IOError('No supported authentication method was offered')
+ # Send response
+ self.conn.sendall(bytearray([0x05, method]))
+ # Read authentication (optional)
+ username = None
+ password = None
+ if method == 0x02:
+ ver = recvall(self.conn, 1)[0]
+ if ver != 0x01:
+ raise IOError('Invalid auth packet version %i' % ver)
+ ulen = recvall(self.conn, 1)[0]
+ username = str(recvall(self.conn, ulen))
+ plen = recvall(self.conn, 1)[0]
+ password = str(recvall(self.conn, plen))
+ # Send authentication response
+ self.conn.sendall(bytearray([0x01, 0x00]))
+
+ # Read connect request
+ (ver,cmd,rsv,atyp) = recvall(self.conn, 4)
+ if ver != 0x05:
+ raise IOError('Invalid socks version %i in connect request' % ver)
+ if cmd != Command.CONNECT:
+ raise IOError('Unhandled command %i in connect request' % cmd)
+
+ if atyp == AddressType.IPV4:
+ addr = recvall(self.conn, 4)
+ elif atyp == AddressType.DOMAINNAME:
+ n = recvall(self.conn, 1)[0]
+ addr = str(recvall(self.conn, n))
+ elif atyp == AddressType.IPV6:
+ addr = recvall(self.conn, 16)
+ else:
+ raise IOError('Unknown address type %i' % atyp)
+ port_hi,port_lo = recvall(self.conn, 2)
+ port = (port_hi << 8) | port_lo
+
+ # Send dummy response
+ self.conn.sendall(bytearray([0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]))
+
+ cmdin = Socks5Command(cmd, atyp, addr, port, username, password)
+ self.serv.queue.put(cmdin)
+ print('Proxy: ', cmdin)
+ # Fall through to disconnect
+ except Exception,e:
+ traceback.print_exc(file=sys.stderr)
+ self.serv.queue.put(e)
+ finally:
+ self.conn.close()
+
+class Socks5Server(object):
+ def __init__(self, conf):
+ self.conf = conf
+ self.s = socket.socket(conf.af)
+ self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ self.s.bind(conf.addr)
+ self.s.listen(5)
+ self.running = False
+ self.thread = None
+ self.queue = Queue.Queue() # report connections and exceptions to client
+
+ def run(self):
+ while self.running:
+ (sockconn, peer) = self.s.accept()
+ if self.running:
+ conn = Socks5Connection(self, sockconn, peer)
+ thread = threading.Thread(None, conn.handle)
+ thread.daemon = True
+ thread.start()
+
+ def start(self):
+ assert(not self.running)
+ self.running = True
+ self.thread = threading.Thread(None, self.run)
+ self.thread.daemon = True
+ self.thread.start()
+
+ def stop(self):
+ self.running = False
+ # connect to self to end run loop
+ s = socket.socket(self.conf.af)
+ s.connect(self.conf.addr)
+ s.close()
+ self.thread.join()
+
diff --git a/qa/rpc-tests/test_framework.py b/qa/rpc-tests/test_framework/test_framework.py
index 4c8a11b821..5671431f6e 100755
--- a/qa/rpc-tests/test_framework.py
+++ b/qa/rpc-tests/test_framework/test_framework.py
@@ -8,13 +8,12 @@
# Add python-bitcoinrpc to module search path:
import os
import sys
-sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "python-bitcoinrpc"))
import shutil
import tempfile
import traceback
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
+from authproxy import AuthServiceProxy, JSONRPCException
from util import *
@@ -89,8 +88,10 @@ class BitcoinTestFramework(object):
parser = optparse.OptionParser(usage="%prog [options]")
parser.add_option("--nocleanup", dest="nocleanup", default=False, action="store_true",
help="Leave bitcoinds and test.* datadir on exit or error")
+ parser.add_option("--noshutdown", dest="noshutdown", default=False, action="store_true",
+ help="Don't stop bitcoinds after the test execution")
parser.add_option("--srcdir", dest="srcdir", default="../../src",
- help="Source directory containing bitcoind/bitcoin-cli (default: %default%)")
+ help="Source directory containing bitcoind/bitcoin-cli (default: %default)")
parser.add_option("--tmpdir", dest="tmpdir", default=tempfile.mkdtemp(prefix="test"),
help="Root directory for datadirs")
parser.add_option("--tracerpc", dest="trace_rpc", default=False, action="store_true",
@@ -128,10 +129,15 @@ class BitcoinTestFramework(object):
print("Unexpected exception caught during testing: "+str(e))
traceback.print_tb(sys.exc_info()[2])
- if not self.options.nocleanup:
- print("Cleaning up")
+ if not self.options.noshutdown:
+ print("Stopping nodes")
stop_nodes(self.nodes)
wait_bitcoinds()
+ else:
+ print("Note: bitcoinds were not stopped and may still be running")
+
+ if not self.options.nocleanup and not self.options.noshutdown:
+ print("Cleaning up")
shutil.rmtree(self.options.tmpdir)
if success:
@@ -140,3 +146,34 @@ class BitcoinTestFramework(object):
else:
print("Failed")
sys.exit(1)
+
+
+# Test framework for doing p2p comparison testing, which sets up some bitcoind
+# binaries:
+# 1 binary: test binary
+# 2 binaries: 1 test binary, 1 ref binary
+# n>2 binaries: 1 test binary, n-1 ref binaries
+
+class ComparisonTestFramework(BitcoinTestFramework):
+
+ # Can override the num_nodes variable to indicate how many nodes to run.
+ def __init__(self):
+ self.num_nodes = 2
+
+ def add_options(self, parser):
+ parser.add_option("--testbinary", dest="testbinary",
+ default=os.getenv("BITCOIND", "bitcoind"),
+ help="bitcoind binary to test")
+ parser.add_option("--refbinary", dest="refbinary",
+ default=os.getenv("BITCOIND", "bitcoind"),
+ help="bitcoind binary to use for reference nodes (if any)")
+
+ def setup_chain(self):
+ print "Initializing test directory "+self.options.tmpdir
+ initialize_chain_clean(self.options.tmpdir, self.num_nodes)
+
+ def setup_network(self):
+ self.nodes = start_nodes(self.num_nodes, self.options.tmpdir,
+ extra_args=[['-debug', '-whitelist=127.0.0.1']] * self.num_nodes,
+ binary=[self.options.testbinary] +
+ [self.options.refbinary]*(self.num_nodes-1))
diff --git a/qa/rpc-tests/util.py b/qa/rpc-tests/test_framework/util.py
index 9ecee31959..c236ec2602 100644
--- a/qa/rpc-tests/util.py
+++ b/qa/rpc-tests/test_framework/util.py
@@ -8,7 +8,6 @@
# Add python-bitcoinrpc to module search path:
import os
import sys
-sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "python-bitcoinrpc"))
from decimal import Decimal, ROUND_DOWN
import json
@@ -18,7 +17,7 @@ import subprocess
import time
import re
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
+from authproxy import AuthServiceProxy, JSONRPCException
from util import *
def p2p_port(n):
@@ -33,7 +32,7 @@ def check_json_precision():
if satoshis != 2000000000000003:
raise RuntimeError("JSON encode/decode loses precision")
-def sync_blocks(rpc_connections):
+def sync_blocks(rpc_connections, wait=1):
"""
Wait until everybody has the same block count
"""
@@ -41,9 +40,9 @@ def sync_blocks(rpc_connections):
counts = [ x.getblockcount() for x in rpc_connections ]
if counts == [ counts[0] ]*len(counts):
break
- time.sleep(1)
+ time.sleep(wait)
-def sync_mempools(rpc_connections):
+def sync_mempools(rpc_connections, wait=1):
"""
Wait until everybody has the same transactions in their memory
pools
@@ -56,7 +55,7 @@ def sync_mempools(rpc_connections):
num_match = num_match+1
if num_match == len(rpc_connections):
break
- time.sleep(1)
+ time.sleep(wait)
bitcoind_processes = {}
@@ -88,8 +87,12 @@ def initialize_chain(test_dir):
if i > 0:
args.append("-connect=127.0.0.1:"+str(p2p_port(0)))
bitcoind_processes[i] = subprocess.Popen(args)
+ if os.getenv("PYTHON_DEBUG", ""):
+ print "initialize_chain: bitcoind started, calling bitcoin-cli -rpcwait getblockcount"
subprocess.check_call([ os.getenv("BITCOINCLI", "bitcoin-cli"), "-datadir="+datadir,
"-rpcwait", "getblockcount"], stdout=devnull)
+ if os.getenv("PYTHON_DEBUG", ""):
+ print "initialize_chain: bitcoin-cli -rpcwait getblockcount completed"
devnull.close()
rpcs = []
for i in range(4):
@@ -158,30 +161,40 @@ def _rpchost_to_args(rpchost):
rv += ['-rpcport=' + rpcport]
return rv
-def start_node(i, dirname, extra_args=None, rpchost=None):
+def start_node(i, dirname, extra_args=None, rpchost=None, timewait=None, binary=None):
"""
Start a bitcoind and return RPC connection to it
"""
datadir = os.path.join(dirname, "node"+str(i))
- args = [ os.getenv("BITCOIND", "bitcoind"), "-datadir="+datadir, "-keypool=1", "-discover=0", "-rest" ]
+ if binary is None:
+ binary = os.getenv("BITCOIND", "bitcoind")
+ args = [ binary, "-datadir="+datadir, "-keypool=1", "-discover=0", "-rest" ]
if extra_args is not None: args.extend(extra_args)
bitcoind_processes[i] = subprocess.Popen(args)
devnull = open("/dev/null", "w+")
+ if os.getenv("PYTHON_DEBUG", ""):
+ print "start_node: bitcoind started, calling bitcoin-cli -rpcwait getblockcount"
subprocess.check_call([ os.getenv("BITCOINCLI", "bitcoin-cli"), "-datadir="+datadir] +
_rpchost_to_args(rpchost) +
["-rpcwait", "getblockcount"], stdout=devnull)
+ if os.getenv("PYTHON_DEBUG", ""):
+ print "start_node: calling bitcoin-cli -rpcwait getblockcount returned"
devnull.close()
url = "http://rt:rt@%s:%d" % (rpchost or '127.0.0.1', rpc_port(i))
- proxy = AuthServiceProxy(url)
+ if timewait is not None:
+ proxy = AuthServiceProxy(url, timeout=timewait)
+ else:
+ proxy = AuthServiceProxy(url)
proxy.url = url # store URL on proxy for info
return proxy
-def start_nodes(num_nodes, dirname, extra_args=None, rpchost=None):
+def start_nodes(num_nodes, dirname, extra_args=None, rpchost=None, binary=None):
"""
Start multiple bitcoinds, return RPC connections to them
"""
if extra_args is None: extra_args = [ None for i in range(num_nodes) ]
- return [ start_node(i, dirname, extra_args[i], rpchost) for i in range(num_nodes) ]
+ if binary is None: binary = [ None for i in range(num_nodes) ]
+ return [ start_node(i, dirname, extra_args[i], rpchost, binary=binary[i]) for i in range(num_nodes) ]
def log_filename(dirname, n_node, logname):
return os.path.join(dirname, "node"+str(n_node), "regtest", logname)
@@ -269,7 +282,7 @@ def send_zeropri_transaction(from_node, to_node, amount, fee):
Create&broadcast a zero-priority transaction.
Returns (txid, hex-encoded-txdata)
Ensures transaction is zero-priority by first creating a send-to-self,
- then using it's output
+ then using its output
"""
# Create a send-to-self with confirmed inputs:
diff --git a/qa/rpc-tests/txn_doublespend.py b/qa/rpc-tests/txn_doublespend.py
index 9551080039..36081127b4 100755
--- a/qa/rpc-tests/txn_doublespend.py
+++ b/qa/rpc-tests/txn_doublespend.py
@@ -7,10 +7,9 @@
# Test proper accounting with a double-spend conflict
#
-from test_framework import BitcoinTestFramework
-from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
from decimal import Decimal
-from util import *
import os
import shutil
diff --git a/qa/rpc-tests/wallet.py b/qa/rpc-tests/wallet.py
index 5f3178c606..46dc7765b6 100755
--- a/qa/rpc-tests/wallet.py
+++ b/qa/rpc-tests/wallet.py
@@ -19,9 +19,8 @@
# k) test ResendWalletTransactions - create transactions, startup fourth node, make sure it syncs
#
-from test_framework import BitcoinTestFramework
-from util import *
-
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
class WalletTest (BitcoinTestFramework):
@@ -62,7 +61,7 @@ class WalletTest (BitcoinTestFramework):
walletinfo = self.nodes[0].getwalletinfo()
assert_equal(walletinfo['immature_balance'], 0)
- # Have node0 mine a block, thus they will collect their own fee.
+ # Have node0 mine a block, thus it will collect its own fee.
self.nodes[0].generate(1)
self.sync_all()
@@ -151,6 +150,33 @@ class WalletTest (BitcoinTestFramework):
assert(txid1 in self.nodes[3].getrawmempool())
+ #check if we can list zero value tx as available coins
+ #1. create rawtx
+ #2. hex-changed one output to 0.0
+ #3. sign and send
+ #4. check if recipient (node0) can list the zero value tx
+ usp = self.nodes[1].listunspent()
+ inputs = [{"txid":usp[0]['txid'], "vout":usp[0]['vout']}]
+ outputs = {self.nodes[1].getnewaddress(): 49.998, self.nodes[0].getnewaddress(): 11.11}
+
+ rawTx = self.nodes[1].createrawtransaction(inputs, outputs).replace("c0833842", "00000000") #replace 11.11 with 0.0 (int32)
+ decRawTx = self.nodes[1].decoderawtransaction(rawTx)
+ signedRawTx = self.nodes[1].signrawtransaction(rawTx)
+ decRawTx = self.nodes[1].decoderawtransaction(signedRawTx['hex'])
+ zeroValueTxid= decRawTx['txid']
+ sendResp = self.nodes[1].sendrawtransaction(signedRawTx['hex'])
+
+ self.sync_all()
+ self.nodes[1].generate(1) #mine a block
+ self.sync_all()
+
+ unspentTxs = self.nodes[0].listunspent() #zero value tx must be in listunspents output
+ found = False
+ for uTx in unspentTxs:
+ if uTx['txid'] == zeroValueTxid:
+ found = True
+ assert_equal(uTx['amount'], Decimal('0.00000000'));
+ assert(found)
#do some -walletbroadcast tests
stop_nodes(self.nodes)
diff --git a/qa/rpc-tests/walletbackup.py b/qa/rpc-tests/walletbackup.py
index b9fc862234..da100d7fc0 100755
--- a/qa/rpc-tests/walletbackup.py
+++ b/qa/rpc-tests/walletbackup.py
@@ -33,8 +33,8 @@ Shutdown again, restore using importwallet,
and confirm again balances are correct.
"""
-from test_framework import BitcoinTestFramework
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
from random import randint
import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.INFO)
diff --git a/qa/rpc-tests/zapwallettxes.py b/qa/rpc-tests/zapwallettxes.py
index 045614e94c..0ec8ec5364 100755
--- a/qa/rpc-tests/zapwallettxes.py
+++ b/qa/rpc-tests/zapwallettxes.py
@@ -3,8 +3,8 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-from test_framework import BitcoinTestFramework
-from util import *
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import *
class ZapWalletTXesTest (BitcoinTestFramework):
diff --git a/share/genbuild.sh b/share/genbuild.sh
index ffa89ca6e4..a15cb34e47 100755
--- a/share/genbuild.sh
+++ b/share/genbuild.sh
@@ -22,7 +22,7 @@ if [ -e "$(which git 2>/dev/null)" -a "$(git rev-parse --is-inside-work-tree 2>/
# if latest commit is tagged and not dirty, then override using the tag name
RAWDESC=$(git describe --abbrev=0 2>/dev/null)
- if [ "$(git rev-parse HEAD)" = "$(git rev-list -1 $RAWDESC)" ]; then
+ if [ "$(git rev-parse HEAD)" = "$(git rev-list -1 $RAWDESC 2>/dev/null)" ]; then
git diff-index --quiet HEAD -- && DESC=$RAWDESC
fi
diff --git a/share/qt/Info.plist.in b/share/qt/Info.plist.in
index dd6edde8d2..a389332a52 100644
--- a/share/qt/Info.plist.in
+++ b/share/qt/Info.plist.in
@@ -3,7 +3,7 @@
<plist version="0.9">
<dict>
<key>LSMinimumSystemVersion</key>
- <string>10.6.0</string>
+ <string>10.7.0</string>
<key>LSArchitecturePriority</key>
<array>
@@ -30,6 +30,12 @@
<key>CFBundleExecutable</key>
<string>Bitcoin-Qt</string>
+
+ <key>CFBundleName</key>
+ <string>Bitcoin-Qt</string>
+
+ <key>LSHasLocalizedDisplayName</key>
+ <true/>
<key>CFBundleIdentifier</key>
<string>org.bitcoinfoundation.Bitcoin-Qt</string>
diff --git a/share/seeds/nodes_main.txt b/share/seeds/nodes_main.txt
deleted file mode 100644
index 3dba6d8a64..0000000000
--- a/share/seeds/nodes_main.txt
+++ /dev/null
@@ -1,540 +0,0 @@
-# List of fixed seed nodes for main network
-
-# IPv4 nodes (generated using contrib/seeds/makeseeds.py)
-1.33.197.110
-1.34.180.245
-1.202.128.218
-2.35.195.25
-5.100.123.19
-5.175.145.169
-5.199.133.193
-5.199.151.10
-5.228.1.230
-14.200.200.145
-18.228.0.188
-18.228.0.200
-23.30.243.153
-23.88.232.49
-23.99.105.9
-23.226.137.208
-23.227.177.161
-23.227.191.50
-23.229.45.32
-23.236.144.69
-23.253.148.113
-23.253.241.22
-23.255.227.231
-24.20.205.222
-24.23.120.252
-24.94.98.96
-24.98.95.201
-24.111.90.55
-24.119.119.105
-24.138.25.149
-31.3.214.45
-31.186.87.46
-31.186.101.98
-31.186.250.186
-31.204.153.107
-37.44.16.231
-37.44.44.11
-37.120.168.204
-37.143.86.26
-37.187.75.24
-37.188.68.169
-37.192.95.150
-37.201.246.116
-37.205.10.140
-46.10.210.17
-46.19.138.154
-46.28.204.123
-46.28.205.67
-46.38.235.229
-46.163.76.230
-46.166.162.91
-46.173.190.50
-46.227.66.132
-46.229.238.187
-46.236.116.209
-47.55.14.65
-50.7.252.229
-50.46.159.91
-50.78.49.181
-50.78.231.57
-50.79.153.65
-50.116.34.44
-50.126.86.253
-50.142.41.23
-50.199.113.193
-50.200.78.107
-50.206.138.177
-50.252.52.49
-54.165.25.75
-54.169.107.40
-54.179.190.56
-54.187.82.121
-54.246.85.246
-58.74.7.205
-58.96.183.121
-61.62.58.38
-61.63.91.72
-61.63.91.112
-61.72.211.228
-62.43.40.154
-62.43.130.178
-62.80.185.213
-62.109.49.26
-62.173.139.58
-62.181.238.186
-62.210.114.127
-63.141.228.138
-63.153.213.78
-63.223.84.145
-63.251.88.112
-64.31.110.50
-64.34.121.45
-64.114.6.42
-64.140.125.98
-64.156.193.100
-65.30.47.116
-65.35.132.177
-65.96.193.165
-65.111.189.26
-66.68.10.30
-66.114.33.250
-66.130.46.63
-66.175.215.135
-66.190.253.165
-66.194.38.254
-66.244.98.111
-67.162.238.30
-67.169.255.17
-67.183.173.25
-67.219.233.140
-67.227.240.115
-67.247.222.71
-68.43.114.66
-68.52.33.36
-68.198.245.241
-69.12.226.165
-69.13.198.188
-69.15.179.62
-69.39.239.47
-69.47.45.87
-69.62.217.206
-69.64.42.31
-69.64.81.61
-69.67.219.200
-69.90.132.157
-69.94.30.177
-69.136.175.241
-70.61.97.228
-70.123.118.132
-71.59.152.182
-71.198.248.151
-71.200.242.89
-71.225.179.157
-72.14.187.51
-72.38.34.180
-72.52.72.187
-72.91.144.182
-72.167.49.217
-72.201.243.55
-72.223.60.249
-72.228.153.102
-73.26.101.228
-73.50.158.200
-73.181.204.170
-74.57.199.180
-74.63.222.226
-74.81.231.21
-74.193.126.82
-74.207.235.164
-75.83.197.114
-75.144.114.9
-76.112.5.247
-76.174.20.247
-77.37.240.142
-77.57.202.107
-77.172.123.53
-77.221.91.253
-77.235.48.48
-77.245.78.2
-78.8.58.249
-78.27.191.182
-78.129.236.141
-78.131.88.47
-78.157.205.6
-79.132.230.144
-79.143.188.155
-79.160.221.140
-79.161.111.114
-80.100.189.3
-80.147.140.121
-80.203.75.133
-80.220.99.227
-80.222.20.169
-80.241.1.7
-81.23.191.243
-81.38.11.202
-81.80.9.71
-81.110.213.165
-81.133.155.237
-81.171.34.37
-81.181.155.180
-82.39.156.137
-82.73.161.95
-82.130.45.40
-82.165.153.47
-82.168.128.133
-82.179.225.118
-82.194.245.158
-82.199.102.10
-82.211.30.243
-82.217.133.145
-82.221.128.35
-82.221.131.177
-82.233.225.205
-83.0.249.146
-83.89.31.249
-83.128.29.231
-83.128.253.142
-83.143.130.56
-83.150.2.99
-83.150.9.196
-83.161.64.45
-83.212.103.212
-83.212.111.114
-83.246.75.8
-83.254.81.31
-83.254.150.54
-84.2.34.104
-84.15.61.60
-84.17.25.135
-84.42.144.19
-84.212.210.135
-84.215.165.231
-84.238.140.176
-84.240.31.184
-85.25.214.137
-85.139.163.132
-85.199.4.228
-85.214.61.209
-85.214.108.77
-86.123.16.17
-87.48.42.199
-87.104.168.104
-87.229.73.171
-87.236.196.77
-88.97.56.98
-88.134.178.89
-88.150.233.19
-88.168.133.3
-88.208.18.246
-88.208.33.202
-89.18.28.21
-89.85.220.84
-89.163.227.28
-89.184.83.60
-89.231.96.83
-89.236.49.117
-91.90.66.209
-91.106.194.97
-91.134.75.115
-91.152.193.36
-91.152.219.35
-91.197.10.234
-91.209.77.101
-91.210.106.147
-91.214.200.205
-91.223.115.38
-91.234.48.232
-91.250.86.18
-92.27.7.209
-92.255.207.73
-93.74.163.234
-93.84.114.106
-93.152.166.29
-93.171.216.221
-93.185.177.71
-94.19.12.244
-94.42.115.50
-94.79.177.206
-94.136.147.119
-94.143.245.5
-94.188.50.39
-94.190.227.112
-94.198.135.29
-94.226.107.86
-94.242.219.90
-94.242.229.168
-94.244.160.84
-95.31.10.209
-95.85.25.41
-95.105.161.136
-95.154.165.45
-95.154.200.216
-95.167.109.125
-95.211.125.231
-95.211.216.235
-96.33.25.17
-96.43.130.178
-97.118.8.236
-98.102.6.125
-98.202.20.45
-98.217.125.225
-98.234.210.111
-98.237.20.123
-98.255.144.176
-99.113.64.43
-99.229.22.8
-103.1.212.19
-103.30.42.189
-103.224.165.48
-103.243.94.140
-104.131.107.107
-104.131.116.184
-104.143.0.156
-104.219.184.9
-106.185.38.174
-107.6.4.145
-107.150.8.27
-107.150.33.20
-107.170.228.129
-107.170.240.173
-108.51.20.86
-108.61.149.222
-108.61.151.172
-108.161.129.247
-108.170.140.21
-109.60.211.216
-109.73.42.36
-109.73.172.138
-109.163.235.239
-109.190.196.220
-109.201.135.216
-109.228.152.2
-109.228.154.81
-109.230.220.125
-109.234.156.218
-109.235.49.27
-109.235.69.84
-112.124.71.0
-113.146.68.251
-115.29.17.82
-115.70.176.17
-117.41.162.184
-118.27.8.170
-119.230.7.211
-119.246.71.52
-121.172.8.100
-122.128.109.148
-123.231.224.63
-128.175.195.31
-128.199.164.96
-128.199.254.244
-129.97.69.76
-129.123.7.7
-129.123.7.39
-129.186.17.17
-131.247.169.190
-133.242.209.63
-134.102.94.38
-134.119.17.145
-137.116.160.176
-137.226.34.42
-138.210.217.170
-141.255.166.194
-143.215.129.126
-144.76.244.19
-146.148.52.162
-146.148.80.57
-146.185.19.30
-146.185.142.86
-146.185.253.51
-148.251.6.214
-149.154.155.235
-149.210.133.244
-151.224.248.252
-153.121.75.229
-153.127.251.67
-154.20.2.139
-157.13.61.5
-158.58.173.48
-159.253.23.132
-162.209.110.218
-162.213.254.205
-162.239.254.100
-162.242.150.39
-162.243.81.138
-162.243.235.56
-162.244.79.16
-162.245.217.119
-162.248.102.117
-162.251.108.53
-162.254.149.139
-162.255.116.78
-166.70.94.106
-167.88.45.124
-167.88.120.210
-173.26.49.43
-173.30.14.6
-173.80.114.197
-173.167.214.243
-173.208.219.108
-173.220.67.156
-173.236.101.34
-173.246.107.34
-173.255.237.241
-174.2.213.209
-174.51.23.224
-174.51.123.159
-174.57.212.121
-174.109.33.28
-175.126.124.91
-175.126.124.92
-176.10.116.242
-176.36.35.126
-176.36.99.222
-176.124.110.47
-176.194.33.44
-176.223.201.198
-178.62.26.83
-178.62.36.48
-178.62.212.141
-178.62.254.59
-178.78.250.3
-178.155.86.226
-178.175.134.35
-178.248.111.4
-178.254.1.170
-178.254.34.161
-179.43.114.14
-182.213.208.28
-184.68.2.46
-184.72.238.42
-184.94.226.34
-184.94.227.58
-184.107.139.58
-184.107.206.45
-185.10.48.117
-185.21.216.156
-185.38.47.224
-185.45.192.129
-185.53.129.230
-185.53.131.114
-185.55.53.61
-185.55.53.63
-185.61.119.2
-185.61.148.203
-186.2.167.23
-188.92.75.178
-188.122.92.134
-188.138.9.208
-188.165.209.148
-188.226.206.239
-190.10.8.124
-190.10.10.147
-192.0.130.142
-192.3.89.159
-192.73.234.138
-192.75.95.107
-192.95.100.102
-192.155.84.181
-192.169.233.206
-192.198.93.86
-192.227.135.216
-193.0.109.3
-193.77.50.208
-193.109.68.62
-193.150.121.37
-193.224.69.98
-194.79.8.37
-194.141.86.10
-195.12.180.94
-195.56.63.10
-195.116.93.93
-195.154.174.226
-195.159.111.98
-195.169.138.2
-195.189.126.35
-195.197.175.190
-197.242.93.82
-198.11.214.147
-198.49.41.21
-199.33.124.186
-199.204.186.146
-199.233.238.115
-199.241.189.66
-202.60.68.242
-202.60.69.232
-203.183.151.39
-203.219.14.204
-204.44.123.109
-204.44.123.162
-204.45.120.178
-206.190.134.44
-206.248.184.127
-207.244.73.8
-208.66.30.27
-209.81.9.223
-209.105.243.229
-209.126.70.159
-209.140.30.169
-209.165.128.235
-209.190.2.242
-210.66.254.236
-210.73.27.33
-211.72.66.229
-212.25.37.124
-212.71.235.114
-212.71.252.109
-212.114.48.31
-212.174.151.118
-213.66.205.194
-213.129.248.139
-213.136.87.34
-213.165.82.133
-213.167.17.6
-213.179.158.253
-213.189.53.125
-213.222.208.93
-216.49.158.161
-216.55.143.154
-216.131.91.100
-216.245.206.181
-216.250.138.230
-217.11.225.189
-217.23.6.133
-217.75.88.178
-217.172.143.140
-217.195.169.209
-217.196.248.106
-219.138.161.162
-222.167.248.90
-223.18.254.55
-
-# Onion nodes
-bitcoinostk4e4re.onion:8333
-5k4vwyy5stro33fb.onion:8333
-zy3kdqowmrb7xm7h.onion:8333
-e3tn727fywnioxrc.onion:8333
-kjy2eqzk4zwi5zd3.onion:8333
-pt2awtcs2ulm75ig.onion:8333
-td7tgof3imei3fm6.onion:8333
-czsbwh4pq4mh3izl.onion:8333
-xdnigz4qn5dbbw2t.onion:8333
-ymnsfdejmc74vcfb.onion:7033
-jxrvw5iqizppbgml.onion:8333
-bk5ejfe56xakvtkk.onion:8333
-szsm43ou7otwwyfv.onion:8333
-5ghqw4wj6hpgfvdg.onion:8333
-evolynhit7shzeet.onion:8333
-4crhf372poejlc44.onion:8333
-tfu4kqfhsw5slqp2.onion:8333
-i2r5tbaizb75h26f.onion:8333
-btcnet3utgzyz2bf.onion:8333
-vso3r6cmjoomhhgg.onion:8333
-pqosrh6wfaucet32.onion:8333
-zy3kdqowmrb7xm7h.onion:8333
-r4de4zf4lyniu4mx.onion:8444
diff --git a/share/seeds/nodes_test.txt b/share/seeds/nodes_test.txt
deleted file mode 100644
index 71782836fe..0000000000
--- a/share/seeds/nodes_test.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-# List of fixed seed nodes for testnet
-
-# Onion nodes
-thfsmmn2jbitcoin.onion
-it2pj4f7657g3rhi.onion
diff --git a/src/Makefile.am b/src/Makefile.am
index 37184b6286..59618c4940 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -14,7 +14,7 @@ $(LIBLEVELDB): $(LIBMEMENV)
$(LIBLEVELDB) $(LIBMEMENV):
@echo "Building LevelDB ..." && $(MAKE) -C $(@D) $(@F) CXX="$(CXX)" \
CC="$(CC)" PLATFORM=$(TARGET_OS) AR="$(AR)" $(LEVELDB_TARGET_FLAGS) \
- OPT="$(CXXFLAGS) $(CPPFLAGS)"
+ OPT="$(CXXFLAGS) $(CPPFLAGS) -D__STDC_LIMIT_MACROS"
endif
BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config
@@ -77,8 +77,8 @@ BITCOIN_CORE_H = \
base58.h \
bloom.h \
chain.h \
- chainparamsbase.h \
chainparams.h \
+ chainparamsbase.h \
chainparamsseeds.h \
checkpoints.h \
checkqueue.h \
@@ -86,10 +86,14 @@ BITCOIN_CORE_H = \
coincontrol.h \
coins.h \
compat.h \
+ compat/byteswap.h \
+ compat/endian.h \
+ compat/sanity.h \
compressor.h \
+ consensus/consensus.h \
consensus/params.h \
+ consensus/validation.h \
core_io.h \
- wallet/db.h \
eccryptoverify.h \
ecwrapper.h \
hash.h \
@@ -99,12 +103,14 @@ BITCOIN_CORE_H = \
leveldbwrapper.h \
limitedmap.h \
main.h \
+ memusage.h \
merkleblock.h \
miner.h \
mruset.h \
- netbase.h \
net.h \
+ netbase.h \
noui.h \
+ policy/fees.h \
pow.h \
primitives/block.h \
primitives/transaction.h \
@@ -114,9 +120,10 @@ BITCOIN_CORE_H = \
rpcclient.h \
rpcprotocol.h \
rpcserver.h \
+ scheduler.h \
script/interpreter.h \
- script/script_error.h \
script/script.h \
+ script/script_error.h \
script/sigcache.h \
script/sign.h \
script/standard.h \
@@ -142,23 +149,10 @@ BITCOIN_CORE_H = \
validationinterface.h \
version.h \
wallet/crypter.h \
- wallet/walletdb.h \
+ wallet/db.h \
wallet/wallet.h \
wallet/wallet_ismine.h \
- compat/byteswap.h \
- compat/endian.h \
- compat/sanity.h
-
-JSON_H = \
- json/json_spirit.h \
- json/json_spirit_error_position.h \
- json/json_spirit_reader.h \
- json/json_spirit_reader_template.h \
- json/json_spirit_stream_reader.h \
- json/json_spirit_utils.h \
- json/json_spirit_value.h \
- json/json_spirit_writer.h \
- json/json_spirit_writer_template.h
+ wallet/walletdb.h
obj/build.h: FORCE
@$(MKDIR_P) $(builddir)/obj
@@ -181,6 +175,7 @@ libbitcoin_server_a_SOURCES = \
miner.cpp \
net.cpp \
noui.cpp \
+ policy/fees.cpp \
pow.cpp \
rest.cpp \
rpcblockchain.cpp \
@@ -194,7 +189,6 @@ libbitcoin_server_a_SOURCES = \
txdb.cpp \
txmempool.cpp \
validationinterface.cpp \
- $(JSON_H) \
$(BITCOIN_CORE_H)
# wallet: shared between bitcoind and bitcoin-qt, but only linked
@@ -213,39 +207,37 @@ libbitcoin_wallet_a_SOURCES = \
# crypto primitives library
crypto_libbitcoin_crypto_a_CPPFLAGS = $(BITCOIN_CONFIG_INCLUDES)
crypto_libbitcoin_crypto_a_SOURCES = \
- crypto/sha1.cpp \
- crypto/sha256.cpp \
- crypto/sha512.cpp \
- crypto/hmac_sha256.cpp \
- crypto/hmac_sha512.cpp \
- crypto/ripemd160.cpp \
crypto/common.h \
- crypto/sha256.h \
- crypto/sha512.h \
+ crypto/hmac_sha256.cpp \
crypto/hmac_sha256.h \
+ crypto/hmac_sha512.cpp \
crypto/hmac_sha512.h \
+ crypto/ripemd160.cpp \
+ crypto/ripemd160.h \
+ crypto/sha1.cpp \
crypto/sha1.h \
- crypto/ripemd160.h
+ crypto/sha256.cpp \
+ crypto/sha256.h \
+ crypto/sha512.cpp \
+ crypto/sha512.h
# univalue JSON library
univalue_libbitcoin_univalue_a_SOURCES = \
univalue/univalue.cpp \
- univalue/univalue_read.cpp \
- univalue/univalue_write.cpp \
+ univalue/univalue.h \
univalue/univalue_escapes.h \
- univalue/univalue.h
+ univalue/univalue_read.cpp \
+ univalue/univalue_write.cpp
# common: shared between bitcoind, and bitcoin-qt and non-server tools
libbitcoin_common_a_CPPFLAGS = $(BITCOIN_INCLUDES)
libbitcoin_common_a_SOURCES = \
- arith_uint256.cpp \
amount.cpp \
+ arith_uint256.cpp \
base58.cpp \
chainparams.cpp \
coins.cpp \
compressor.cpp \
- primitives/block.cpp \
- primitives/transaction.cpp \
core_read.cpp \
core_write.cpp \
eccryptoverify.cpp \
@@ -254,13 +246,16 @@ libbitcoin_common_a_SOURCES = \
key.cpp \
keystore.cpp \
netbase.cpp \
+ primitives/block.cpp \
+ primitives/transaction.cpp \
protocol.cpp \
pubkey.cpp \
+ scheduler.cpp \
script/interpreter.cpp \
script/script.cpp \
+ script/script_error.cpp \
script/sign.cpp \
script/standard.cpp \
- script/script_error.cpp \
$(BITCOIN_CORE_H)
# util: shared between all executables.
@@ -335,6 +330,7 @@ endif
bitcoin_cli_LDADD = \
$(LIBBITCOIN_CLI) \
+ $(LIBBITCOIN_UNIVALUE) \
$(LIBBITCOIN_UTIL) \
$(LIBSECP256K1)
@@ -346,6 +342,10 @@ bitcoin_tx_SOURCES = bitcoin-tx.cpp
bitcoin_tx_CPPFLAGS = $(BITCOIN_INCLUDES)
bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
+if TARGET_WINDOWS
+bitcoin_tx_SOURCES += bitcoin-tx-res.rc
+endif
+
bitcoin_tx_LDADD = \
$(LIBBITCOIN_UNIVALUE) \
$(LIBBITCOIN_COMMON) \
diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include
index 31fe3a9f69..6b7c42285d 100644
--- a/src/Makefile.qt.include
+++ b/src/Makefile.qt.include
@@ -256,6 +256,7 @@ RES_ICONS = \
qt/res/icons/tx_input.png \
qt/res/icons/tx_output.png \
qt/res/icons/tx_mined.png \
+ qt/res/icons/warning.png \
qt/res/icons/verify.png
BITCOIN_QT_CPP = \
diff --git a/src/Makefile.test.include b/src/Makefile.test.include
index 52ff3f224f..0997148117 100644
--- a/src/Makefile.test.include
+++ b/src/Makefile.test.include
@@ -39,6 +39,7 @@ BITCOIN_TESTS =\
test/base32_tests.cpp \
test/base58_tests.cpp \
test/base64_tests.cpp \
+ test/bip32_tests.cpp \
test/bloom_tests.cpp \
test/checkblock_tests.cpp \
test/Checkpoints_tests.cpp \
@@ -56,9 +57,11 @@ BITCOIN_TESTS =\
test/multisig_tests.cpp \
test/netbase_tests.cpp \
test/pmt_tests.cpp \
+ test/policyestimator_tests.cpp \
test/pow_tests.cpp \
test/rpc_tests.cpp \
test/sanity_tests.cpp \
+ test/scheduler_tests.cpp \
test/script_P2SH_tests.cpp \
test/script_tests.cpp \
test/scriptnum_tests.cpp \
diff --git a/src/addrman.cpp b/src/addrman.cpp
index 5d9527f0e1..b605f4351d 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -8,8 +8,6 @@
#include "serialize.h"
#include "streams.h"
-using namespace std;
-
int CAddrInfo::GetTriedBucket(const uint256& nKey) const
{
uint64_t hash1 = (CHashWriter(SER_GETHASH, 0) << nKey << GetKey()).GetHash().GetCheapHash();
@@ -67,9 +65,8 @@ double CAddrInfo::GetChance(int64_t nNow) const
if (nSinceLastTry < 60 * 10)
fChance *= 0.01;
- // deprioritize 50% after each failed attempt
- for (int n = 0; n < nAttempts; n++)
- fChance /= 1.5;
+ // deprioritize 66% after each failed attempt, but at most 1/28th to avoid the search taking forever or overly penalizing outages.
+ fChance *= pow(0.66, std::min(nAttempts, 8));
return fChance;
}
@@ -259,7 +256,7 @@ bool CAddrMan::Add_(const CAddress& addr, const CNetAddr& source, int64_t nTimeP
bool fCurrentlyOnline = (GetAdjustedTime() - addr.nTime < 24 * 60 * 60);
int64_t nUpdateInterval = (fCurrentlyOnline ? 60 * 60 : 24 * 60 * 60);
if (addr.nTime && (!pinfo->nTime || pinfo->nTime < addr.nTime - nUpdateInterval - nTimePenalty))
- pinfo->nTime = max((int64_t)0, addr.nTime - nTimePenalty);
+ pinfo->nTime = std::max((int64_t)0, addr.nTime - nTimePenalty);
// add services
pinfo->nServices |= addr.nServices;
@@ -284,7 +281,7 @@ bool CAddrMan::Add_(const CAddress& addr, const CNetAddr& source, int64_t nTimeP
return false;
} else {
pinfo = Create(addr, source, &nId);
- pinfo->nTime = max((int64_t)0, (int64_t)pinfo->nTime - nTimePenalty);
+ pinfo->nTime = std::max((int64_t)0, (int64_t)pinfo->nTime - nTimePenalty);
nNew++;
fNew = true;
}
@@ -332,10 +329,10 @@ void CAddrMan::Attempt_(const CService& addr, int64_t nTime)
info.nAttempts++;
}
-CAddress CAddrMan::Select_()
+CAddrInfo CAddrMan::Select_()
{
if (size() == 0)
- return CAddress();
+ return CAddrInfo();
// Use a 50% chance for choosing between tried and new table entries.
if (nTried > 0 && (nNew == 0 || GetRandInt(2) == 0)) {
diff --git a/src/addrman.h b/src/addrman.h
index 8116d0b763..2623d89809 100644
--- a/src/addrman.h
+++ b/src/addrman.h
@@ -17,11 +17,15 @@
#include <stdint.h>
#include <vector>
-/**
- * Extended statistics about a CAddress
+/**
+ * Extended statistics about a CAddress
*/
class CAddrInfo : public CAddress
{
+public:
+ //! last try whatsoever by us (memory only)
+ int64_t nLastTry;
+
private:
//! where knowledge about this address first came from
CNetAddr source;
@@ -29,9 +33,6 @@ private:
//! last successful connection by us
int64_t nLastSuccess;
- //! last try whatsoever by us:
- // int64_t CAddress::nLastTry
-
//! connection attempts since last successful attempt
int nAttempts;
@@ -104,15 +105,15 @@ public:
/** Stochastic address manager
*
* Design goals:
- * * Keep the address tables in-memory, and asynchronously dump the entire to able in peers.dat.
+ * * Keep the address tables in-memory, and asynchronously dump the entire table to peers.dat.
* * Make sure no (localized) attacker can fill the entire table with his nodes/addresses.
*
* To that end:
* * Addresses are organized into buckets.
- * * Address that have not yet been tried go into 1024 "new" buckets.
- * * Based on the address range (/16 for IPv4) of source of the information, 64 buckets are selected at random
- * * The actual bucket is chosen from one of these, based on the range the address itself is located.
- * * One single address can occur in up to 8 different buckets, to increase selection chances for addresses that
+ * * Addresses that have not yet been tried go into 1024 "new" buckets.
+ * * Based on the address range (/16 for IPv4) of the source of information, 64 buckets are selected at random.
+ * * The actual bucket is chosen from one of these, based on the range in which the address itself is located.
+ * * One single address can occur in up to 8 different buckets to increase selection chances for addresses that
* are seen frequently. The chance for increasing this multiplicity decreases exponentially.
* * When adding a new address to a full bucket, a randomly chosen entry (with a bias favoring less recently seen
* ones) is removed from it first.
@@ -230,8 +231,7 @@ protected:
void Attempt_(const CService &addr, int64_t nTime);
//! Select an address to connect to.
- //! nUnkBias determines how much to favor new addresses over tried ones (min=0, max=100)
- CAddress Select_();
+ CAddrInfo Select_();
#ifdef DEBUG_ADDRMAN
//! Perform consistency check. Returns an error code or zero.
@@ -458,7 +458,7 @@ public:
}
//! Return the number of (unique) addresses in all tables.
- int size()
+ size_t size() const
{
return vRandom.size();
}
@@ -531,11 +531,10 @@ public:
/**
* Choose an address to connect to.
- * nUnkBias determines how much "new" entries are favored over "tried" ones (0-100).
*/
- CAddress Select()
+ CAddrInfo Select()
{
- CAddress addrRet;
+ CAddrInfo addrRet;
{
LOCK(cs);
Check();
diff --git a/src/alert.cpp b/src/alert.cpp
index aa7ac748da..ad81e74226 100644
--- a/src/alert.cpp
+++ b/src/alert.cpp
@@ -50,7 +50,7 @@ std::string CUnsignedAlert::ToString() const
BOOST_FOREACH(int n, setCancel)
strSetCancel += strprintf("%d ", n);
std::string strSetSubVer;
- BOOST_FOREACH(std::string str, setSubVer)
+ BOOST_FOREACH(const std::string& str, setSubVer)
strSetSubVer += "\"" + str + "\" ";
return strprintf(
"CAlert(\n"
@@ -110,7 +110,7 @@ bool CAlert::Cancels(const CAlert& alert) const
return (alert.nID <= nCancel || setCancel.count(alert.nID));
}
-bool CAlert::AppliesTo(int nVersion, std::string strSubVerIn) const
+bool CAlert::AppliesTo(int nVersion, const std::string& strSubVerIn) const
{
// TODO: rework for client-version-embedded-in-strSubVer ?
return (IsInEffect() &&
diff --git a/src/alert.h b/src/alert.h
index 746967c4af..4f9fff9181 100644
--- a/src/alert.h
+++ b/src/alert.h
@@ -97,7 +97,7 @@ public:
uint256 GetHash() const;
bool IsInEffect() const;
bool Cancels(const CAlert& alert) const;
- bool AppliesTo(int nVersion, std::string strSubVerIn) const;
+ bool AppliesTo(int nVersion, const std::string& strSubVerIn) const;
bool AppliesToMe() const;
bool RelayTo(CNode* pnode) const;
bool CheckSignature(const std::vector<unsigned char>& alertKey) const;
diff --git a/src/amount.h b/src/amount.h
index 9212244a88..7dc62edac4 100644
--- a/src/amount.h
+++ b/src/amount.h
@@ -16,7 +16,15 @@ typedef int64_t CAmount;
static const CAmount COIN = 100000000;
static const CAmount CENT = 1000000;
-/** No amount larger than this (in satoshi) is valid */
+/** No amount larger than this (in satoshi) is valid.
+ *
+ * Note that this constant is *not* the total money supply, which in Bitcoin
+ * currently happens to be less than 21,000,000 BTC for various reasons, but
+ * rather a sanity check. As this sanity check is used by consensus-critical
+ * validation code, the exact value of the MAX_MONEY constant is consensus
+ * critical; in unusual circumstances like a(nother) overflow bug that allowed
+ * for the creation of coins out of thin air modification could lead to a fork.
+ * */
static const CAmount MAX_MONEY = 21000000 * COIN;
inline bool MoneyRange(const CAmount& nValue) { return (nValue >= 0 && nValue <= MAX_MONEY); }
diff --git a/src/arith_uint256.h b/src/arith_uint256.h
index b6ba3a1087..103c78bb8e 100644
--- a/src/arith_uint256.h
+++ b/src/arith_uint256.h
@@ -287,4 +287,4 @@ public:
uint256 ArithToUint256(const arith_uint256 &);
arith_uint256 UintToArith256(const uint256 &);
-#endif // BITCOIN_UINT256_H
+#endif // BITCOIN_ARITH_UINT256_H
diff --git a/src/base58.h b/src/base58.h
index 8de90046a9..787979c827 100644
--- a/src/base58.h
+++ b/src/base58.h
@@ -6,10 +6,10 @@
/**
* Why base-58 instead of standard base-64 encoding?
* - Don't want 0OIl characters that look the same in some fonts and
- * could be used to create visually identical looking account numbers.
- * - A string with non-alphanumeric characters is not as easily accepted as an account number.
+ * could be used to create visually identical looking data.
+ * - A string with non-alphanumeric characters is not as easily accepted as input.
* - E-mail usually won't line-break if there's no punctuation to break at.
- * - Double-clicking selects the whole number as one word if it's all alphanumeric.
+ * - Double-clicking selects the whole string as one word if it's all alphanumeric.
*/
#ifndef BITCOIN_BASE58_H
#define BITCOIN_BASE58_H
diff --git a/src/bitcoin-cli-res.rc b/src/bitcoin-cli-res.rc
index 4ea1f38e47..1e4aa609bb 100644
--- a/src/bitcoin-cli-res.rc
+++ b/src/bitcoin-cli-res.rc
@@ -17,13 +17,13 @@ BEGIN
BLOCK "040904E4" // U.S. English - multilingual (hex)
BEGIN
VALUE "CompanyName", "Bitcoin"
- VALUE "FileDescription", "Bitcoin-cli (OSS RPC client for Bitcoin)"
+ VALUE "FileDescription", "bitcoin-cli (JSON-RPC client for Bitcoin Core)"
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", "bitcoin-cli"
VALUE "LegalCopyright", COPYRIGHT_STR
VALUE "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php."
VALUE "OriginalFilename", "bitcoin-cli.exe"
- VALUE "ProductName", "Bitcoin-cli"
+ VALUE "ProductName", "bitcoin-cli"
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END
diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp
index 2fa8de6fd8..d451720141 100644
--- a/src/bitcoin-cli.cpp
+++ b/src/bitcoin-cli.cpp
@@ -12,10 +12,9 @@
#include <boost/filesystem/operations.hpp>
-#define _(x) std::string(x) /* Keep the _() around in case gettext or such will be used later to translate non-UI */
+#include "univalue/univalue.h"
using namespace std;
-using namespace json_spirit;
std::string HelpMessageCli()
{
@@ -96,7 +95,7 @@ static bool AppInitRPC(int argc, char* argv[])
return true;
}
-Object CallRPC(const string& strMethod, const Array& params)
+UniValue CallRPC(const string& strMethod, const UniValue& params)
{
if (mapArgs["-rpcuser"] == "" && mapArgs["-rpcpassword"] == "")
throw runtime_error(strprintf(
@@ -144,10 +143,10 @@ Object CallRPC(const string& strMethod, const Array& params)
throw runtime_error("no response from server");
// Parse reply
- Value valReply;
- if (!read_string(strReply, valReply))
+ UniValue valReply(UniValue::VSTR);
+ if (!valReply.read(strReply))
throw runtime_error("couldn't parse reply from server");
- const Object& reply = valReply.get_obj();
+ const UniValue& reply = valReply.get_obj();
if (reply.empty())
throw runtime_error("expected reply to have result, error and id properties");
@@ -172,35 +171,34 @@ int CommandLineRPC(int argc, char *argv[])
// Parameters default to strings
std::vector<std::string> strParams(&argv[2], &argv[argc]);
- Array params = RPCConvertValues(strMethod, strParams);
+ UniValue params = RPCConvertValues(strMethod, strParams);
// Execute and handle connection failures with -rpcwait
const bool fWait = GetBoolArg("-rpcwait", false);
do {
try {
- const Object reply = CallRPC(strMethod, params);
+ const UniValue reply = CallRPC(strMethod, params);
// Parse reply
- const Value& result = find_value(reply, "result");
- const Value& error = find_value(reply, "error");
+ const UniValue& result = find_value(reply, "result");
+ const UniValue& error = find_value(reply, "error");
- if (error.type() != null_type) {
+ if (!error.isNull()) {
// Error
- const int code = find_value(error.get_obj(), "code").get_int();
+ int code = error["code"].get_int();
if (fWait && code == RPC_IN_WARMUP)
throw CConnectionFailed("server in warmup");
- strPrint = "error: " + write_string(error, false);
+ strPrint = "error: " + error.write();
nRet = abs(code);
} else {
// Result
- if (result.type() == null_type)
+ if (result.isNull())
strPrint = "";
- else if (result.type() == str_type)
+ else if (result.isStr())
strPrint = result.get_str();
else
- strPrint = write_string(result, true);
+ strPrint = result.write(2);
}
-
// Connection succeeded, no need to retry.
break;
}
diff --git a/src/bitcoin-tx-res.rc b/src/bitcoin-tx-res.rc
new file mode 100644
index 0000000000..3e49b820bc
--- /dev/null
+++ b/src/bitcoin-tx-res.rc
@@ -0,0 +1,35 @@
+#include <windows.h> // needed for VERSIONINFO
+#include "clientversion.h" // holds the needed client version information
+
+#define VER_PRODUCTVERSION CLIENT_VERSION_MAJOR,CLIENT_VERSION_MINOR,CLIENT_VERSION_REVISION,CLIENT_VERSION_BUILD
+#define VER_PRODUCTVERSION_STR STRINGIZE(CLIENT_VERSION_MAJOR) "." STRINGIZE(CLIENT_VERSION_MINOR) "." STRINGIZE(CLIENT_VERSION_REVISION) "." STRINGIZE(CLIENT_VERSION_BUILD)
+#define VER_FILEVERSION VER_PRODUCTVERSION
+#define VER_FILEVERSION_STR VER_PRODUCTVERSION_STR
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION VER_FILEVERSION
+PRODUCTVERSION VER_PRODUCTVERSION
+FILEOS VOS_NT_WINDOWS32
+FILETYPE VFT_APP
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4" // U.S. English - multilingual (hex)
+ BEGIN
+ VALUE "CompanyName", "Bitcoin"
+ VALUE "FileDescription", "bitcoin-tx (CLI Bitcoin transaction editor utility)"
+ VALUE "FileVersion", VER_FILEVERSION_STR
+ VALUE "InternalName", "bitcoin-tx"
+ VALUE "LegalCopyright", COPYRIGHT_STR
+ VALUE "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php."
+ VALUE "OriginalFilename", "bitcoin-tx.exe"
+ VALUE "ProductName", "bitcoin-tx"
+ VALUE "ProductVersion", VER_PRODUCTVERSION_STR
+ END
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0, 1252 // language neutral - multilingual (decimal)
+ END
+END
diff --git a/src/bitcoin-tx.cpp b/src/bitcoin-tx.cpp
index 78f5c2c4b6..45990f6bd8 100644
--- a/src/bitcoin-tx.cpp
+++ b/src/bitcoin-tx.cpp
@@ -4,18 +4,17 @@
#include "base58.h"
#include "clientversion.h"
-#include "primitives/block.h" // for MAX_BLOCK_SIZE
-#include "primitives/transaction.h"
-#include "core_io.h"
#include "coins.h"
+#include "consensus/consensus.h"
+#include "core_io.h"
#include "keystore.h"
+#include "primitives/transaction.h"
#include "script/script.h"
#include "script/sign.h"
-#include "ui_interface.h" // for _(...)
#include "univalue/univalue.h"
#include "util.h"
-#include "utilstrencodings.h"
#include "utilmoneystr.h"
+#include "utilstrencodings.h"
#include <stdio.h>
@@ -26,7 +25,6 @@ using namespace std;
static bool fCreateBlank;
static map<string,UniValue> registers;
-CClientUIInterface uiInterface;
static bool AppInitRawTx(int argc, char* argv[])
{
@@ -348,7 +346,7 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
UniValue keysObj = registers["privatekeys"];
fGivenKeys = true;
- for (unsigned int kidx = 0; kidx < keysObj.count(); kidx++) {
+ for (unsigned int kidx = 0; kidx < keysObj.size(); kidx++) {
if (!keysObj[kidx].isStr())
throw runtime_error("privatekey not a string");
CBitcoinSecret vchSecret;
@@ -365,7 +363,7 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
throw runtime_error("prevtxs register variable must be set.");
UniValue prevtxsObj = registers["prevtxs"];
{
- for (unsigned int previdx = 0; previdx < prevtxsObj.count(); previdx++) {
+ for (unsigned int previdx = 0; previdx < prevtxsObj.size(); previdx++) {
UniValue prevOut = prevtxsObj[previdx];
if (!prevOut.isObject())
throw runtime_error("expected prevtxs internal object");
@@ -444,9 +442,18 @@ static void MutateTxSign(CMutableTransaction& tx, const string& flagStr)
tx = mergedTx;
}
+class Secp256k1Init
+{
+public:
+ Secp256k1Init() { ECC_Start(); }
+ ~Secp256k1Init() { ECC_Stop(); }
+};
+
static void MutateTx(CMutableTransaction& tx, const string& command,
const string& commandVal)
{
+ boost::scoped_ptr<Secp256k1Init> ecc;
+
if (command == "nversion")
MutateTxVersion(tx, commandVal);
else if (command == "locktime")
@@ -464,8 +471,10 @@ static void MutateTx(CMutableTransaction& tx, const string& command,
else if (command == "outscript")
MutateTxAddOutScript(tx, commandVal);
- else if (command == "sign")
+ else if (command == "sign") {
+ if (!ecc) { ecc.reset(new Secp256k1Init()); }
MutateTxSign(tx, commandVal);
+ }
else if (command == "load")
RegisterLoad(commandVal);
diff --git a/src/bitcoind-res.rc b/src/bitcoind-res.rc
index d183179b17..3a64acd5d1 100644
--- a/src/bitcoind-res.rc
+++ b/src/bitcoind-res.rc
@@ -17,13 +17,13 @@ BEGIN
BLOCK "040904E4" // U.S. English - multilingual (hex)
BEGIN
VALUE "CompanyName", "Bitcoin"
- VALUE "FileDescription", "Bitcoind (OSS daemon/client for Bitcoin)"
+ VALUE "FileDescription", "bitcoind (Bitcoin node with a JSON-RPC server)"
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", "bitcoind"
VALUE "LegalCopyright", COPYRIGHT_STR
VALUE "LegalTrademarks1", "Distributed under the MIT software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php."
VALUE "OriginalFilename", "bitcoind.exe"
- VALUE "ProductName", "Bitcoind"
+ VALUE "ProductName", "bitcoind"
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END
diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp
index a0a96c2dfa..cce687ac98 100644
--- a/src/bitcoind.cpp
+++ b/src/bitcoind.cpp
@@ -8,7 +8,7 @@
#include "init.h"
#include "main.h"
#include "noui.h"
-#include "ui_interface.h"
+#include "scheduler.h"
#include "util.h"
#include <boost/algorithm/string/predicate.hpp>
@@ -21,7 +21,7 @@
*
* \section intro_sec Introduction
*
- * This is the developer documentation of the reference client for an experimental new digital currency called Bitcoin (http://www.bitcoin.org/),
+ * This is the developer documentation of the reference client for an experimental new digital currency called Bitcoin (https://www.bitcoin.org/),
* which enables instant payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer technology to operate
* with no central authority: managing transactions and issuing money are carried out collectively by the network.
*
@@ -56,6 +56,7 @@ void WaitForShutdown(boost::thread_group* threadGroup)
bool AppInit(int argc, char* argv[])
{
boost::thread_group threadGroup;
+ CScheduler scheduler;
bool fRet = false;
@@ -143,7 +144,7 @@ bool AppInit(int argc, char* argv[])
#endif
SoftSetBoolArg("-server", true);
- fRet = AppInit2(threadGroup);
+ fRet = AppInit2(threadGroup, scheduler);
}
catch (const std::exception& e) {
PrintExceptionContinue(&e, "AppInit()");
diff --git a/src/bloom.cpp b/src/bloom.cpp
index e60576f4b4..36cba491c4 100644
--- a/src/bloom.cpp
+++ b/src/bloom.cpp
@@ -21,22 +21,33 @@
using namespace std;
CBloomFilter::CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweakIn, unsigned char nFlagsIn) :
-/**
- * The ideal size for a bloom filter with a given number of elements and false positive rate is:
- * - nElements * log(fp rate) / ln(2)^2
- * We ignore filter parameters which will create a bloom filter larger than the protocol limits
- */
-vData(min((unsigned int)(-1 / LN2SQUARED * nElements * log(nFPRate)), MAX_BLOOM_FILTER_SIZE * 8) / 8),
-/**
- * The ideal number of hash functions is filter size * ln(2) / number of elements
- * Again, we ignore filter parameters which will create a bloom filter with more hash functions than the protocol limits
- * See https://en.wikipedia.org/wiki/Bloom_filter for an explanation of these formulas
- */
-isFull(false),
-isEmpty(false),
-nHashFuncs(min((unsigned int)(vData.size() * 8 / nElements * LN2), MAX_HASH_FUNCS)),
-nTweak(nTweakIn),
-nFlags(nFlagsIn)
+ /**
+ * The ideal size for a bloom filter with a given number of elements and false positive rate is:
+ * - nElements * log(fp rate) / ln(2)^2
+ * We ignore filter parameters which will create a bloom filter larger than the protocol limits
+ */
+ vData(min((unsigned int)(-1 / LN2SQUARED * nElements * log(nFPRate)), MAX_BLOOM_FILTER_SIZE * 8) / 8),
+ /**
+ * The ideal number of hash functions is filter size * ln(2) / number of elements
+ * Again, we ignore filter parameters which will create a bloom filter with more hash functions than the protocol limits
+ * See https://en.wikipedia.org/wiki/Bloom_filter for an explanation of these formulas
+ */
+ isFull(false),
+ isEmpty(false),
+ nHashFuncs(min((unsigned int)(vData.size() * 8 / nElements * LN2), MAX_HASH_FUNCS)),
+ nTweak(nTweakIn),
+ nFlags(nFlagsIn)
+{
+}
+
+// Private constructor used by CRollingBloomFilter
+CBloomFilter::CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweakIn) :
+ vData((unsigned int)(-1 / LN2SQUARED * nElements * log(nFPRate)) / 8),
+ isFull(false),
+ isEmpty(true),
+ nHashFuncs((unsigned int)(vData.size() * 8 / nElements * LN2)),
+ nTweak(nTweakIn),
+ nFlags(BLOOM_UPDATE_NONE)
{
}
@@ -197,3 +208,43 @@ void CBloomFilter::UpdateEmptyFull()
isFull = full;
isEmpty = empty;
}
+
+CRollingBloomFilter::CRollingBloomFilter(unsigned int nElements, double fpRate, unsigned int nTweak) :
+ b1(nElements * 2, fpRate, nTweak), b2(nElements * 2, fpRate, nTweak)
+{
+ // Implemented using two bloom filters of 2 * nElements each.
+ // We fill them up, and clear them, staggered, every nElements
+ // inserted, so at least one always contains the last nElements
+ // inserted.
+ nBloomSize = nElements * 2;
+ nInsertions = 0;
+}
+
+void CRollingBloomFilter::insert(const std::vector<unsigned char>& vKey)
+{
+ if (nInsertions == 0) {
+ b1.clear();
+ } else if (nInsertions == nBloomSize / 2) {
+ b2.clear();
+ }
+ b1.insert(vKey);
+ b2.insert(vKey);
+ if (++nInsertions == nBloomSize) {
+ nInsertions = 0;
+ }
+}
+
+bool CRollingBloomFilter::contains(const std::vector<unsigned char>& vKey) const
+{
+ if (nInsertions < nBloomSize / 2) {
+ return b2.contains(vKey);
+ }
+ return b1.contains(vKey);
+}
+
+void CRollingBloomFilter::clear()
+{
+ b1.clear();
+ b2.clear();
+ nInsertions = 0;
+}
diff --git a/src/bloom.h b/src/bloom.h
index 191ffa19b3..bb17f59c86 100644
--- a/src/bloom.h
+++ b/src/bloom.h
@@ -32,14 +32,14 @@ enum bloomflags
/**
* BloomFilter is a probabilistic filter which SPV clients provide
- * so that we can filter the transactions we sends them.
+ * so that we can filter the transactions we send them.
*
* This allows for significantly more efficient transaction and block downloads.
*
- * Because bloom filters are probabilistic, an SPV node can increase the false-
- * positive rate, making us send them transactions which aren't actually theirs,
+ * Because bloom filters are probabilistic, a SPV node can increase the false-
+ * positive rate, making us send it transactions which aren't actually its,
* allowing clients to trade more bandwidth for more privacy by obfuscating which
- * keys are owned by them.
+ * keys are controlled by them.
*/
class CBloomFilter
{
@@ -53,6 +53,10 @@ private:
unsigned int Hash(unsigned int nHashNum, const std::vector<unsigned char>& vDataToHash) const;
+ // Private constructor for CRollingBloomFilter, no restrictions on size
+ CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweak);
+ friend class CRollingBloomFilter;
+
public:
/**
* Creates a new bloom filter which will provide the given fp rate when filled with the given number of elements
@@ -97,4 +101,28 @@ public:
void UpdateEmptyFull();
};
+/**
+ * RollingBloomFilter is a probabilistic "keep track of most recently inserted" set.
+ * Construct it with the number of items to keep track of, and a false-positive rate.
+ *
+ * contains(item) will always return true if item was one of the last N things
+ * insert()'ed ... but may also return true for items that were not inserted.
+ */
+class CRollingBloomFilter
+{
+public:
+ CRollingBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweak);
+
+ void insert(const std::vector<unsigned char>& vKey);
+ bool contains(const std::vector<unsigned char>& vKey) const;
+
+ void clear();
+
+private:
+ unsigned int nBloomSize;
+ unsigned int nInsertions;
+ CBloomFilter b1, b2;
+};
+
+
#endif // BITCOIN_BLOOM_H
diff --git a/src/chain.cpp b/src/chain.cpp
index 719256106e..5b8ce076c4 100644
--- a/src/chain.cpp
+++ b/src/chain.cpp
@@ -82,9 +82,10 @@ CBlockIndex* CBlockIndex::GetAncestor(int height)
while (heightWalk > height) {
int heightSkip = GetSkipHeight(heightWalk);
int heightSkipPrev = GetSkipHeight(heightWalk - 1);
- if (heightSkip == height ||
- (heightSkip > height && !(heightSkipPrev < heightSkip - 2 &&
- heightSkipPrev >= height))) {
+ if (pindexWalk->pskip != NULL &&
+ (heightSkip == height ||
+ (heightSkip > height && !(heightSkipPrev < heightSkip - 2 &&
+ heightSkipPrev >= height)))) {
// Only follow pskip if pprev->pskip isn't better than pskip->pprev.
pindexWalk = pindexWalk->pskip;
heightWalk = heightSkip;
diff --git a/src/chain.h b/src/chain.h
index 02f53cd2f2..01be2d6e5c 100644
--- a/src/chain.h
+++ b/src/chain.h
@@ -74,7 +74,7 @@ enum BlockStatus {
*/
BLOCK_VALID_TRANSACTIONS = 3,
- //! Outputs do not overspend inputs, no double spends, coinbase output ok, immature coinbase spends, BIP30.
+ //! Outputs do not overspend inputs, no double spends, coinbase output ok, no immature coinbase spends, BIP30.
//! Implies all parents are also at least CHAIN.
BLOCK_VALID_CHAIN = 4,
diff --git a/src/chainparams.cpp b/src/chainparams.cpp
index 8633d51b2f..7785417518 100644
--- a/src/chainparams.cpp
+++ b/src/chainparams.cpp
@@ -5,7 +5,6 @@
#include "chainparams.h"
-#include "random.h"
#include "util.h"
#include "utilstrencodings.h"
@@ -15,35 +14,11 @@
using namespace std;
-struct SeedSpec6 {
- uint8_t addr[16];
- uint16_t port;
-};
-
#include "chainparamsseeds.h"
/**
* Main network
*/
-
-//! Convert the pnSeeds6 array into usable address objects.
-static void convertSeed6(std::vector<CAddress> &vSeedsOut, const SeedSpec6 *data, unsigned int count)
-{
- // It'll only connect to one or two seed nodes because once it connects,
- // it'll get a pile of addresses with newer timestamps.
- // Seed nodes are given a random 'last seen time' of between one and two
- // weeks ago.
- const int64_t nOneWeek = 7*24*60*60;
- for (unsigned int i = 0; i < count; i++)
- {
- struct in6_addr ip;
- memcpy(&ip, data[i].addr, sizeof(ip));
- CAddress addr(CService(ip, data[i].port));
- addr.nTime = GetTime() - GetRand(nOneWeek) - nOneWeek;
- vSeedsOut.push_back(addr);
- }
-}
-
/**
* What makes a good checkpoint block?
* + Is surrounded by blocks with reasonable timestamps
@@ -51,51 +26,6 @@ static void convertSeed6(std::vector<CAddress> &vSeedsOut, const SeedSpec6 *data
* timestamp before)
* + Contains no strange transactions
*/
-static Checkpoints::MapCheckpoints mapCheckpoints =
- boost::assign::map_list_of
- ( 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"))
- ;
-static const Checkpoints::CCheckpointData data = {
- &mapCheckpoints,
- 1397080064, // * UNIX timestamp of last checkpoint block
- 36544669, // * total number of transactions between genesis and last checkpoint
- // (the tx=... number in the SetBestChain debug.log lines)
- 60000.0 // * estimated number of transactions per day after checkpoint
- };
-
-static Checkpoints::MapCheckpoints mapCheckpointsTestnet =
- boost::assign::map_list_of
- ( 546, uint256S("000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70"))
- ;
-static const Checkpoints::CCheckpointData dataTestnet = {
- &mapCheckpointsTestnet,
- 1337966069,
- 1488,
- 300
- };
-
-static Checkpoints::MapCheckpoints mapCheckpointsRegtest =
- boost::assign::map_list_of
- ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"))
- ;
-static const Checkpoints::CCheckpointData dataRegtest = {
- &mapCheckpointsRegtest,
- 0,
- 0,
- 0
- };
class CMainParams : public CChainParams {
public:
@@ -105,14 +35,14 @@ public:
consensus.nMajorityEnforceBlockUpgrade = 750;
consensus.nMajorityRejectBlockOutdated = 950;
consensus.nMajorityWindow = 1000;
- consensus.powLimit = ~arith_uint256(0) >> 32;
+ consensus.powLimit = uint256S("00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
consensus.nPowTargetTimespan = 14 * 24 * 60 * 60; // two weeks
consensus.nPowTargetSpacing = 10 * 60;
consensus.fPowAllowMinDifficultyBlocks = false;
/**
* The message start string is designed to be unlikely to occur in normal data.
* The characters are rarely used upper ASCII, not valid as UTF-8, and produce
- * a large 4-byte int at any alignment.
+ * a large 32-bit integer with any alignment.
*/
pchMessageStart[0] = 0xf9;
pchMessageStart[1] = 0xbe;
@@ -121,11 +51,13 @@ public:
vAlertPubKey = ParseHex("04fc9702847840aaf195de8442ebecedf5b095cdbb9bc716bda9110971b28a49e0ead8564ff0db22209e0374782c093bb899692d524e9d6a6956e7c5ecbcd68284");
nDefaultPort = 8333;
nMinerThreads = 0;
+ nPruneAfterHeight = 100000;
/**
- * Build the genesis block. Note that the output of the genesis coinbase cannot
- * be spent as it did not originally exist in the database.
- *
+ * Build the genesis block. Note that the output of its generation
+ * transaction cannot be spent since it did not originally exist in the
+ * database.
+ *
* CBlock(hash=000000000019d6, ver=1, hashPrevBlock=00000000000000, hashMerkleRoot=4a5e1e, nTime=1231006505, nBits=1d00ffff, nNonce=2083236893, vtx=1)
* CTransaction(hash=4a5e1e, ver=1, vin.size=1, vout.size=1, nLockTime=0)
* CTxIn(COutPoint(000000, -1), coinbase 04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73)
@@ -134,6 +66,7 @@ public:
*/
const char* pszTimestamp = "The Times 03/Jan/2009 Chancellor on brink of second bailout for banks";
CMutableTransaction txNew;
+ txNew.nVersion = 1;
txNew.vin.resize(1);
txNew.vout.resize(1);
txNew.vin[0].scriptSig = CScript() << 486604799 << CScriptNum(4) << vector<unsigned char>((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp));
@@ -151,11 +84,12 @@ public:
assert(consensus.hashGenesisBlock == uint256S("0x000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"));
assert(genesis.hashMerkleRoot == uint256S("0x4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"));
- vSeeds.push_back(CDNSSeedData("bitcoin.sipa.be", "seed.bitcoin.sipa.be"));
- vSeeds.push_back(CDNSSeedData("bluematt.me", "dnsseed.bluematt.me"));
- vSeeds.push_back(CDNSSeedData("dashjr.org", "dnsseed.bitcoin.dashjr.org"));
- vSeeds.push_back(CDNSSeedData("bitcoinstats.com", "seed.bitcoinstats.com"));
- vSeeds.push_back(CDNSSeedData("xf2.org", "bitseed.xf2.org"));
+ vSeeds.push_back(CDNSSeedData("bitcoin.sipa.be", "seed.bitcoin.sipa.be")); // Pieter Wuille
+ vSeeds.push_back(CDNSSeedData("bluematt.me", "dnsseed.bluematt.me")); // Matt Corallo
+ vSeeds.push_back(CDNSSeedData("dashjr.org", "dnsseed.bitcoin.dashjr.org")); // Luke Dashjr
+ vSeeds.push_back(CDNSSeedData("bitcoinstats.com", "seed.bitcoinstats.com")); // Christian Decker
+ vSeeds.push_back(CDNSSeedData("xf2.org", "bitseed.xf2.org")); // Jeff Garzik
+ vSeeds.push_back(CDNSSeedData("bitcoin.jonasschnelli.ch", "seed.bitcoin.jonasschnelli.ch")); // Jonas Schnelli
base58Prefixes[PUBKEY_ADDRESS] = std::vector<unsigned char>(1,0);
base58Prefixes[SCRIPT_ADDRESS] = std::vector<unsigned char>(1,5);
@@ -163,7 +97,7 @@ public:
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x88)(0xB2)(0x1E).convert_to_container<std::vector<unsigned char> >();
base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x88)(0xAD)(0xE4).convert_to_container<std::vector<unsigned char> >();
- convertSeed6(vFixedSeeds, pnSeed6_main, ARRAYLEN(pnSeed6_main));
+ vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_main, pnSeed6_main + ARRAYLEN(pnSeed6_main));
fRequireRPCPassword = true;
fMiningRequiresPeers = true;
@@ -171,11 +105,27 @@ public:
fRequireStandard = true;
fMineBlocksOnDemand = false;
fTestnetToBeDeprecatedFieldRPC = false;
- }
- const Checkpoints::CCheckpointData& Checkpoints() const
- {
- return data;
+ checkpointData = (Checkpoints::CCheckpointData) {
+ boost::assign::map_list_of
+ ( 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")),
+ 1397080064, // * UNIX timestamp of last checkpoint block
+ 36544669, // * total number of transactions between genesis and last checkpoint
+ // (the tx=... number in the SetBestChain debug.log lines)
+ 60000.0 // * estimated number of transactions per day after checkpoint
+ };
}
};
static CMainParams mainParams;
@@ -198,6 +148,7 @@ public:
vAlertPubKey = ParseHex("04302390343f91cc401d56d68b123028bf52e5fca1939df127f63c6467cdf9c8e2c14b61104cf817d0b780da337893ecc4aaff1309e536162dabbdb45200ca2b0a");
nDefaultPort = 18333;
nMinerThreads = 0;
+ nPruneAfterHeight = 1000;
//! Modify the testnet genesis block so the timestamp is valid for a later start.
genesis.nTime = 1296688602;
@@ -218,7 +169,7 @@ public:
base58Prefixes[EXT_PUBLIC_KEY] = boost::assign::list_of(0x04)(0x35)(0x87)(0xCF).convert_to_container<std::vector<unsigned char> >();
base58Prefixes[EXT_SECRET_KEY] = boost::assign::list_of(0x04)(0x35)(0x83)(0x94).convert_to_container<std::vector<unsigned char> >();
- convertSeed6(vFixedSeeds, pnSeed6_test, ARRAYLEN(pnSeed6_test));
+ vFixedSeeds = std::vector<SeedSpec6>(pnSeed6_test, pnSeed6_test + ARRAYLEN(pnSeed6_test));
fRequireRPCPassword = true;
fMiningRequiresPeers = true;
@@ -226,10 +177,15 @@ public:
fRequireStandard = false;
fMineBlocksOnDemand = false;
fTestnetToBeDeprecatedFieldRPC = true;
- }
- const Checkpoints::CCheckpointData& Checkpoints() const
- {
- return dataTestnet;
+
+ checkpointData = (Checkpoints::CCheckpointData) {
+ boost::assign::map_list_of
+ ( 546, uint256S("000000002a936ca763904c3c35fce2f3556c559c0214345d31b1bcebf76acb70")),
+ 1337966069,
+ 1488,
+ 300
+ };
+
}
};
static CTestNetParams testNetParams;
@@ -245,7 +201,7 @@ public:
consensus.nMajorityEnforceBlockUpgrade = 750;
consensus.nMajorityRejectBlockOutdated = 950;
consensus.nMajorityWindow = 1000;
- consensus.powLimit = ~arith_uint256(0) >> 1;
+ consensus.powLimit = uint256S("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");
pchMessageStart[0] = 0xfa;
pchMessageStart[1] = 0xbf;
pchMessageStart[2] = 0xb5;
@@ -257,6 +213,7 @@ public:
consensus.hashGenesisBlock = genesis.GetHash();
nDefaultPort = 18444;
assert(consensus.hashGenesisBlock == uint256S("0x0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206"));
+ nPruneAfterHeight = 1000;
vFixedSeeds.clear(); //! Regtest mode doesn't have any fixed seeds.
vSeeds.clear(); //! Regtest mode doesn't have any DNS seeds.
@@ -267,10 +224,14 @@ public:
fRequireStandard = false;
fMineBlocksOnDemand = true;
fTestnetToBeDeprecatedFieldRPC = false;
- }
- const Checkpoints::CCheckpointData& Checkpoints() const
- {
- return dataRegtest;
+
+ checkpointData = (Checkpoints::CCheckpointData){
+ boost::assign::map_list_of
+ ( 0, uint256S("0f9188f13cb7b2c71f2a335e3a4fc328bf5beb436012afca590b1a11466e2206")),
+ 0,
+ 0,
+ 0
+ };
}
};
static CRegTestParams regTestParams;
diff --git a/src/chainparams.h b/src/chainparams.h
index d0613beb45..8044b553e1 100644
--- a/src/chainparams.h
+++ b/src/chainparams.h
@@ -6,7 +6,6 @@
#ifndef BITCOIN_CHAINPARAMS_H
#define BITCOIN_CHAINPARAMS_H
-#include "arith_uint256.h"
#include "chainparamsbase.h"
#include "checkpoints.h"
#include "consensus/params.h"
@@ -20,6 +19,12 @@ struct CDNSSeedData {
CDNSSeedData(const std::string &strName, const std::string &strHost) : name(strName), host(strHost) {}
};
+struct SeedSpec6 {
+ uint8_t addr[16];
+ uint16_t port;
+};
+
+
/**
* CChainParams defines various tweakable parameters of a given instance of the
* Bitcoin system. There are three: the main network on which people trade goods
@@ -41,15 +46,9 @@ public:
};
const Consensus::Params& GetConsensus() const { return consensus; }
- const uint256& HashGenesisBlock() const { return consensus.hashGenesisBlock; }
const CMessageHeader::MessageStartChars& MessageStart() const { return pchMessageStart; }
const std::vector<unsigned char>& AlertKey() const { return vAlertPubKey; }
int GetDefaultPort() const { return nDefaultPort; }
- const arith_uint256& ProofOfWorkLimit() const { return consensus.powLimit; }
- int SubsidyHalvingInterval() const { return consensus.nSubsidyHalvingInterval; }
- int EnforceBlockUpgradeMajority() const { return consensus.nMajorityEnforceBlockUpgrade; }
- int RejectBlockOutdatedMajority() const { return consensus.nMajorityRejectBlockOutdated; }
- int ToCheckBlockUpgradeMajority() const { return consensus.nMajorityWindow; }
/** Used if GenerateBitcoins is called with a negative number of threads */
int DefaultMinerThreads() const { return nMinerThreads; }
@@ -59,13 +58,9 @@ public:
bool MiningRequiresPeers() const { return fMiningRequiresPeers; }
/** Default value for -checkmempool and -checkblockindex argument */
bool DefaultConsistencyChecks() const { return fDefaultConsistencyChecks; }
- /** Allow mining of a min-difficulty block */
- bool AllowMinDifficultyBlocks() const { return consensus.fPowAllowMinDifficultyBlocks; }
- /** Make standard checks */
+ /** Policy: Filter transactions that do not match well-defined patterns */
bool RequireStandard() const { return fRequireStandard; }
- int64_t TargetTimespan() const { return consensus.nPowTargetTimespan; }
- int64_t TargetSpacing() const { return consensus.nPowTargetSpacing; }
- int64_t DifficultyAdjustmentInterval() const { return consensus.nPowTargetTimespan / consensus.nPowTargetSpacing; }
+ int64_t PruneAfterHeight() const { return nPruneAfterHeight; }
/** Make miner stop after a block is found. In RPC, don't return until nGenProcLimit blocks are generated */
bool MineBlocksOnDemand() const { return fMineBlocksOnDemand; }
/** In the future use NetworkIDString() for RPC fields */
@@ -74,8 +69,8 @@ public:
std::string NetworkIDString() const { return strNetworkID; }
const std::vector<CDNSSeedData>& DNSSeeds() const { return vSeeds; }
const std::vector<unsigned char>& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; }
- const std::vector<CAddress>& FixedSeeds() const { return vFixedSeeds; }
- virtual const Checkpoints::CCheckpointData& Checkpoints() const = 0;
+ const std::vector<SeedSpec6>& FixedSeeds() const { return vFixedSeeds; }
+ const Checkpoints::CCheckpointData& Checkpoints() const { return checkpointData; }
protected:
CChainParams() {}
@@ -85,22 +80,24 @@ protected:
std::vector<unsigned char> vAlertPubKey;
int nDefaultPort;
int nMinerThreads;
+ uint64_t nPruneAfterHeight;
std::vector<CDNSSeedData> vSeeds;
std::vector<unsigned char> base58Prefixes[MAX_BASE58_TYPES];
std::string strNetworkID;
CBlock genesis;
- std::vector<CAddress> vFixedSeeds;
+ std::vector<SeedSpec6> vFixedSeeds;
bool fRequireRPCPassword;
bool fMiningRequiresPeers;
bool fDefaultConsistencyChecks;
bool fRequireStandard;
bool fMineBlocksOnDemand;
bool fTestnetToBeDeprecatedFieldRPC;
+ Checkpoints::CCheckpointData checkpointData;
};
/**
- * Return the currently selected parameters. This won't change after app startup
- * outside of the unit tests.
+ * Return the currently selected parameters. This won't change after app
+ * startup, except for unit tests.
*/
const CChainParams &Params();
diff --git a/src/chainparamsbase.h b/src/chainparamsbase.h
index 421a3a06ff..4369d0aef7 100644
--- a/src/chainparamsbase.h
+++ b/src/chainparamsbase.h
@@ -34,8 +34,8 @@ protected:
};
/**
- * Return the currently selected parameters. This won't change after app startup
- * outside of the unit tests.
+ * Return the currently selected parameters. This won't change after app
+ * startup, except for unit tests.
*/
const CBaseChainParams& BaseParams();
diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h
index 6b6e5103f5..423362859f 100644
--- a/src/chainparamsseeds.h
+++ b/src/chainparamsseeds.h
@@ -2,551 +2,900 @@
#define BITCOIN_CHAINPARAMSSEEDS_H
/**
* List of fixed seed nodes for the bitcoin network
- * AUTOGENERATED by share/seeds/generate-seeds.py
+ * AUTOGENERATED by contrib/seeds/generate-seeds.py
*
* Each line contains a 16-byte IPv6 address and a port.
* IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly.
*/
static SeedSpec6 pnSeed6_main[] = {
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x01,0x21,0xc5,0x6e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x01,0x22,0xb4,0xf5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x01,0x22,0xa8,0x80}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x01,0xca,0x80,0xda}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x02,0x23,0xc3,0x19}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x64,0x7b,0x13}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xaf,0x91,0xa9}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xc7,0x85,0xc1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xc7,0x97,0x0a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xe4,0x01,0xe6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x02,0x1e,0x00,0xd2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x09,0x60,0xcb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x2d,0x47,0x82}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x2d,0x62,0x8d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x66,0x91,0x44}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x87,0xa0,0x4d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xbd,0x86,0xf6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xc7,0xa4,0x84}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0xf9,0x87,0x66}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x08,0x13,0x2c,0x6e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x08,0x16,0xe6,0x08}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x0e,0xc8,0xc8,0x91}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0xe4,0x00,0xbc}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x12,0xe4,0x00,0xc8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x1e,0xf3,0x99}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x58,0xe8,0x31}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x63,0x69,0x09}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xe2,0x89,0xd0}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xe3,0xb1,0xa1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xe3,0xbf,0x32}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x18,0xa8,0x61}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x1c,0x23,0xe3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x5c,0x4c,0xaa}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0x63,0x40,0x77}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xe4,0xa6,0x80}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xe5,0x2d,0x20}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xec,0x90,0x45}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xfd,0x94,0x71}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xfd,0xf1,0x16}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x17,0xff,0xe3,0xe7}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x14,0xcd,0xde}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x17,0x78,0xfc}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x08,0x69,0x80}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x10,0x45,0x89}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x5e,0x62,0x60}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x62,0x5f,0xc9}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x6f,0x5a,0x37}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x77,0x77,0x69}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x8a,0x19,0x95}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x03,0xd6,0x2d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xba,0x57,0x2e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xba,0x65,0x62}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xba,0xfa,0xba}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xcc,0x99,0x6b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x2c,0x10,0xe7}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x2c,0x2c,0x0b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x78,0xa8,0xcc}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0x8f,0x56,0x1a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xbb,0x4b,0x18}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xbc,0x44,0xa9}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xc0,0x5f,0x96}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xc9,0xf6,0x74}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xcd,0x0a,0x8c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x0a,0xd2,0x11}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x13,0x8a,0x9a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xcc,0x7b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xcd,0x43}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x66,0x76,0x07}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x76,0xa6,0xe4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0x7a,0x85,0x31}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xa6,0x61,0xa2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xd5,0xeb,0xf2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe2,0x6b,0x40}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x18,0xe4,0xc0,0xab}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1b,0x8c,0x85,0x12}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x29,0x28,0x19}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0x2b,0x65,0x3b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xb8,0xc3,0xb5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x1f,0xc1,0x8b,0x42}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xc8,0x46,0x66}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x25,0xcd,0x0a,0x97}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2a,0x03,0x6a,0xe3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2a,0x3c,0x85,0x6a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x38,0x55,0xe7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x38,0x66,0xe4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2d,0x4f,0x82,0xeb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x1c,0xcc,0x3d}, 11101},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x26,0xeb,0xe5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x3b,0x02,0x4a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0x84,0x25}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0x65,0xa8,0x32}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa3,0x4c,0xe6}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0xa2,0x5b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xad,0xbe,0x32}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xa6,0xa1,0x67}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xb6,0x84,0x64}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xdf,0x24,0x5e}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe3,0x42,0x84}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe5,0xee,0xbb}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xec,0x74,0xd1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2f,0x37,0x0e,0x41}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x07,0xfc,0xe5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x2e,0x9f,0x5b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x4e,0x31,0xb5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x4e,0xe7,0x39}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x4f,0x99,0x41}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x74,0x22,0x2c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x7e,0x56,0xfd}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x8e,0x29,0x17}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0xc7,0x71,0xc1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0xc8,0x4e,0x6b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0xce,0x8a,0xb1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0xfc,0x34,0x31}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa5,0x19,0x4b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa9,0x6b,0x28}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xb3,0xbe,0x38}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xbb,0x52,0x79}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xf6,0x55,0xf6}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0x4a,0x07,0xcd}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0x60,0xb7,0x79}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x3e,0x3a,0x26}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x3f,0x5b,0x48}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x3f,0x5b,0x70}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x48,0xd3,0xe4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x2b,0x28,0x9a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xe3,0x42,0x8a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xef,0x6b,0x4a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xf9,0x27,0x64}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x2e,0xfa,0x62,0x6c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x07,0x25,0x72}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x51,0x35,0x97}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x73,0x2b,0xfd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x74,0x14,0x57}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x74,0x21,0x5c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x7d,0xa7,0xf5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0x8f,0x09,0x33}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x32,0xbc,0xc0,0x85}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x4d,0xa2,0x4c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0x99,0x61,0x6d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x36,0xa5,0xc0,0x7d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3a,0x60,0x69,0x55}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3b,0xa7,0xc4,0x87}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3c,0x1d,0xe3,0xa3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3d,0x23,0xe1,0x13}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x2b,0x82,0xb2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x50,0xb9,0xd5}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0x6d,0x31,0x1a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xad,0x8b,0x3a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xb5,0xee,0xba}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0x72,0x7f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3f,0x8d,0xe4,0x8a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3f,0x99,0xd5,0x4e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3f,0xdf,0x54,0x91}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3f,0xfb,0x58,0x70}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x1f,0x6e,0x32}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x22,0x79,0x2d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x72,0x06,0x2a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x8c,0x7d,0x62}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xca,0x00,0x61}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0x42,0xe3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x3e,0xd2,0xc0,0xa9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x4a,0x62,0xcd}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0x9c,0xc1,0x64}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x1e,0x2f,0x74}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x23,0x84,0xb1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0xcb,0x66,0x56}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x40,0xe5,0x8e,0x30}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x60,0xc1,0xa5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x41,0x6f,0xbd,0x1a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x44,0x0a,0x1e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x72,0x21,0xfa}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x82,0x2e,0x3f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xaf,0xd7,0x87}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xbe,0xfd,0xa5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfe}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xf4,0x62,0x6f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xa2,0xee,0x1e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xa9,0xff,0x11}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xb7,0xad,0x19}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x1e,0x03,0x07}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x72,0x21,0x31}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x76,0x85,0xc2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0x87,0x0a,0x7e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xac,0x0a,0x04}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfa}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xc2,0x26,0xfd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x42,0xd7,0xc0,0x68}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0x3c,0x62,0x73}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xa4,0x23,0x24}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xbf,0xa2,0xf4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xcf,0xc3,0x4d}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xdb,0xe9,0x8c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xe3,0xf0,0x73}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xf7,0xde,0x47}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x2b,0x72,0x42}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x34,0x21,0x24}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0xc6,0xf5,0xf1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x0c,0xe2,0xa5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x0d,0xc6,0xbc}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x0f,0xb3,0x3e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x27,0xef,0x2f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x2f,0x2d,0x57}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x3e,0xd9,0xce}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x40,0x2a,0x1f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x40,0x51,0x3d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x43,0xdb,0xc8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x5a,0x84,0x9d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x5e,0x1e,0xb1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x88,0xaf,0xf1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x3d,0x61,0xe4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x7b,0x76,0x84}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x3b,0x98,0xb6}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xc6,0xf8,0x97}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xc8,0xf2,0x59}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xe1,0xb3,0x9d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x0e,0xbb,0x33}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x26,0x22,0xb4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x34,0x48,0xbb}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x5b,0x90,0xb6}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xa7,0x31,0xd9}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xc9,0xf3,0x37}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xdf,0x3c,0xf9}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xe4,0x99,0x66}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x1a,0x65,0xe4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x32,0x9e,0xc8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xb5,0xcc,0xaa}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xdd,0xc1,0x37}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x43,0xe4,0xa2,0xe4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x32,0x43,0xc7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x3e,0x03,0xcb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x41,0xcd,0xe2}, 9000},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x6a,0x2a,0xbf}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0x96,0xb5,0xc6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0xc4,0xc4,0x6a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x44,0xe0,0xc2,0x51}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x2e,0x05,0xc2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x32,0xab,0xee}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x40,0x2b,0x98}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x41,0x29,0x0d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x5a,0x84,0xc8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x8f,0x01,0xf3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0x92,0x62,0xd8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xa5,0xf6,0x26}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xcf,0x06,0x87}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x45,0xfb,0xd0,0x1a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x26,0x01,0x65}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x26,0x09,0x42}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x46,0x5a,0x02,0x12}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0x3a,0xe4,0xe2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xc7,0x0b,0xbd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xc7,0xc1,0xca}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xcd,0xe8,0xb5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x47,0xec,0xc8,0xa2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x18,0x49,0xba}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x34,0x82,0x6e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0x35,0x6f,0x25}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x48,0xeb,0x26,0x46}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x1f,0xab,0x95}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x20,0x89,0x48}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0x89,0x85,0xee}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xb5,0xc0,0x67}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xbe,0x02,0x3c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xc3,0xc0,0x89}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x49,0xde,0x23,0x75}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x39,0xc7,0xb4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x3f,0xde,0xe2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x51,0xe7,0x15}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0xc1,0x7e,0x52}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0xcf,0xeb,0xa4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x53,0xc5,0x72}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x90,0x72,0x09}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x70,0x05,0xf7}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xae,0x14,0xf7}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x25,0xf0,0x8e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x39,0xca,0x6b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xac,0x7b,0x35}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xdd,0x5b,0xfd}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xeb,0x30,0x30}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xf5,0x4e,0x02}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x08,0x3a,0xf9}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x1b,0xbf,0xb6}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x81,0xec,0x8d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x83,0x58,0x2f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x9d,0xcd,0x06}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x52,0xe9,0xcd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x55,0x42,0x52}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x65,0xe0,0x7f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x71,0x45,0x10}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0x7a,0xeb,0x44}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0xc1,0x44,0x8d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4a,0xd0,0xa4,0xdb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x64,0x25,0x7a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0x91,0x95,0xa9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4b,0xa8,0x22,0x14}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x14,0x2c,0xf0}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0x64,0x46,0x11}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xa8,0x03,0xef}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4c,0xba,0x8c,0x67}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x5c,0x44,0xdd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x6d,0x65,0x8e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0x6e,0x0b,0x56}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4d,0xf2,0x6c,0x12}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x2e,0x60,0x96}, 9020},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4e,0x54,0x64,0x5f}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x84,0xe6,0x90}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x8f,0xbc,0x9b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xa0,0xdd,0x8c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xa1,0x6f,0x72}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x64,0xbd,0x03}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0x93,0x8c,0x79}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xcb,0x4b,0x85}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xdc,0x63,0xe3}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xde,0x14,0xa9}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xf1,0x01,0x07}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x17,0xbf,0xf3}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x26,0x0b,0xca}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0x85,0x2b,0x3f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xa0,0x4c,0x99}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xa9,0x22,0x18}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x4f,0xbc,0x07,0x4e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xd9,0xe2,0x19}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xdf,0x64,0xb3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x50,0xf0,0x81,0xdd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x01,0xad,0xf3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x07,0x0b,0x32}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x07,0x10,0x11}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x42,0x6f,0x03}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x50,0x09,0x47}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x6e,0xd5,0xa5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x85,0x9b,0xed}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0x8c,0x2b,0x8a}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xab,0x22,0x25}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xb5,0x9b,0xb4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x27,0x9c,0x89}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x49,0xa1,0x5f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x82,0x2d,0x28}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xa5,0x99,0x2f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xa8,0x80,0x85}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xb3,0xe1,0x76}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc2,0xf5,0x9e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xae,0xf7,0x32}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xb5,0x9b,0x35}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xb8,0x05,0xfd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xbb,0x45,0x82}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x51,0xe6,0x03,0x54}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x2a,0x80,0x33}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x4a,0xe2,0x15}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0x8e,0x4b,0x32}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc7,0x66,0x0a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xd3,0x1e,0xf3}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xd9,0x85,0x91}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xc8,0xcd,0x1e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x6c,0x15}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x80,0x23}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xdd,0x83,0xb1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xe9,0xe1,0xcd}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x00,0xf9,0x92}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x59,0x1f,0xf9}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x80,0x1d,0xe7}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x80,0xfd,0x8e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x8f,0x82,0x38}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x96,0x02,0x63}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xee,0x7c,0x29}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x52,0xf2,0x00,0xf5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x4c,0x7b,0x6e}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0x96,0x09,0xc4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa1,0x40,0x2d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xd4,0x67,0xd4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xd4,0x6f,0x72}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xf6,0x4b,0x08}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xfe,0x51,0x1f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xfe,0x96,0x36}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa2,0xc4,0xc0}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xa2,0xea,0xe0}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xaa,0x68,0x5b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x53,0xff,0x42,0x76}, 8334},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x02,0x22,0x68}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x0f,0x3d,0x3c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x11,0x19,0x87}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x2a,0x90,0x13}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd4,0xd2,0x87}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd7,0xa5,0xe7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x2d,0x62,0x5b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0x2f,0xa1,0x96}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd4,0xc0,0x83}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xd7,0xa9,0x65}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xee,0x8c,0xb0}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xf0,0x1f,0xb8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x19,0xd6,0x89}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x8b,0xa3,0x84}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x54,0xf5,0x47,0x1f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x11,0x04,0xd4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x72,0x80,0x86}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0x9f,0xed,0xbf}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xa6,0x82,0xbd}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xc7,0x04,0xe4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0x3d,0xd1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0x6c,0x4d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x7b,0x10,0x11}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0x42,0xa8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xd6,0xc3,0xd2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x55,0xe5,0x00,0x49}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x56,0x15,0x60,0x2d}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x30,0x2a,0xc7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x51,0x8f,0x52}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x51,0xfb,0x48}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x68,0x18,0xb9}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x68,0xa8,0x68}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xe5,0x49,0xab}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0xec,0xc4,0x4d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x61,0x38,0x62}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x86,0xb2,0x59}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x96,0xe9,0x13}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xa8,0x85,0x03}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd0,0x12,0xf6}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd0,0x21,0xca}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x12,0x1c,0x15}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x55,0xdc,0x54}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x75,0xea,0x47}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x76,0x60,0xc5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x91,0x0c,0x39}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x57,0x9f,0xaa,0xbe}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0x96,0xa8,0xa0}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd0,0x00,0x4f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd0,0x00,0x95}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x58,0xd6,0xc2,0xe2}, 8343},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x01,0x0b,0x20}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x24,0xeb,0x6c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x43,0x60,0x02}, 15321},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x62,0x10,0x29}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x6c,0x48,0xc3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0x9c,0x23,0x9d}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xa3,0xe3,0x1c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xb8,0x53,0x3c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xd4,0x21,0xed}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xd4,0xa0,0xa5}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xe7,0x60,0x53}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xec,0x31,0x75}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x5a,0x42,0xd1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x59,0xf8,0xa4,0x40}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5a,0x95,0xc1,0xc7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x4d,0xef,0xf5}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x6a,0xc2,0x61}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x86,0x4b,0x73}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x98,0xc1,0x24}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x98,0xdb,0x23}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xc5,0x0a,0xea}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x7e,0x4d,0x4d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x86,0x26,0xc3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0x9c,0x61,0xb5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xcf,0x44,0x90}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd1,0x4d,0x65}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd2,0x6a,0x93}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xd6,0xc8,0xcd}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xdf,0x73,0x26}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xea,0x30,0xe8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xfa,0x56,0x12}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xdc,0x83,0xf2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xdc,0xa3,0x12}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5b,0xe9,0x17,0x23}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x0d,0x60,0x5d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x0e,0x4a,0x72}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0x1b,0x07,0xd1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xdd,0xe4,0x0d}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5c,0xff,0xcf,0x49}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x48,0xa7,0x94}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x4a,0xa3,0xea}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x54,0x72,0x6a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x7b,0xae,0x42}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0x98,0xa6,0x1d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xab,0xd8,0xdd}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xb9,0xb1,0x47}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5d,0xb5,0x2d,0xbc}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x13,0x0c,0xf4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x2a,0x73,0x32}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x4f,0xb1,0xce}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x88,0x93,0x77}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0x8f,0xf5,0x05}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xbc,0x32,0x27}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xbe,0xe3,0x70}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xc6,0x87,0x1d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xe0,0xa2,0x41}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xe2,0x6b,0x56}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xf2,0xdb,0x5a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xf2,0xe5,0xa8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xf4,0xa0,0x54}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5e,0xf2,0xc6,0xa1}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x1f,0x0a,0xd1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x55,0x19,0x29}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x69,0xa1,0x88}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x9a,0xa5,0x2d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x9a,0xc8,0xd8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xa7,0x6d,0x7d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd3,0x7d,0xe7}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd3,0xd8,0xeb}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x21,0x19,0x11}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x2b,0x82,0xb2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x61,0x76,0x08,0xec}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x66,0x06,0x7d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xca,0x14,0x2d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xd9,0x7d,0xe1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xea,0xd2,0x6f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xed,0x14,0x7b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xff,0x90,0xb0}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0x71,0x40,0x2b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0xe5,0x16,0x08}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x01,0xd4,0x13}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x41,0x48,0xf4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x54,0xa2,0x5f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0x5a,0x8b,0x2e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xb7,0x31,0x1b}, 8005},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x5f,0xd7,0x2f,0x85}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x17,0x43,0x55}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x60,0x2c,0xa6,0xbe}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x61,0x5d,0xe1,0x4a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x1a,0x00,0x22}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0x1b,0xe1,0x66}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xe5,0x75,0xe5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xf9,0x44,0x7d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x62,0xff,0x05,0x9b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x63,0x65,0xf0,0x72}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0x64,0xae,0x8a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x65,0xfb,0xcb,0x06}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x03,0x3c,0x3d}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0x1e,0x2a,0xbd}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xe0,0xa5,0x30}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x67,0xf3,0x5e,0x8c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x83,0x6b,0x6b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x83,0x74,0xb8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x24,0x53,0xe9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x25,0x81,0x16}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x36,0xc0,0xfb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x80,0xe4,0xfc}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x80,0xe6,0xb9}, 8334},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x82,0xa1,0x2f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x83,0x21,0x3c}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x8f,0x00,0x9c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdb,0xb8,0x09}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0xb9,0x26,0xae}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0x9c,0x6f,0x48}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xa7,0x6f,0x54}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc1,0x28,0xf8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc5,0x07,0xae}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xc5,0x08,0xfa}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xdf,0x01,0x85}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xec,0x61,0x8c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0x80,0xd6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x68,0xee,0x82,0xb6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0x26,0xea,0x54}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6a,0xb9,0x24,0xcc}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x06,0x04,0x91}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x96,0x08,0x1b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x96,0x21,0x14}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xaa,0xe4,0x81}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xaa,0xf0,0xad}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x33,0x14,0x56}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3d,0x95,0xde}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x3d,0x97,0xac}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xa1,0x81,0xf7}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0xaa,0x8c,0x15}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x3c,0xd3,0xd8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x49,0x2a,0x24}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x49,0xac,0x8a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x96,0x02,0x06}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x96,0x28,0xea}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0x9b,0x6c,0x82}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xa1,0xb6,0x73}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xaa,0x42,0xe7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xbe,0x80,0xe2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6b,0xbf,0x6a,0x73}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6c,0x10,0x02,0x3d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0x46,0x04,0xa8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xa2,0x23,0xc4}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xa3,0xeb,0xef}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xbe,0xc4,0xdc}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xc9,0x87,0xd8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xe4,0x98,0x02}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xe4,0x9a,0x51}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xe6,0xdc,0x7d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xea,0x9c,0xda}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xeb,0x31,0x1b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xeb,0x45,0x54}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x70,0x7c,0x47,0x00}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x71,0x92,0x44,0xfb}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x1d,0x11,0x52}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x46,0xb0,0x11}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x75,0x29,0xa2,0xb8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x1b,0x08,0xaa}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0xe6,0x07,0xd3}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0xf6,0x47,0x34}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0xac,0x08,0x64}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0x80,0x6d,0x94}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0xe7,0xe0,0x3f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xbf,0x27,0x3c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xea,0x6a,0xbf}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x6d,0xee,0x51,0x52}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x72,0x4c,0x93,0x1b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x1c,0xe0,0x7f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x73,0x44,0x6e,0x52}, 18333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0x61,0x4f,0xda}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x76,0xbd,0xcf,0xc5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x77,0xe4,0x60,0xe9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x78,0x93,0xb2,0x51}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0x29,0x7b,0x05}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x79,0x43,0x05,0xe6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7a,0x6b,0x8f,0x6e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0x02,0xaa,0x62}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0x6e,0x41,0x5e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7b,0xc1,0x8b,0x13}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x7d,0xef,0xa0,0x29}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x65,0xa2,0xc1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x6f,0x49,0x0a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0x8c,0xe5,0x49}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xaf,0xc3,0x1f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0xa4,0x60}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0xfe,0xf4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x81,0x61,0x45,0x4c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0x6b,0x3f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xc7,0xc0,0x99}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x80,0xfd,0x03,0xc1}, 20020},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x81,0x7b,0x07,0x07}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x81,0x7b,0x07,0x27}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x81,0xba,0x11,0x11}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0xf7,0xa9,0xbe}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x85,0xf2,0xd1,0x3f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0x66,0x5e,0x26}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0x77,0x11,0x91}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0x74,0xa0,0xb0}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x82,0x59,0xa0,0xea}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0x48,0x8b,0xa4}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x83,0xbf,0x70,0x62}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x85,0x01,0x86,0xa2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x86,0x13,0x84,0x35}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x89,0xe2,0x22,0x2a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8a,0xd2,0xd9,0xaa}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xff,0xa6,0xc2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0x29,0x02,0xac}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8d,0xff,0x80,0xcc}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8e,0xd9,0x0c,0x6a}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x8f,0xd7,0x81,0x7e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x90,0x4c,0xf4,0x13}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0x94,0x34,0xa2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0x94,0x50,0x39}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0xb9,0x13,0x1e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0xb9,0x8e,0x56}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0xb9,0xfd,0x33}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x94,0xfb,0x06,0xd6}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0x9a,0x9b,0xeb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x92,0x00,0x20,0x65}, 8337},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x93,0xe5,0x0d,0xc7}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xd2,0x85,0xf4}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x97,0xe0,0xf8,0xfc}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x99,0x79,0x4b,0xe5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x99,0x7f,0xfb,0x43}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x95,0xd2,0xa2,0xbb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x96,0x65,0xa3,0xf1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x97,0xec,0x0b,0xbd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x99,0x79,0x42,0xd3}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9a,0x14,0x02,0x8b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9d,0x0d,0x3d,0x05}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9e,0x3a,0xad,0x30}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x9f,0xfd,0x17,0x84}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x6e,0xda}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd5,0xfe,0xcd}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xef,0xfe,0x64}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf2,0x96,0x27}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf3,0x51,0x8a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf3,0xeb,0x38}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf4,0x4f,0x10}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf5,0xd9,0x77}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd1,0x6a,0x7b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xd2,0xc6,0xb8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xda,0x41,0x79}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xde,0xa1,0x31}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf3,0x84,0x06}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf3,0x84,0x3a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf8,0x63,0xa4}, 53011},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xf8,0x66,0x75}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xfb,0x6c,0x35}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xfe,0x95,0x8b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa2,0xff,0x74,0x4e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa6,0x46,0x5e,0x6a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0x58,0x2d,0x7c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0x58,0x78,0xd2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x1a,0x31,0x2b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x1e,0x0e,0x06}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x50,0x72,0xc5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xa7,0xd6,0xf3}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xd0,0xdb,0x6c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xdc,0x43,0x9c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xec,0x65,0x22}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xf6,0x6b,0x22}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xff,0xed,0xf1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x02,0xd5,0xd1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x33,0x17,0xe0}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x33,0x7b,0x9f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x39,0xd4,0x79}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa3,0x9e,0x23,0x6e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa4,0x0f,0x0a,0xbd}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa4,0x28,0x86,0xab}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa6,0xe6,0x47,0x43}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa7,0xa0,0xa1,0xc7}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa8,0x67,0xc3,0xfa}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa8,0x90,0x1b,0x70}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xa8,0x9e,0x81,0x1d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaa,0x4b,0xa2,0x56}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0x5a,0x63,0xae}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xac,0xf5,0x05,0x9c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x17,0xa6,0x2f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x20,0x0b,0xc2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0x22,0xcb,0x4c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xab,0x01,0x34}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xaf,0x88,0x0d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xe6,0xe4,0x8b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xad,0xf7,0xc1,0x46}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x31,0x84,0x1c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x34,0xca,0x48}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x35,0x4c,0x57}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xae,0x6d,0x21,0x1c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x7e,0x7c,0x5b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xaf,0x7e,0x7c,0x5c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x0a,0x74,0xf2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x24,0x23,0x7e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x24,0x63,0xde}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x7c,0x6e,0x2f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0xc2,0x21,0x2c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0xdf,0xc9,0xc6}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0x1a,0x53}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0x24,0x30}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0xd4,0x8d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0xfe,0x3b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x4e,0xfa,0x03}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x9b,0x56,0xe2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x1c,0x0c,0xa9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x23,0xb6,0xd6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x24,0x21,0x71}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x24,0x21,0x79}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x3a,0x60,0xad}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb0,0x79,0x4c,0x54}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0x46,0x10}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x3e,0x6f,0x1a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x4c,0xa9,0x3b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0x4f,0x83,0x20}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xa2,0xc7,0xd8}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xaf,0x86,0x23}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xf8,0x6f,0x04}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xfe,0x01,0xaa}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb2,0xfe,0x22,0xa1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb3,0x2b,0x72,0x0e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb6,0xd5,0xd0,0x1c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb3,0x2b,0x8f,0x78}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb3,0xd0,0x9c,0xc6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb4,0xc8,0x80,0x3a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb7,0x4e,0xa9,0x6c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb7,0x60,0x60,0x98}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x44,0x02,0x2e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x48,0xee,0x2a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x5e,0xe2,0x22}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x49,0xa0,0xa0}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x5e,0xe3,0x3a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x6b,0x8b,0x3a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x6b,0xce,0x2d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x0a,0x30,0x75}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x15,0xd8,0x9c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x26,0x2f,0xe0}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb8,0x98,0x44,0xa3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x07,0x23,0x72}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x1c,0x4c,0xb3}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x1f,0xa0,0xca}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x2d,0xc0,0x81}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x81,0xe6}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x35,0x83,0x72}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x37,0x35,0x3d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x37,0x35,0x3f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x3d,0x77,0x02}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x3d,0x94,0xcb}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xb9,0x42,0x8c,0x0f}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xba,0x02,0xa7,0x17}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x5c,0x4b,0xb2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x7a,0x5c,0x86}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x8a,0x09,0xd0}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xa5,0xd1,0x94}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xe2,0xce,0xef}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x0a,0x08,0x7c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x0a,0x0a,0x93}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x00,0x82,0x8e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x03,0x59,0x9f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x49,0xea,0x8a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x4b,0x5f,0x6b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x5f,0x64,0x66}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x9b,0x54,0xb5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xa9,0xe9,0xce}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xc6,0x5d,0x56}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xe3,0x87,0xd8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xba,0xdc,0x65,0x8e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x1a,0x05,0x21}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x4b,0x88,0x92}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x78,0xc2,0x8c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x79,0x05,0x96}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x8a,0x00,0x72}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0x8a,0x21,0xef}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xa6,0x00,0x52}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xb6,0x6c,0x81}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xbf,0x61,0xd0}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbc,0xe2,0xc6,0x66}, 8001},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x0a,0x09,0xd9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x4b,0x8f,0x90}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbe,0x8b,0x66,0x92}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xbf,0xed,0x40,0x1c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x03,0x83,0x3d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x63,0xe1,0x03}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x6e,0xa0,0x7a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0x92,0x89,0x01}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xb7,0xc6,0xcc}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc0,0xcb,0xe4,0x47}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x00,0x6d,0x03}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x4d,0x32,0xd0}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x6d,0x44,0x3e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x96,0x79,0x25}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xe0,0x45,0x62}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x4f,0x08,0x25}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x8d,0x56,0x0a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x0c,0xb4,0x5e}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x38,0x3f,0x0a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x74,0x5d,0x5d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x9a,0xae,0xe2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x0c,0xee,0xcc}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0x5b,0xc8,0x55}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc1,0xea,0xe1,0x9c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x06,0xe9,0x26}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x3f,0x8f,0x88}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc2,0x7e,0x64,0xf6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x86,0x63,0xc3}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x9f,0x6f,0x62}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xa9,0x8a,0x02}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xbd,0x7e,0x23}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0x9f,0xe2,0x8b}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc3,0xc5,0xaf,0xbe}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc5,0xf2,0x5d,0x52}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x0b,0xd6,0x93}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x31,0x29,0x15}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x21,0x7c,0xba}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xcc,0xba,0x92}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xe9,0xee,0x73}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xf1,0xbd,0x42}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x30,0xc7,0x6c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x39,0xd0,0x86}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x39,0xd2,0x1b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0x3e,0x6d,0xdf}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xa7,0x8c,0x08}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc6,0xa7,0x8c,0x12}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x5b,0xad,0xea}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0x7f,0xe2,0xf5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc7,0xb4,0x86,0x74}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc8,0x07,0x60,0x63}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xc9,0xa0,0x6a,0x56}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x37,0x57,0x2d}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x3c,0x44,0xf2}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x3c,0x45,0xe8}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0xb7,0x97,0x27}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xca,0x7c,0x6d,0x67}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x1e,0xc5,0x4d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x58,0xa0,0x2b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0x97,0x8c,0x0e}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcb,0xdb,0x0e,0xcc}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x2c,0x7b,0x6d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x2c,0x7b,0xa2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcc,0x2d,0x78,0xb2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xce,0xbe,0x86,0x2c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xce,0xf8,0xb8,0x7f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcd,0x93,0x28,0x3e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xeb,0x27,0xd6}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xcf,0xf4,0x49,0x08}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x42,0x1e,0x1b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x51,0x09,0xdf}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x69,0xf3,0xe5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x7e,0x46,0x9f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x8c,0x1e,0xa9}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xa5,0x80,0xeb}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xbe,0x02,0xf2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd2,0x42,0xfe,0xec}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd2,0x49,0x1b,0x21}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x0c,0x40,0xe1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd0,0x4c,0xc8,0xc8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x28,0x60,0x79}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x7e,0x6b,0xb0}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0x8d,0x28,0x95}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xbe,0x4b,0x3b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd1,0xd0,0x6f,0x8e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd2,0x36,0x22,0xa4}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd3,0x48,0x42,0xe5}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x19,0x25,0x7c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x47,0xeb,0x72}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x47,0xfc,0x6d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x72,0x30,0x1f}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0xae,0x97,0x76}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x33,0x90,0x2a}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x70,0x21,0x9d}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x74,0x48,0x3f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd4,0x7e,0x0e,0x7a}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x42,0xcd,0xc2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x81,0xf8,0x8b}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x88,0x57,0x22}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xa5,0x52,0x85}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xa7,0x11,0x06}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xb3,0x9e,0xfd}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xbd,0x35,0x7d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xde,0xd0,0x5d}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x31,0x9e,0xa1}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x6f,0xc4,0x15}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x7a,0x6b,0x66}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x88,0x4b,0xaf}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0x9b,0x07,0x18}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xa3,0x40,0x1f}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xa3,0x40,0xd0}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xa5,0x56,0x88}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd5,0xb8,0x08,0x16}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x0f,0x4e,0xb6}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x37,0x8f,0x9a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x83,0x5b,0x64}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf5,0xce,0xb5}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x73,0xeb,0x20}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x7e,0xe2,0xa6}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0x91,0x43,0x57}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xa9,0x8d,0xa9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xf9,0x5c,0xe6}, 8333},
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd8,0xfa,0x8a,0xe6}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x0b,0xe1,0xbd}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x06,0x85}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x4b,0x58,0xb2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xac,0x8f,0x8c}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xc3,0xa9,0xd1}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xc4,0xf8,0x6a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdb,0x8a,0xa1,0xa2}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xde,0xa7,0xf8,0x5a}, 8333},
- {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdf,0x12,0xfe,0x37}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x14,0xab,0x2b}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x02,0x47}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x17,0x02,0xf2}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x19,0x09,0x4c}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x28,0xe2,0xa9}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x7b,0x62,0x09}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0x9b,0x24,0x3e}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xd9,0xac,0x20,0x12}, 20993},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xda,0x3d,0xc4,0xca}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xda,0xe7,0xcd,0x29}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdc,0xe9,0x4d,0xc8}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdf,0x12,0xe2,0x55}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdf,0xc5,0xcb,0x52}, 8333},
+ {{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xdf,0xff,0xa6,0x8e}, 8333},
+ {{0x20,0x01,0x12,0x91,0x02,0xbf,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00}, 8333},
+ {{0x20,0x01,0x14,0x18,0x01,0x00,0x05,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x16,0xd8,0xdd,0x24,0x00,0x00,0x86,0xc9,0x68,0x1e,0xf9,0x31,0x02,0x56}, 8333},
+ {{0x20,0x01,0x19,0xf0,0x16,0x24,0x00,0xe6,0x00,0x00,0x00,0x00,0x57,0x9d,0x94,0x28}, 8333},
+ {{0x20,0x01,0x19,0xf0,0x03,0x00,0x13,0x40,0x02,0x25,0x90,0xff,0xfe,0xc9,0x2b,0x6d}, 8333},
+ {{0x20,0x01,0x19,0xf0,0x40,0x09,0x14,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64}, 8333},
+ {{0x20,0x01,0x1b,0x40,0x50,0x00,0x00,0x2e,0x00,0x00,0x00,0x00,0x3f,0xb0,0x65,0x71}, 8333},
+ {{0x20,0x01,0x04,0x10,0xa0,0x00,0x40,0x50,0x84,0x63,0x90,0xb0,0xff,0xfb,0x4e,0x58}, 8333},
+ {{0x20,0x01,0x04,0x10,0xa0,0x02,0xca,0xfe,0x84,0x63,0x90,0xb0,0xff,0xfb,0x4e,0x58}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0x54,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0x6a,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0x6c,0xd3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0x8b,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0xa3,0x3d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0xb8,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0xc1,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0xc8,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0xdd,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0xe2,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0xf5,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0xf7,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x01,0xff,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0x2f,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0x37,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8200},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0x3e,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0x86,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0x9c,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0xa2,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0xad,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0xb7,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0xee,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0xf1,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x02,0xfa,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x51,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x36}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x52,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xa1}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x52,0x0c,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xf5}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x52,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xc0}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x52,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0xf2}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0x10,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0x4a,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x7c}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0x67,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0xb7,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0xc3,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0xd2,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0xd5,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x08,0xeb,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x16,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x2b,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x3a,0x9c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x49,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x05,0x7b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x5c,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0x6c,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0a,0xf4,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0b,0x08,0x54,0x0b,0x7c,0x0b,0x7c,0x0b,0x7c,0x0b,0x7c}, 8333},
+ {{0x20,0x01,0x41,0xd0,0x00,0x0d,0x11,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x20,0x01,0x44,0xb8,0x41,0x16,0x78,0x01,0x42,0x16,0x7e,0xff,0xfe,0x78,0x3f,0xe4}, 8333},
+ {{0x20,0x01,0x04,0x70,0x1f,0x08,0x08,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0x1f,0x08,0x0c,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0x1f,0x09,0x0b,0xca,0x02,0x18,0x7d,0xff,0xfe,0x10,0xbe,0x33}, 8333},
+ {{0x20,0x01,0x04,0x70,0x1f,0x0f,0x02,0x2d,0x00,0x00,0x00,0x00,0x02,0x12,0x00,0x26}, 8333},
+ {{0x20,0x01,0x04,0x70,0x1f,0x11,0x12,0xd5,0x00,0x00,0x00,0x00,0x0a,0xe1,0x56,0x11}, 8333},
+ {{0x20,0x01,0x04,0x70,0x1f,0x14,0x05,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0x1f,0x14,0x00,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0x1f,0x15,0x05,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x04,0x70,0x1f,0x15,0x0d,0xda,0x3d,0x9a,0x3f,0x11,0x9a,0x56,0xed,0x64}, 8333},
+ {{0x20,0x01,0x04,0x70,0x00,0x25,0x04,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0x00,0x25,0x00,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0x00,0x04,0x02,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0x00,0x5f,0x00,0x5f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x32}, 8333},
+ {{0x20,0x01,0x04,0x70,0x00,0x66,0x01,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0x00,0x67,0x03,0x9d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71}, 8333},
+ {{0x20,0x01,0x04,0x70,0x6c,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xca,0xfe}, 8333},
+ {{0x20,0x01,0x04,0x70,0x00,0x08,0x02,0xe1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43}, 8333},
+ {{0x20,0x01,0x04,0x70,0x90,0xa7,0x00,0x96,0x00,0x00,0x00,0x00,0x0a,0xfe,0x60,0x21}, 8333},
+ {{0x20,0x01,0x04,0x70,0x95,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x04,0x70,0xb1,0xd0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00}, 8333},
+ {{0x20,0x01,0x04,0x70,0xc1,0xf2,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x01}, 8333},
+ {{0x20,0x01,0x04,0x70,0xd0,0x0d,0x00,0x00,0x36,0x64,0xa9,0xff,0xfe,0x9a,0x51,0x50}, 8333},
+ {{0x20,0x01,0x04,0x70,0xe2,0x50,0x00,0x00,0x02,0x11,0x11,0xff,0xfe,0xb9,0x92,0x4c}, 8333},
+ {{0x20,0x01,0x48,0x00,0x78,0x17,0x01,0x01,0xbe,0x76,0x4e,0xff,0xfe,0x04,0xdc,0x52}, 8333},
+ {{0x20,0x01,0x48,0x00,0x78,0x19,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x04,0x78,0x09}, 8333},
+ {{0x20,0x01,0x48,0x00,0x78,0x19,0x01,0x04,0xbe,0x76,0x4e,0xff,0xfe,0x05,0xc8,0x28}, 8333},
+ {{0x20,0x01,0x48,0x02,0x78,0x00,0x00,0x02,0x30,0xd7,0x17,0x75,0xff,0x20,0x18,0x58}, 8333},
+ {{0x20,0x01,0x48,0x02,0x78,0x02,0x01,0x01,0xbe,0x76,0x4e,0xff,0xfe,0x20,0x02,0x56}, 8333},
+ {{0x20,0x01,0x48,0x02,0x78,0x02,0x01,0x03,0xbe,0x76,0x4e,0xff,0xfe,0x20,0x2d,0xe8}, 8333},
+ {{0x20,0x01,0x48,0x30,0x11,0x00,0x02,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x4b,0xa0,0xff,0xf7,0x01,0x81,0xde,0xad,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x01,0x4b,0xa0,0xff,0xfa,0x00,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x93}, 8333},
+ {{0x20,0x01,0x4b,0xa0,0xff,0xff,0x01,0xbe,0x00,0x01,0x10,0x05,0x00,0x00,0x00,0x01}, 8335},
+ {{0x20,0x01,0x4c,0x48,0x01,0x10,0x01,0x01,0x02,0x16,0x3e,0xff,0xfe,0x24,0x11,0x62}, 8333},
+ {{0x20,0x01,0x4d,0xd0,0xf1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32}, 8333},
+ {{0x20,0x01,0x4d,0xd0,0xff,0x00,0x86,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},
+ {{0x20,0x01,0x4d,0xd0,0xff,0x00,0x9a,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09}, 8333},
+ {{0x20,0x01,0x4d,0xd0,0xff,0x00,0x9c,0x55,0xc2,0x3f,0xd5,0xff,0xfe,0x6c,0x7e,0xe9}, 8333},
+ {{0x20,0x01,0x05,0xc0,0x14,0x00,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0xc7}, 8333},
+ {{0x20,0x01,0x05,0xc0,0x14,0x00,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x3d,0x01}, 8333},
+ {{0x20,0x01,0x05,0xc0,0x14,0x00,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xdf}, 8333},
+ {{0x20,0x01,0x05,0xc0,0x15,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},
+ {{0x20,0x01,0x06,0x10,0x1b,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},
+ {{0x20,0x01,0x06,0x20,0x05,0x00,0xff,0xf0,0xf2,0x1f,0xaf,0xff,0xfe,0xcf,0x91,0xcc}, 8333},
+ {{0x20,0x01,0x06,0x7c,0x12,0x20,0x08,0x0c,0x00,0xad,0x8d,0xe2,0xf7,0xe2,0xc7,0x84}, 8333},
+ {{0x20,0x01,0x06,0x7c,0x21,0xec,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b}, 8333},
+ {{0x20,0x01,0x06,0xf8,0x12,0x96,0x00,0x00,0x76,0xd4,0x35,0xff,0xfe,0xba,0x1d,0x26}, 8333},
+ {{0x20,0x01,0x08,0x40,0xf0,0x00,0x42,0x50,0x3e,0x4a,0x92,0xff,0xfe,0x6d,0x14,0x5f}, 8333},
+ {{0x20,0x01,0x08,0xd8,0x08,0x40,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x01,0xae}, 8333},
+ {{0x20,0x01,0x09,0x80,0xef,0xd8,0x00,0x00,0x00,0x21,0xde,0x4a,0x27,0x09,0x09,0x12}, 8333},
+ {{0x20,0x01,0x09,0x81,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},
+ {{0x20,0x01,0x09,0x81,0x93,0x19,0x00,0x02,0x00,0xc0,0x00,0xa8,0x00,0xc8,0x00,0x08}, 8333},
+ {{0x20,0x01,0x09,0xd8,0xca,0xfe,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x91}, 8333},
+ {{0x20,0x01,0x0a,0xd0,0x00,0x01,0x00,0x01,0x26,0xbe,0x05,0xff,0xfe,0x25,0x95,0x9d}, 8333},
+ {{0x20,0x01,0x0b,0xa8,0x01,0xf1,0xf3,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x20,0x01,0x0b,0xc8,0x38,0x1c,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x20,0x02,0x17,0x5c,0x4c,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x5c,0x4c,0xaa}, 8333},
+ {{0x20,0x02,0x44,0x04,0x82,0xf1,0x00,0x00,0x8d,0x55,0x8f,0xbb,0x15,0xfa,0xf4,0xe0}, 8333},
+ {{0x20,0x02,0x44,0x75,0x22,0x33,0x00,0x00,0x02,0x1f,0x5b,0xff,0xfe,0x33,0x9f,0x70}, 8333},
+ {{0x20,0x02,0x59,0x6c,0x48,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x59,0x6c,0x48,0xc3}, 8333},
+ {{0x20,0x02,0x8c,0x6d,0x65,0x21,0x96,0x17,0x12,0xbf,0x48,0xff,0xfe,0xd8,0x17,0x24}, 8333},
+ {{0x20,0x02,0xa6,0x46,0x5e,0x6a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02}, 8333},
+ {{0x20,0x02,0xb0,0x09,0x20,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x09,0x20,0xc5}, 8333},
+ {{0x24,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x82,0x3e}, 8333},
+ {{0x24,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x70,0xd1,0x64}, 8333},
+ {{0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x37,0x97,0x61}, 8333},
+ {{0x24,0x03,0x42,0x00,0x04,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, 8333},
+ {{0x24,0x03,0xb8,0x00,0x10,0x00,0x00,0x64,0x04,0x0a,0xe9,0xff,0xfe,0x5f,0x94,0xc1}, 8333},
+ {{0x24,0x03,0xb8,0x00,0x10,0x00,0x00,0x64,0x98,0x79,0x17,0xff,0xfe,0x6a,0xa5,0x9f}, 8333},
+ {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x59,0xb2}, 8333},
+ {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x37,0xa4,0xb1}, 8333},
+ {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x56,0x29,0x73}, 8333},
+ {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x72,0x97}, 8333},
+ {{0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0x8a,0x6e}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x6a,0xdf}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0xe2,0x17}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x33,0x1b,0x31}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x33,0x2f,0xe1}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x33,0xa0,0x3f}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x5e,0x06}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x56,0xd6,0x45}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0xa3,0xdc}, 8333},
+ {{0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x89,0xa6,0x59}, 8333},
+ {{0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x6f,0x0b}, 8333},
+ {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x33,0xf6,0xfb}, 8333},
+ {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x50,0x5f,0xa7}, 8333},
+ {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x18,0x03}, 8333},
+ {{0x26,0x00,0x3c,0x03,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x4a,0xc0}, 8333},
+ {{0x26,0x01,0x00,0x06,0x48,0x00,0x04,0x7f,0x1e,0x4e,0x1f,0x4d,0x33,0x2c,0x3b,0xf6}, 8333},
+ {{0x26,0x01,0x00,0x0d,0x54,0x00,0x0f,0xed,0x8d,0x54,0xc1,0xe8,0x7e,0xd7,0xd4,0x5e}, 8333},
+ {{0x26,0x02,0x01,0x00,0x4b,0x8f,0x6d,0x2a,0x02,0x0c,0x29,0xff,0xfe,0xaf,0xc4,0xc2}, 8333},
+ {{0x26,0x02,0xff,0xc5,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x2d,0x61}, 8333},
+ {{0x26,0x02,0xff,0xc5,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x92,0x11}, 8333},
+ {{0x26,0x02,0xff,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xc5,0xb8,0x44}, 8333},
+ {{0x26,0x02,0xff,0xe8,0x01,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x04,0x57,0x93,0x6b}, 8333},
+ {{0x26,0x02,0xff,0xea,0x10,0x01,0x01,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0xd4}, 8333},
+ {{0x26,0x02,0xff,0xea,0x10,0x01,0x06,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x7d}, 8333},
+ {{0x26,0x02,0xff,0xea,0x10,0x01,0x07,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x57,0x8b}, 8333},
+ {{0x26,0x02,0xff,0xea,0x10,0x01,0x07,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0xae}, 8333},
+ {{0x26,0x02,0xff,0xea,0x00,0x01,0x02,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0xc8}, 8333},
+ {{0x26,0x02,0xff,0xea,0x00,0x01,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0x68}, 8333},
+ {{0x26,0x02,0xff,0xea,0x00,0x01,0x07,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x82,0xec}, 8333},
+ {{0x26,0x02,0xff,0xea,0x00,0x01,0x09,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xe9,0x57}, 8333},
+ {{0x26,0x02,0xff,0xea,0x00,0x01,0x0a,0x5d,0x00,0x00,0x00,0x00,0x00,0x00,0x4a,0xcb}, 8333},
+ {{0x26,0x02,0xff,0xea,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0xc4,0xd9,0xfd}, 8333},
+ {{0x26,0x02,0xff,0xea,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0xae,0x32}, 8333},
+ {{0x26,0x04,0x00,0x00,0x00,0xc1,0x01,0x00,0x1e,0xc1,0xde,0xff,0xfe,0x54,0x22,0x35}, 8333},
+ {{0x26,0x04,0x01,0x80,0x00,0x01,0x01,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0xa9}, 8333},
+ {{0x26,0x04,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb2,0x08,0x03,0x98}, 8333},
+ {{0x26,0x04,0x28,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x72,0x0a,0xed}, 8333},
+ {{0x26,0x04,0x40,0x80,0x11,0x14,0x00,0x00,0x32,0x85,0xa9,0xff,0xfe,0x93,0x85,0x0c}, 8333},
+ {{0x26,0x04,0x7c,0x00,0x00,0x17,0x03,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x4d}, 8333},
+ {{0x26,0x04,0x9a,0x00,0x21,0x00,0xa0,0x09,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x26,0x04,0xa8,0x80,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x02,0x2a,0x40,0x01}, 8333},
+ {{0x26,0x04,0xa8,0x80,0x08,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x07,0x52,0xf0,0x01}, 8333},
+ {{0x26,0x04,0x0c,0x00,0x00,0x88,0x00,0x32,0x02,0x16,0x3e,0xff,0xfe,0xe4,0xfc,0xca}, 8333},
+ {{0x26,0x04,0x0c,0x00,0x00,0x88,0x00,0x32,0x02,0x16,0x3e,0xff,0xfe,0xf5,0xbc,0x21}, 8333},
+ {{0x26,0x05,0x79,0x80,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x17,0x61,0x3d,0x4e}, 8333},
+ {{0x26,0x05,0xe0,0x00,0x14,0x17,0x40,0x68,0x02,0x23,0x32,0xff,0xfe,0x96,0x0e,0x2d}, 8333},
+ {{0x26,0x06,0x60,0x00,0xa4,0x41,0x99,0x03,0x50,0x54,0x00,0xff,0xfe,0x78,0x66,0xff}, 8333},
+ {{0x26,0x06,0xdf,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x85,0x8f,0xc6}, 8333},
+ {{0x26,0x07,0x53,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x7f}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa1}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x11,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x15,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x1b,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x23,0x37,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x2b,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x2d,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x03,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x4a,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x51,0x12,0x00,0x00,0x00,0x02,0x4a,0xf5,0x63,0xfe}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x6d,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, 8333},
+ {{0x26,0x07,0x53,0x00,0x00,0x60,0x0a,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x26,0x07,0xf1,0xc0,0x08,0x20,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x3f,0x44}, 8333},
+ {{0x26,0x07,0xf1,0xc0,0x08,0x48,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x94,0x3c}, 8333},
+ {{0x26,0x07,0xf9,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07}, 8333},
+ {{0x26,0x07,0xfc,0xd0,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x04,0xad,0xe5,0x94}, 8333},
+ {{0x26,0x07,0xfc,0xd0,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x65,0x9e,0x9c,0xb3}, 8333},
+ {{0x26,0x07,0xfc,0xd0,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0xc7,0x4b,0xa8,0xae}, 8333},
+ {{0x26,0x07,0xfc,0xd0,0x01,0x00,0x23,0x00,0x00,0x00,0x00,0x00,0x0d,0x82,0xd8,0xc2}, 8333},
+ {{0x26,0x07,0xfc,0xd0,0x01,0x00,0x43,0x00,0x00,0x00,0x00,0x00,0x87,0x95,0x2f,0xa8}, 8333},
+ {{0x26,0x07,0xfc,0xd0,0xda,0xaa,0x09,0x01,0x00,0x00,0x00,0x00,0x95,0x61,0xe0,0x43}, 8333},
+ {{0x2a,0x00,0x11,0x78,0x00,0x02,0x00,0x43,0x50,0x54,0x00,0xff,0xfe,0xe7,0x2e,0xb6}, 8333},
+ {{0x2a,0x00,0x13,0x28,0xe1,0x00,0xcc,0x42,0x02,0x30,0x48,0xff,0xfe,0x92,0x05,0x5d}, 8333},
+ {{0x2a,0x00,0x14,0xf0,0xe0,0x00,0x80,0xd2,0xcd,0x1a,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x00,0x16,0xd8,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x5b,0x6a,0xc2,0x61}, 8333},
+ {{0x2a,0x00,0x61,0xe0,0x40,0x83,0x6d,0x01,0x68,0x52,0x13,0x76,0xe9,0x72,0x20,0x91}, 8333},
+ {{0x2a,0x00,0x0c,0x98,0x20,0x30,0xa0,0x2f,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x01,0xb0,0x79,0x99,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x31}, 8333},
+ {{0x2a,0x01,0x01,0xe8,0xe1,0x00,0x81,0x1c,0x70,0x0f,0x65,0xf0,0xf7,0x2a,0x10,0x84}, 8333},
+ {{0x2a,0x01,0x02,0x38,0x42,0xda,0xc5,0x00,0x65,0x46,0x12,0x93,0x54,0x22,0xab,0x40}, 8333},
+ {{0x2a,0x01,0x03,0x48,0x00,0x06,0x04,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x03,0x68,0xe0,0x10,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0x30,0x00,0x17,0x00,0x01,0x00,0x00,0x00,0x00,0xff,0xff,0x05,0x49}, 8333},
+ {{0x2a,0x01,0x04,0x30,0x00,0x17,0x00,0x01,0x00,0x00,0x00,0x00,0xff,0xff,0x08,0x30}, 8333},
+ {{0x2a,0x01,0x04,0x88,0x00,0x66,0x10,0x00,0x53,0xa9,0x0d,0x04,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x01,0x04,0x88,0x00,0x66,0x10,0x00,0x57,0xe6,0x57,0x8c,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x01,0x04,0x88,0x00,0x66,0x10,0x00,0xb0,0x1c,0x17,0x8d,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x01,0x04,0x88,0x00,0x67,0x10,0x00,0x05,0x23,0xfd,0xce,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x01,0x04,0x88,0x00,0x67,0x10,0x00,0xb0,0x1c,0x30,0xab,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x00,0x24,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x00,0x44,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x00,0x51,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x00,0x84,0xa7,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x10,0x51,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x10,0x53,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x62,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x70,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x80,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x82,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x20,0x84,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x21,0x11,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x21,0x02,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x24,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x24,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x24,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x63,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x63,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x64,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x30,0x93,0x4f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x31,0x20,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x31,0x54,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x40,0x80,0xad,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x41,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x21,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x22,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x23,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x61,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x70,0x88,0x50,0x54,0x00,0xff,0xfe,0x45,0xbf,0xf2}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x50,0x83,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 9001},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x01,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x51,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x51,0x63,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 9001},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x52,0x6d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x61,0x93,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x23,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x43,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x73,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x73,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x62,0x74,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x60,0x65,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x63,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x64,0xc9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x90,0x91,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x21,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x40,0xa1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x04,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x63,0xb4,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x71,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x83,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x91,0x93,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x60,0xa9,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x73,0xb2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x80,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x01,0x92,0x00,0xdb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x10,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x22,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x41,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x63,0xaf,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x22}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x00,0x71,0xe3,0x78,0xb4,0xf3,0xff,0xfe,0xad,0xe8,0xcf}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x51,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x60,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x01,0x60,0xd5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x02,0x53,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x10,0x24,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x10,0x50,0x2f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x11,0x14,0xcf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x11,0x1a,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x11,0x2a,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x02,0x11,0x0c,0xca,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x22,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x50,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x52,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x74,0xc8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x82,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x00,0xa0,0x82,0x2d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x04,0xf8,0x0d,0x13,0x21,0x83,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x01,0x06,0x08,0xff,0xff,0xa0,0x09,0x8b,0xf5,0x87,0x9d,0xe5,0x1a,0xf8,0x37}, 8333},
+ {{0x2a,0x01,0x07,0x9d,0x46,0x9e,0xed,0x94,0xc2,0x3f,0xd5,0xff,0xfe,0x65,0x20,0xc5}, 8333},
+ {{0x2a,0x01,0x07,0xc8,0xaa,0xb5,0x03,0xe6,0x50,0x54,0x00,0xff,0xfe,0xd7,0x4e,0x54}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x30,0x1e}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x18,0x77,0x49}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x33,0x2d,0x67}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x33,0x34,0x7c}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x33,0xae,0x50}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x56,0x6b,0x5c}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x56,0xbe,0xe6}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x69,0x48,0x95}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x69,0x99,0x12}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x6e,0x26,0xee}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x73,0x42,0xf1}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0x43,0x4f}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x84,0xb3,0x6b}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x89,0x1f,0xaa}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x98,0x08,0x16}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xdb,0x35,0x2e}, 8333},
+ {{0x2a,0x01,0x7e,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0xdb,0x4a,0x1d}, 8333},
+ {{0x2a,0x01,0x0e,0x34,0xed,0xbb,0x67,0x50,0x02,0x24,0x1d,0xff,0xfe,0x89,0x38,0x97}, 8333},
+ {{0x2a,0x01,0x0e,0x35,0x2f,0x1d,0x3f,0xb0,0x71,0x87,0xc7,0xba,0xbc,0xfc,0x80,0xce}, 8333},
+ {{0x2a,0x01,0x0e,0x35,0x87,0x87,0x96,0xf0,0x90,0x32,0x92,0x97,0x39,0xae,0x49,0x6d}, 8333},
+ {{0x2a,0x01,0x0e,0x35,0x8a,0x3f,0x47,0xc0,0xc6,0x17,0xfe,0xff,0xfe,0x3c,0x9f,0xbd}, 8333},
+ {{0x2a,0x01,0x0e,0x35,0x8b,0x66,0x06,0xa0,0x49,0x00,0x9d,0xfd,0xd8,0x41,0xd0,0x25}, 8333},
+ {{0x2a,0x02,0x01,0x68,0x4a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39}, 8333},
+ {{0x2a,0x02,0x01,0x68,0x54,0x04,0x00,0x02,0xc2,0x3f,0xd5,0xff,0xfe,0x6a,0x51,0x2e}, 8333},
+ {{0x2a,0x02,0x01,0x80,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x5b,0x8f,0x53,0x8c}, 8333},
+ {{0x2a,0x02,0x20,0x28,0x10,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02}, 8333},
+ {{0x2a,0x02,0x25,0x28,0x05,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14}, 8333},
+ {{0x2a,0x02,0x25,0x28,0x05,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15}, 8333},
+ {{0x2a,0x02,0x25,0x28,0xff,0x00,0x81,0xa6,0x02,0x1e,0xc5,0xff,0xfe,0x8d,0xf9,0xa5}, 8333},
+ {{0x2a,0x02,0x27,0x70,0x00,0x05,0x00,0x00,0x02,0x1a,0x4a,0xff,0xfe,0xe4,0xc7,0xdb}, 8333},
+ {{0x2a,0x02,0x27,0x70,0x00,0x08,0x00,0x00,0x02,0x1a,0x4a,0xff,0xfe,0x7b,0x3d,0xcd}, 8333},
+ {{0x2a,0x02,0x03,0x48,0x00,0x5e,0x5a,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x02,0x7a,0xa0,0x16,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x2f,0xc0,0x6a}, 8333},
+ {{0x2a,0x02,0x81,0x09,0x8e,0x40,0x35,0xfc,0xba,0x27,0xeb,0xff,0xfe,0xae,0xcf,0x16}, 8333},
+ {{0x2a,0x02,0x0a,0xf8,0x00,0x06,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x30}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x01,0x00,0x00,0x63,0x14,0x22,0x22}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x02,0x00,0x03,0x32,0x95,0x00,0x01}, 8332},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x00,0x00,0x10,0x00,0x03,0x00,0x00,0x54,0x49,0x00,0x01}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x02,0x00,0x03,0x58,0x99,0x00,0x01}, 8333},
+ {{0x2a,0x02,0xc2,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x00,0x27,0x05,0x00,0x01}, 8333},
+ {{0x2a,0x02,0xce,0x80,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01}, 8333},
+ {{0x2a,0x02,0x0f,0xe0,0xc3,0x21,0x27,0xe0,0x6e,0xf0,0x49,0xff,0xfe,0x11,0xa6,0x1d}, 8333},
+ {{0x2a,0x03,0x40,0x00,0x00,0x02,0x04,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08}, 8333},
+ {{0x2a,0x03,0xb0,0xc0,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x62,0xf0,0x01}, 8333},
+ {{0x2a,0x03,0x0f,0x80,0xed,0x16,0x0c,0xa7,0xea,0x75,0xb1,0x2d,0x02,0xaf,0x9e,0x2a}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd9,0x4a,0xaf,0xa2,0x8c,0x9d,0xf6,0x22,0x18,0x28}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xd9,0xe4,0x70,0x01,0xb3,0xa7,0x9d,0x3e,0x51,0xf9}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe7,0x45,0xd5,0x8b,0xff,0x81,0x9e,0x85,0x00,0xb8}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xff,0xd9,0x7d,0x26,0x57,0x03,0xb0,0x49,0x67,0x4f}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xf9,0xbe,0x9e,0xf0,0x33,0x40,0x2e,0x79,0xc9,0x18}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0f,0x8b,0x1f,0x8d,0x61,0xa6,0x94,0xf4,0x62,0x45}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0x26,0x27,0x21,0xa2,0x2c,0x05,0x29,0x20,0xdd}, 8333},
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0x26,0x27,0x21,0xae,0x94,0xd5,0xc2,0x72,0x24}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xea,0xb9,0x5b,0x63,0x1d,0x94,0xe2,0xed,0xec,0xa1}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xce,0x36,0xa1,0xc1,0xd6,0x64,0x43,0xfb,0xb3,0xe7}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x26,0xe6,0xdf,0xeb,0xe5,0xc5,0x9a,0x87,0x5e,0x22}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x52,0x71,0xa2,0x43,0x2a,0xe6,0x6c,0x8e,0xe4,0x7b}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x7c,0xf4,0x0b,0x4c,0x52,0xd5,0x16,0xcf,0xf5,0x06}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x98,0xff,0x33,0x38,0xbb,0x43,0x08,0x8d,0x95,0x9e}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x16,0x64,0x1b,0x1f,0x8f,0x87,0x18,0x7d,0xa3,0x2b}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xb8,0xda,0x83,0x67,0x90,0x6f,0x46,0x10,0xdb,0x53}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xc3,0x1b,0x22,0x8c,0x89,0x60,0xbf,0xca,0x88,0xa1}, 7033},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x4d,0xe3,0x5b,0x75,0x10,0x46,0x5e,0xf0,0x99,0x8b}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0a,0xba,0x44,0x94,0x9d,0xf5,0xc0,0xaa,0xcd,0x4a}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x96,0x64,0xce,0x6d,0xd4,0xfb,0xa7,0x6b,0x60,0xb5}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe9,0x8f,0x0b,0x72,0xc9,0xf1,0xde,0x62,0xd4,0x66}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x25,0x5c,0xbc,0x34,0xe8,0x9f,0xe4,0x7c,0x90,0x93}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe0,0xa2,0x72,0xef,0xfa,0x7b,0x88,0x95,0x8b,0x9c}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x99,0x69,0xc5,0x40,0xa7,0x95,0xbb,0x25,0xc1,0xfa}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x46,0xa3,0xd9,0x84,0x08,0xc8,0x7f,0xd3,0xeb,0xc5}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0c,0xc4,0xd2,0x4f,0x74,0x99,0xb3,0x8c,0xe8,0x25}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xac,0x9d,0xb8,0xf8,0x4c,0x4b,0x9c,0xc3,0x9c,0xc6}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x7c,0x1d,0x28,0x9f,0xd6,0x28,0x28,0x22,0x4f,0x7a}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xce,0x36,0xa1,0xc1,0xd6,0x64,0x43,0xfb,0xb3,0xe7}, 8333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x8f,0x06,0x4e,0x64,0xbc,0x5e,0x1a,0x8a,0x71,0x97}, 8444}
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x0b,0x29,0x34,0x96,0x29,0xe8,0x67,0x22,0x0c,0x61}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x1c,0x5f,0xc7,0xd4,0x89,0xc0,0x6f,0xa2,0x24,0x71}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x32,0x2e,0xda,0xf7,0xc3,0xf6,0xc3,0x4c,0x3c,0x0d}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x3e,0xaa,0xb7,0xd0,0x79,0x79,0xf3,0x0b,0xd2,0x63}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x39,0xd1,0x5e,0xbd,0xb7,0x23,0x6a,0x12,0xf0,0x0c}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x5e,0x6e,0xf5,0x37,0xcf,0x9b,0xf6,0xe3,0x9f,0xdb}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x64,0x9e,0x79,0x18,0xa8,0x81,0x61,0xd9,0x4d,0xa4}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x68,0xac,0xad,0xae,0x93,0x23,0x0a,0x51,0x3c,0x5c}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x72,0x87,0x94,0x82,0x36,0x22,0x83,0x23,0xb5,0xc5}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x92,0x46,0xe6,0x23,0x98,0x0e,0x87,0x65,0x24,0x22}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa5,0x6c,0xec,0xda,0xeb,0x41,0xdb,0x34,0x18,0x21}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xaf,0xb0,0xbc,0xf3,0xa3,0x6f,0x70,0x17,0xab,0x83}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xaa,0xb7,0x04,0x8c,0x87,0xc6,0x38,0x3b,0x0a,0xf6}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xac,0x1f,0x82,0x69,0x5d,0x88,0xa1,0x54,0xf5,0x90}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xbd,0x06,0xa7,0x66,0x63,0x2c,0x65,0x4c,0x61,0xd4}, 8333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xcf,0x7b,0x5e,0x3a,0x53,0x21,0x5b,0x62,0xe3,0x7a}, 8333}
};
static SeedSpec6 pnSeed6_test[] = {
{{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x99,0xcb,0x26,0x31,0xba,0x48,0x51,0x31,0x39,0x0d}, 18333},
- {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x44,0xf4,0xf4,0xf0,0xbf,0xf7,0x7e,0x6d,0xc4,0xe8}, 18333}
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x44,0xf4,0xf4,0xf0,0xbf,0xf7,0x7e,0x6d,0xc4,0xe8}, 18333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x6a,0x8b,0xd2,0x78,0x3f,0x7a,0xf8,0x92,0x8f,0x80}, 18333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xe6,0x4e,0xa4,0x47,0x4e,0x2a,0xfe,0xe8,0x95,0xcc}, 18333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x9f,0xae,0x9f,0x59,0x0b,0x3f,0x31,0x3a,0x8a,0x5f}, 18333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0x47,0xb1,0xe4,0x55,0xd1,0xb0,0x14,0x3f,0xb6,0xdb}, 18333},
+ {{0xfd,0x87,0xd8,0x7e,0xeb,0x43,0xa0,0x60,0x9e,0x46,0x54,0xdb,0x61,0x3b,0xb2,0x6f}, 18333}
};
#endif // BITCOIN_CHAINPARAMSSEEDS_H
diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp
index 71579bb309..87f4ad7f2e 100644
--- a/src/checkpoints.cpp
+++ b/src/checkpoints.cpp
@@ -15,30 +15,17 @@
namespace Checkpoints {
/**
- * How many times we expect transactions after the last checkpoint to
- * be slower. This number is a compromise, as it can't be accurate for
- * every system. When reindexing from a fast disk with a slow CPU, it
+ * How many times slower we expect checking transactions after the last
+ * checkpoint to be (from checking signatures, which is skipped up to the
+ * last checkpoint). This number is a compromise, as it can't be accurate
+ * for every system. When reindexing from a fast disk with a slow CPU, it
* can be up to 20, while when downloading from a slow network with a
* fast multicore CPU, it won't be much higher than 1.
*/
static const double SIGCHECK_VERIFICATION_FACTOR = 5.0;
- bool fEnabled = true;
-
- bool CheckBlock(int nHeight, const uint256& hash)
- {
- if (!fEnabled)
- return true;
-
- const MapCheckpoints& checkpoints = *Params().Checkpoints().mapCheckpoints;
-
- MapCheckpoints::const_iterator i = checkpoints.find(nHeight);
- if (i == checkpoints.end()) return true;
- return hash == i->second;
- }
-
//! Guess how far we are in the verification process at the given block index
- double GuessVerificationProgress(CBlockIndex *pindex, bool fSigchecks) {
+ double GuessVerificationProgress(const CCheckpointData& data, CBlockIndex *pindex, bool fSigchecks) {
if (pindex==NULL)
return 0.0;
@@ -50,8 +37,6 @@ namespace Checkpoints {
// Work is defined as: 1.0 per transaction before the last checkpoint, and
// fSigcheckVerificationFactor per transaction after.
- const CCheckpointData &data = Params().Checkpoints();
-
if (pindex->nChainTx <= data.nTransactionsLastCheckpoint) {
double nCheapBefore = pindex->nChainTx;
double nCheapAfter = data.nTransactionsLastCheckpoint - pindex->nChainTx;
@@ -69,22 +54,19 @@ namespace Checkpoints {
return fWorkBefore / (fWorkBefore + fWorkAfter);
}
- int GetTotalBlocksEstimate()
+ int GetTotalBlocksEstimate(const CCheckpointData& data)
{
- if (!fEnabled)
- return 0;
+ const MapCheckpoints& checkpoints = data.mapCheckpoints;
- const MapCheckpoints& checkpoints = *Params().Checkpoints().mapCheckpoints;
+ if (checkpoints.empty())
+ return 0;
return checkpoints.rbegin()->first;
}
- CBlockIndex* GetLastCheckpoint()
+ CBlockIndex* GetLastCheckpoint(const CCheckpointData& data)
{
- if (!fEnabled)
- return NULL;
-
- const MapCheckpoints& checkpoints = *Params().Checkpoints().mapCheckpoints;
+ const MapCheckpoints& checkpoints = data.mapCheckpoints;
BOOST_REVERSE_FOREACH(const MapCheckpoints::value_type& i, checkpoints)
{
diff --git a/src/checkpoints.h b/src/checkpoints.h
index 29dc5f83a9..001e3cc801 100644
--- a/src/checkpoints.h
+++ b/src/checkpoints.h
@@ -11,7 +11,7 @@
class CBlockIndex;
-/**
+/**
* Block-chain checkpoints are compiled-in sanity checks.
* They are updated every release or three.
*/
@@ -20,24 +20,19 @@ namespace Checkpoints
typedef std::map<int, uint256> MapCheckpoints;
struct CCheckpointData {
- const MapCheckpoints *mapCheckpoints;
+ MapCheckpoints mapCheckpoints;
int64_t nTimeLastCheckpoint;
int64_t nTransactionsLastCheckpoint;
double fTransactionsPerDay;
};
-//! Returns true if block passes checkpoint checks
-bool CheckBlock(int nHeight, const uint256& hash);
-
//! Return conservative estimate of total number of blocks, 0 if unknown
-int GetTotalBlocksEstimate();
+int GetTotalBlocksEstimate(const CCheckpointData& data);
//! Returns last CBlockIndex* in mapBlockIndex that is a checkpoint
-CBlockIndex* GetLastCheckpoint();
-
-double GuessVerificationProgress(CBlockIndex* pindex, bool fSigchecks = true);
+CBlockIndex* GetLastCheckpoint(const CCheckpointData& data);
-extern bool fEnabled;
+double GuessVerificationProgress(const CCheckpointData& data, CBlockIndex* pindex, bool fSigchecks = true);
} //namespace Checkpoints
diff --git a/src/checkqueue.h b/src/checkqueue.h
index 6f6b97e3a7..20ba25bb41 100644
--- a/src/checkqueue.h
+++ b/src/checkqueue.h
@@ -54,7 +54,7 @@ private:
/**
* Number of verifications that haven't completed yet.
- * This includes elements that are not anymore in queue, but still in
+ * This includes elements that are no longer queued, but still in the
* worker's own batches.
*/
unsigned int nTodo;
@@ -81,7 +81,7 @@ private:
fAllOk &= fOk;
nTodo -= nNow;
if (nTodo == 0 && !fMaster)
- // We processed the last element; inform the master he or she can exit and return the result
+ // We processed the last element; inform the master it can exit and return the result
condMaster.notify_one();
} else {
// first iteration
@@ -136,7 +136,7 @@ public:
Loop();
}
- //! Wait until execution finishes, and return whether all evaluations where successful.
+ //! Wait until execution finishes, and return whether all evaluations were successful.
bool Wait()
{
return Loop(true);
diff --git a/src/clientversion.h b/src/clientversion.h
index 3c8c969f9d..5a06b310a3 100644
--- a/src/clientversion.h
+++ b/src/clientversion.h
@@ -15,7 +15,7 @@
//! These need to be macros, as clientversion.cpp's and bitcoin*-res.rc's voodoo requires it
#define CLIENT_VERSION_MAJOR 0
-#define CLIENT_VERSION_MINOR 10
+#define CLIENT_VERSION_MINOR 11
#define CLIENT_VERSION_REVISION 99
#define CLIENT_VERSION_BUILD 0
diff --git a/src/coincontrol.h b/src/coincontrol.h
index 92fae9847c..3e8de83c39 100644
--- a/src/coincontrol.h
+++ b/src/coincontrol.h
@@ -12,6 +12,8 @@ class CCoinControl
{
public:
CTxDestination destChange;
+ //! If false, allows unselected inputs, but requires all selected inputs be used
+ bool fAllowOtherInputs;
CCoinControl()
{
@@ -21,6 +23,7 @@ public:
void SetNull()
{
destChange = CNoDestination();
+ fAllowOtherInputs = false;
setSelected.clear();
}
@@ -50,7 +53,7 @@ public:
setSelected.clear();
}
- void ListSelected(std::vector<COutPoint>& vOutpoints)
+ void ListSelected(std::vector<COutPoint>& vOutpoints) const
{
vOutpoints.assign(setSelected.begin(), setSelected.end());
}
diff --git a/src/coins.cpp b/src/coins.cpp
index d79e29951b..a41d5a310d 100644
--- a/src/coins.cpp
+++ b/src/coins.cpp
@@ -4,6 +4,7 @@
#include "coins.h"
+#include "memusage.h"
#include "random.h"
#include <assert.h>
@@ -57,13 +58,17 @@ bool CCoinsViewBacked::GetStats(CCoinsStats &stats) const { return base->GetStat
CCoinsKeyHasher::CCoinsKeyHasher() : salt(GetRandHash()) {}
-CCoinsViewCache::CCoinsViewCache(CCoinsView *baseIn) : CCoinsViewBacked(baseIn), hasModifier(false) { }
+CCoinsViewCache::CCoinsViewCache(CCoinsView *baseIn) : CCoinsViewBacked(baseIn), hasModifier(false), cachedCoinsUsage(0) { }
CCoinsViewCache::~CCoinsViewCache()
{
assert(!hasModifier);
}
+size_t CCoinsViewCache::DynamicMemoryUsage() const {
+ return memusage::DynamicUsage(cacheCoins) + cachedCoinsUsage;
+}
+
CCoinsMap::const_iterator CCoinsViewCache::FetchCoins(const uint256 &txid) const {
CCoinsMap::iterator it = cacheCoins.find(txid);
if (it != cacheCoins.end())
@@ -78,6 +83,7 @@ CCoinsMap::const_iterator CCoinsViewCache::FetchCoins(const uint256 &txid) const
// version as fresh.
ret->second.flags = CCoinsCacheEntry::FRESH;
}
+ cachedCoinsUsage += memusage::DynamicUsage(ret->second.coins);
return ret;
}
@@ -93,6 +99,7 @@ bool CCoinsViewCache::GetCoins(const uint256 &txid, CCoins &coins) const {
CCoinsModifier CCoinsViewCache::ModifyCoins(const uint256 &txid) {
assert(!hasModifier);
std::pair<CCoinsMap::iterator, bool> ret = cacheCoins.insert(std::make_pair(txid, CCoinsCacheEntry()));
+ size_t cachedCoinUsage = 0;
if (ret.second) {
if (!base->GetCoins(txid, ret.first->second.coins)) {
// The parent view does not have this entry; mark it as fresh.
@@ -102,10 +109,12 @@ CCoinsModifier CCoinsViewCache::ModifyCoins(const uint256 &txid) {
// The parent view only has a pruned entry for this; mark it as fresh.
ret.first->second.flags = CCoinsCacheEntry::FRESH;
}
+ } else {
+ cachedCoinUsage = memusage::DynamicUsage(ret.first->second.coins);
}
// Assume that whenever ModifyCoins is called, the entry will be modified.
ret.first->second.flags |= CCoinsCacheEntry::DIRTY;
- return CCoinsModifier(*this, ret.first);
+ return CCoinsModifier(*this, ret.first, cachedCoinUsage);
}
const CCoins* CCoinsViewCache::AccessCoins(const uint256 &txid) const {
@@ -150,6 +159,7 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
assert(it->second.flags & CCoinsCacheEntry::FRESH);
CCoinsCacheEntry& entry = cacheCoins[it->first];
entry.coins.swap(it->second.coins);
+ cachedCoinsUsage += memusage::DynamicUsage(entry.coins);
entry.flags = CCoinsCacheEntry::DIRTY | CCoinsCacheEntry::FRESH;
}
} else {
@@ -157,10 +167,13 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
// The grandparent does not have an entry, and the child is
// modified and being pruned. This means we can just delete
// it from the parent.
+ cachedCoinsUsage -= memusage::DynamicUsage(itUs->second.coins);
cacheCoins.erase(itUs);
} else {
// A normal modification.
+ cachedCoinsUsage -= memusage::DynamicUsage(itUs->second.coins);
itUs->second.coins.swap(it->second.coins);
+ cachedCoinsUsage += memusage::DynamicUsage(itUs->second.coins);
itUs->second.flags |= CCoinsCacheEntry::DIRTY;
}
}
@@ -175,6 +188,7 @@ bool CCoinsViewCache::BatchWrite(CCoinsMap &mapCoins, const uint256 &hashBlockIn
bool CCoinsViewCache::Flush() {
bool fOk = base->BatchWrite(cacheCoins, hashBlock);
cacheCoins.clear();
+ cachedCoinsUsage = 0;
return fOk;
}
@@ -232,7 +246,7 @@ double CCoinsViewCache::GetPriority(const CTransaction &tx, int nHeight) const
return tx.ComputePriority(dResult);
}
-CCoinsModifier::CCoinsModifier(CCoinsViewCache& cache_, CCoinsMap::iterator it_) : cache(cache_), it(it_) {
+CCoinsModifier::CCoinsModifier(CCoinsViewCache& cache_, CCoinsMap::iterator it_, size_t usage) : cache(cache_), it(it_), cachedCoinUsage(usage) {
assert(!cache.hasModifier);
cache.hasModifier = true;
}
@@ -242,7 +256,11 @@ CCoinsModifier::~CCoinsModifier()
assert(cache.hasModifier);
cache.hasModifier = false;
it->second.coins.Cleanup();
+ cache.cachedCoinsUsage -= cachedCoinUsage; // Subtract the old usage
if ((it->second.flags & CCoinsCacheEntry::FRESH) && it->second.coins.IsPruned()) {
cache.cacheCoins.erase(it);
+ } else {
+ // If the coin still exists after the modification, add the new usage
+ cache.cachedCoinsUsage += memusage::DynamicUsage(it->second.coins);
}
}
diff --git a/src/coins.h b/src/coins.h
index fe2eaa08e5..a4671645df 100644
--- a/src/coins.h
+++ b/src/coins.h
@@ -7,6 +7,7 @@
#define BITCOIN_COINS_H
#include "compressor.h"
+#include "memusage.h"
#include "serialize.h"
#include "uint256.h"
@@ -252,6 +253,15 @@ public:
return false;
return true;
}
+
+ size_t DynamicMemoryUsage() const {
+ size_t ret = memusage::DynamicUsage(vout);
+ BOOST_FOREACH(const CTxOut &out, vout) {
+ const std::vector<unsigned char> *script = &out.scriptPubKey;
+ ret += memusage::DynamicUsage(*script);
+ }
+ return ret;
+ }
};
class CCoinsKeyHasher
@@ -356,7 +366,8 @@ class CCoinsModifier
private:
CCoinsViewCache& cache;
CCoinsMap::iterator it;
- CCoinsModifier(CCoinsViewCache& cache_, CCoinsMap::iterator it_);
+ size_t cachedCoinUsage; // Cached memory usage of the CCoins object before modification
+ CCoinsModifier(CCoinsViewCache& cache_, CCoinsMap::iterator it_, size_t usage);
public:
CCoins* operator->() { return &it->second.coins; }
@@ -372,6 +383,7 @@ protected:
/* Whether this cache has an active modifier. */
bool hasModifier;
+
/**
* Make mutable so that we can "fill the cache" even from Get-methods
* declared as "const".
@@ -379,6 +391,9 @@ protected:
mutable uint256 hashBlock;
mutable CCoinsMap cacheCoins;
+ /* Cached dynamic memory usage for the inner CCoins objects. */
+ mutable size_t cachedCoinsUsage;
+
public:
CCoinsViewCache(CCoinsView *baseIn);
~CCoinsViewCache();
@@ -414,6 +429,9 @@ public:
//! Calculate the size of the cache (in number of transactions)
unsigned int GetCacheSize() const;
+ //! Calculate the size of the cache (in bytes)
+ size_t DynamicMemoryUsage() const;
+
/**
* Amount of bitcoins coming in to a transaction
* Note that lightweight clients may not know anything besides the hash of previous transactions,
diff --git a/src/compat/endian.h b/src/compat/endian.h
index 4d041d6554..9fec2a07fa 100644
--- a/src/compat/endian.h
+++ b/src/compat/endian.h
@@ -15,6 +15,8 @@
#if defined(HAVE_ENDIAN_H)
#include <endian.h>
+#elif defined(HAVE_SYS_ENDIAN_H)
+#include <sys/endian.h>
#endif
#if defined(WORDS_BIGENDIAN)
diff --git a/src/consensus/consensus.h b/src/consensus/consensus.h
new file mode 100644
index 0000000000..f937844e9f
--- /dev/null
+++ b/src/consensus/consensus.h
@@ -0,0 +1,16 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// Copyright (c) 2009-2014 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_CONSENSUS_CONSENSUS_H
+#define BITCOIN_CONSENSUS_CONSENSUS_H
+
+/** The maximum allowed size for a serialized block, in bytes (network rule) */
+static const unsigned int MAX_BLOCK_SIZE = 1000000;
+/** The maximum allowed number of signature check operations in a block (network rule) */
+static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
+/** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */
+static const int COINBASE_MATURITY = 100;
+
+#endif // BITCOIN_CONSENSUS_CONSENSUS_H
diff --git a/src/consensus/params.h b/src/consensus/params.h
index c4cfa48c7e..c480a1cce1 100644
--- a/src/consensus/params.h
+++ b/src/consensus/params.h
@@ -3,10 +3,9 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_CONSENSUS_CONSENSUS_PARAMS_H
-#define BITCOIN_CONSENSUS_CONSENSUS_PARAMS_H
+#ifndef BITCOIN_CONSENSUS_PARAMS_H
+#define BITCOIN_CONSENSUS_PARAMS_H
-#include "arith_uint256.h"
#include "uint256.h"
namespace Consensus {
@@ -21,7 +20,7 @@ struct Params {
int nMajorityRejectBlockOutdated;
int nMajorityWindow;
/** Proof of work parameters */
- arith_uint256 powLimit;
+ uint256 powLimit;
bool fPowAllowMinDifficultyBlocks;
int64_t nPowTargetSpacing;
int64_t nPowTargetTimespan;
@@ -29,4 +28,4 @@ struct Params {
};
} // namespace Consensus
-#endif // BITCOIN_CONSENSUS_CONSENSUS_PARAMS_H
+#endif // BITCOIN_CONSENSUS_PARAMS_H
diff --git a/src/consensus/validation.h b/src/consensus/validation.h
new file mode 100644
index 0000000000..a97d983a31
--- /dev/null
+++ b/src/consensus/validation.h
@@ -0,0 +1,80 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// Copyright (c) 2009-2014 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_CONSENSUS_VALIDATION_H
+#define BITCOIN_CONSENSUS_VALIDATION_H
+
+#include <string>
+
+/** "reject" message codes */
+static const unsigned char REJECT_MALFORMED = 0x01;
+static const unsigned char REJECT_INVALID = 0x10;
+static const unsigned char REJECT_OBSOLETE = 0x11;
+static const unsigned char REJECT_DUPLICATE = 0x12;
+static const unsigned char REJECT_NONSTANDARD = 0x40;
+static const unsigned char REJECT_DUST = 0x41;
+static const unsigned char REJECT_INSUFFICIENTFEE = 0x42;
+static const unsigned char REJECT_CHECKPOINT = 0x43;
+
+/** Capture information about block/transaction validation */
+class CValidationState {
+private:
+ enum mode_state {
+ MODE_VALID, //! everything ok
+ MODE_INVALID, //! network rule violation (DoS value may be set)
+ MODE_ERROR, //! run-time error
+ } mode;
+ int nDoS;
+ std::string strRejectReason;
+ unsigned char chRejectCode;
+ bool corruptionPossible;
+public:
+ CValidationState() : mode(MODE_VALID), nDoS(0), chRejectCode(0), corruptionPossible(false) {}
+ bool DoS(int level, bool ret = false,
+ unsigned char chRejectCodeIn=0, std::string strRejectReasonIn="",
+ bool corruptionIn=false) {
+ chRejectCode = chRejectCodeIn;
+ strRejectReason = strRejectReasonIn;
+ corruptionPossible = corruptionIn;
+ if (mode == MODE_ERROR)
+ return ret;
+ nDoS += level;
+ mode = MODE_INVALID;
+ return ret;
+ }
+ bool Invalid(bool ret = false,
+ unsigned char _chRejectCode=0, std::string _strRejectReason="") {
+ return DoS(0, ret, _chRejectCode, _strRejectReason);
+ }
+ bool Error(const std::string& strRejectReasonIn) {
+ if (mode == MODE_VALID)
+ strRejectReason = strRejectReasonIn;
+ mode = MODE_ERROR;
+ return false;
+ }
+ bool IsValid() const {
+ return mode == MODE_VALID;
+ }
+ bool IsInvalid() const {
+ return mode == MODE_INVALID;
+ }
+ bool IsError() const {
+ return mode == MODE_ERROR;
+ }
+ bool IsInvalid(int &nDoSOut) const {
+ if (IsInvalid()) {
+ nDoSOut = nDoS;
+ return true;
+ }
+ return false;
+ }
+ bool CorruptionPossible() const {
+ return corruptionPossible;
+ }
+ unsigned char GetRejectCode() const { return chRejectCode; }
+ std::string GetRejectReason() const { return strRejectReason; }
+};
+
+#endif // BITCOIN_CONSENSUS_VALIDATION_H
diff --git a/src/core_io.h b/src/core_io.h
index 0989cf7437..115e3199dc 100644
--- a/src/core_io.h
+++ b/src/core_io.h
@@ -15,7 +15,7 @@ class uint256;
class UniValue;
// core_read.cpp
-extern CScript ParseScript(std::string s);
+extern CScript ParseScript(const std::string& s);
extern bool DecodeHexTx(CTransaction& tx, const std::string& strHexTx);
extern bool DecodeHexBlk(CBlock&, const std::string& strHexBlk);
extern uint256 ParseHashUV(const UniValue& v, const std::string& strName);
diff --git a/src/core_read.cpp b/src/core_read.cpp
index e064955ff0..f762f2c3b7 100644
--- a/src/core_read.cpp
+++ b/src/core_read.cpp
@@ -22,7 +22,7 @@
using namespace std;
-CScript ParseScript(std::string s)
+CScript ParseScript(const std::string& s)
{
CScript result;
diff --git a/src/hash.cpp b/src/hash.cpp
index 20d5d21777..9711293e38 100644
--- a/src/hash.cpp
+++ b/src/hash.cpp
@@ -5,6 +5,7 @@
#include "hash.h"
#include "crypto/common.h"
#include "crypto/hmac_sha512.h"
+#include "pubkey.h"
inline uint32_t ROTL32(uint32_t x, int8_t r)
@@ -71,15 +72,12 @@ unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char
return h1;
}
-void BIP32Hash(const unsigned char chainCode[32], unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64])
+void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64])
{
unsigned char num[4];
num[0] = (nChild >> 24) & 0xFF;
num[1] = (nChild >> 16) & 0xFF;
num[2] = (nChild >> 8) & 0xFF;
num[3] = (nChild >> 0) & 0xFF;
- CHMAC_SHA512(chainCode, 32).Write(&header, 1)
- .Write(data, 32)
- .Write(num, 4)
- .Finalize(output);
+ CHMAC_SHA512(chainCode.begin(), chainCode.size()).Write(&header, 1).Write(data, 32).Write(num, 4).Finalize(output);
}
diff --git a/src/hash.h b/src/hash.h
index e56b784a61..0771555623 100644
--- a/src/hash.h
+++ b/src/hash.h
@@ -14,6 +14,8 @@
#include <vector>
+typedef uint256 ChainCode;
+
/** A hasher class for Bitcoin's 256-bit hash (double SHA-256). */
class CHash256 {
private:
@@ -159,6 +161,6 @@ uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL
unsigned int MurmurHash3(unsigned int nHashSeed, const std::vector<unsigned char>& vDataToHash);
-void BIP32Hash(const unsigned char chainCode[32], unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]);
+void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64]);
#endif // BITCOIN_HASH_H
diff --git a/src/init.cpp b/src/init.cpp
index 53e521983f..b9510bec9d 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -13,12 +13,14 @@
#include "amount.h"
#include "checkpoints.h"
#include "compat/sanity.h"
+#include "consensus/validation.h"
#include "key.h"
#include "main.h"
#include "miner.h"
#include "net.h"
#include "rpcserver.h"
#include "script/standard.h"
+#include "scheduler.h"
#include "txdb.h"
#include "ui_interface.h"
#include "util.h"
@@ -38,7 +40,9 @@
#include <boost/algorithm/string/predicate.hpp>
#include <boost/algorithm/string/replace.hpp>
+#include <boost/bind.hpp>
#include <boost/filesystem.hpp>
+#include <boost/function.hpp>
#include <boost/interprocess/sync/file_lock.hpp>
#include <boost/thread.hpp>
#include <openssl/crypto.h>
@@ -52,7 +56,7 @@ bool fFeeEstimatesInitialized = false;
#ifdef WIN32
// Win32 LevelDB doesn't use filedescriptors, and the ones used for
-// accessing block files, don't count towards to fd_set size limit
+// accessing block files don't count towards the fd_set size limit
// anyway.
#define MIN_CORE_FILEDESCRIPTORS 0
#else
@@ -68,7 +72,7 @@ enum BindFlags {
};
static const char* FEE_ESTIMATES_FILENAME="fee_estimates.dat";
-CClientUIInterface uiInterface;
+CClientUIInterface uiInterface; // Declared but not defined in ui_interface.h
//////////////////////////////////////////////////////////////////////////////
//
@@ -123,7 +127,7 @@ public:
LogPrintf("Error reading from database: %s\n", e.what());
// Starting the shutdown sequence and returning false to the caller would be
// interpreted as 'entry not found' (as opposed to unable to read data), and
- // could lead to invalid interpration. Just exit immediately, as we can't
+ // could lead to invalid interpretation. Just exit immediately, as we can't
// continue anyway, and all writes should be atomic.
abort();
}
@@ -152,8 +156,8 @@ void Shutdown()
#ifdef ENABLE_WALLET
if (pwalletMain)
pwalletMain->Flush(false);
- GenerateBitcoins(false, NULL, 0);
#endif
+ GenerateBitcoins(false, 0, Params());
StopNode();
UnregisterNodeSignals(GetNodeSignals());
@@ -187,13 +191,18 @@ void Shutdown()
pwalletMain->Flush(true);
#endif
#ifndef WIN32
- boost::filesystem::remove(GetPidFile());
+ try {
+ boost::filesystem::remove(GetPidFile());
+ } catch (const boost::filesystem::filesystem_error& e) {
+ LogPrintf("%s: Unable to remove pidfile: %s\n", __func__, e.what());
+ }
#endif
UnregisterAllValidationInterfaces();
#ifdef ENABLE_WALLET
delete pwalletMain;
pwalletMain = NULL;
#endif
+ ECC_Stop();
LogPrintf("%s: done\n", __func__);
}
@@ -242,11 +251,6 @@ void OnRPCStopped()
void OnRPCPreCommand(const CRPCCommand& cmd)
{
-#ifdef ENABLE_WALLET
- if (cmd.reqWallet && !pwalletMain)
- throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
-#endif
-
// Observe safe mode
string strWarning = GetWarnings("rpc");
if (strWarning != "" && !GetBoolArg("-disablesafemode", false) &&
@@ -256,10 +260,13 @@ void OnRPCPreCommand(const CRPCCommand& cmd)
std::string HelpMessage(HelpMessageMode mode)
{
+ const bool showDebug = GetBoolArg("-help-debug", false);
// When adding new options to the categories, please keep and ensure alphabetical ordering.
+ // Do not translate _(...) -help-debug options, Many technical terms, and only a very small audience, so is unnecessary stress to translators.
string strUsage = HelpMessageGroup(_("Options:"));
strUsage += HelpMessageOpt("-?", _("This help message"));
+ strUsage += HelpMessageOpt("-alerts", strprintf(_("Receive and display P2P network alerts (default: %u)"), DEFAULT_ALERTS));
strUsage += HelpMessageOpt("-alertnotify=<cmd>", _("Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)"));
strUsage += HelpMessageOpt("-blocknotify=<cmd>", _("Execute command when the best block changes (%s in cmd is replaced by block hash)"));
strUsage += HelpMessageOpt("-checkblocks=<n>", strprintf(_("How many blocks to check at startup (default: %u, 0 = all)"), 288));
@@ -280,7 +287,10 @@ std::string HelpMessage(HelpMessageMode mode)
#ifndef WIN32
strUsage += HelpMessageOpt("-pid=<file>", strprintf(_("Specify pid file (default: %s)"), "bitcoind.pid"));
#endif
- strUsage += HelpMessageOpt("-reindex", _("Rebuild block chain index from current blk000??.dat files") + " " + _("on startup"));
+ strUsage += HelpMessageOpt("-prune=<n>", strprintf(_("Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. "
+ "Warning: Reverting this setting requires re-downloading the entire blockchain. "
+ "(default: 0 = disable pruning blocks, >%u = target size in MiB to use for block files)"), MIN_DISK_SPACE_FOR_BLOCK_FILES / 1024 / 1024));
+ strUsage += HelpMessageOpt("-reindex", _("Rebuild block chain index from current blk000??.dat files on startup"));
#if !defined(WIN32)
strUsage += HelpMessageOpt("-sysperms", _("Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)"));
#endif
@@ -306,11 +316,12 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += HelpMessageOpt("-permitbaremultisig", strprintf(_("Relay non-P2SH multisig (default: %u)"), 1));
strUsage += HelpMessageOpt("-port=<port>", strprintf(_("Listen for connections on <port> (default: %u or testnet: %u)"), 8333, 18333));
strUsage += HelpMessageOpt("-proxy=<ip:port>", _("Connect through SOCKS5 proxy"));
+ strUsage += HelpMessageOpt("-proxyrandomize", strprintf(_("Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)"), 1));
strUsage += HelpMessageOpt("-seednode=<ip>", _("Connect to a node to retrieve peer addresses, and disconnect"));
strUsage += HelpMessageOpt("-timeout=<n>", strprintf(_("Specify connection timeout in milliseconds (minimum: 1, default: %d)"), DEFAULT_CONNECT_TIMEOUT));
#ifdef USE_UPNP
#if USE_UPNP
- strUsage += HelpMessageOpt("-upnp", _("Use UPnP to map the listening port (default: 1 when listening)"));
+ strUsage += HelpMessageOpt("-upnp", _("Use UPnP to map the listening port (default: 1 when listening and no -proxy)"));
#else
strUsage += HelpMessageOpt("-upnp", strprintf(_("Use UPnP to map the listening port (default: %u)"), 0));
#endif
@@ -318,22 +329,21 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += HelpMessageOpt("-whitebind=<addr>", _("Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6"));
strUsage += HelpMessageOpt("-whitelist=<netmask>", _("Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.") +
" " + _("Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway"));
-
#ifdef ENABLE_WALLET
strUsage += HelpMessageGroup(_("Wallet options:"));
strUsage += HelpMessageOpt("-disablewallet", _("Do not load the wallet and disable wallet RPC calls"));
strUsage += HelpMessageOpt("-keypool=<n>", strprintf(_("Set key pool size to <n> (default: %u)"), 100));
- if (GetBoolArg("-help-debug", false))
- strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf(_("Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)"),
+ if (showDebug)
+ strUsage += HelpMessageOpt("-mintxfee=<amt>", strprintf("Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)",
FormatMoney(CWallet::minTxFee.GetFeePerK())));
strUsage += HelpMessageOpt("-paytxfee=<amt>", strprintf(_("Fee (in BTC/kB) to add to transactions you send (default: %s)"), FormatMoney(payTxFee.GetFeePerK())));
strUsage += HelpMessageOpt("-rescan", _("Rescan the block chain for missing wallet transactions") + " " + _("on startup"));
strUsage += HelpMessageOpt("-salvagewallet", _("Attempt to recover private keys from a corrupt wallet.dat") + " " + _("on startup"));
strUsage += HelpMessageOpt("-sendfreetransactions", strprintf(_("Send transactions as zero-fee transactions if possible (default: %u)"), 0));
strUsage += HelpMessageOpt("-spendzeroconfchange", strprintf(_("Spend unconfirmed change when sending transactions (default: %u)"), 1));
- strUsage += HelpMessageOpt("-txconfirmtarget=<n>", strprintf(_("If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)"), 1));
- strUsage += HelpMessageOpt("-maxtxfee=<amt>", strprintf(_("Maximum total fees to use in a single wallet transaction, setting too low may abort large transactions (default: %s)"),
+ strUsage += HelpMessageOpt("-txconfirmtarget=<n>", strprintf(_("If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)"), DEFAULT_TX_CONFIRM_TARGET));
+ strUsage += HelpMessageOpt("-maxtxfee=<amt>", strprintf(_("Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)"),
FormatMoney(maxTxFee)));
strUsage += HelpMessageOpt("-upgradewallet", _("Upgrade wallet to latest format") + " " + _("on startup"));
strUsage += HelpMessageOpt("-wallet=<file>", _("Specify wallet file (within data directory)") + " " + strprintf(_("(default: %s)"), "wallet.dat"));
@@ -341,48 +351,44 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += HelpMessageOpt("-walletnotify=<cmd>", _("Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)"));
strUsage += HelpMessageOpt("-zapwallettxes=<mode>", _("Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup") +
" " + _("(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)"));
-
#endif
strUsage += HelpMessageGroup(_("Debugging/Testing options:"));
- if (GetBoolArg("-help-debug", false))
+ if (showDebug)
{
- strUsage += HelpMessageOpt("-checkpoints", strprintf(_("Only accept block chain matching built-in checkpoints (default: %u)"), 1));
- strUsage += HelpMessageOpt("-dblogsize=<n>", strprintf(_("Flush database activity from memory pool to disk log every <n> megabytes (default: %u)"), 100));
- strUsage += HelpMessageOpt("-disablesafemode", strprintf(_("Disable safemode, override a real safe mode event (default: %u)"), 0));
- strUsage += HelpMessageOpt("-testsafemode", strprintf(_("Force safe mode (default: %u)"), 0));
- strUsage += HelpMessageOpt("-dropmessagestest=<n>", _("Randomly drop 1 of every <n> network messages"));
- strUsage += HelpMessageOpt("-fuzzmessagestest=<n>", _("Randomly fuzz 1 of every <n> network messages"));
- strUsage += HelpMessageOpt("-flushwallet", strprintf(_("Run a thread to flush wallet periodically (default: %u)"), 1));
- strUsage += HelpMessageOpt("-stopafterblockimport", strprintf(_("Stop running after importing blocks from disk (default: %u)"), 0));
+ strUsage += HelpMessageOpt("-checkpoints", strprintf("Disable expensive verification for known chain history (default: %u)", 1));
+ strUsage += HelpMessageOpt("-dblogsize=<n>", strprintf("Flush database activity from memory pool to disk log every <n> megabytes (default: %u)", 100));
+ strUsage += HelpMessageOpt("-disablesafemode", strprintf("Disable safemode, override a real safe mode event (default: %u)", 0));
+ strUsage += HelpMessageOpt("-testsafemode", strprintf("Force safe mode (default: %u)", 0));
+ strUsage += HelpMessageOpt("-dropmessagestest=<n>", "Randomly drop 1 of every <n> network messages");
+ strUsage += HelpMessageOpt("-fuzzmessagestest=<n>", "Randomly fuzz 1 of every <n> network messages");
+ strUsage += HelpMessageOpt("-flushwallet", strprintf("Run a thread to flush wallet periodically (default: %u)", 1));
+ strUsage += HelpMessageOpt("-stopafterblockimport", strprintf("Stop running after importing blocks from disk (default: %u)", 0));
}
- string debugCategories = "addrman, alert, bench, coindb, db, lock, rand, rpc, selectcoins, mempool, net"; // Don't translate these and qt below
+ string debugCategories = "addrman, alert, bench, coindb, db, lock, rand, rpc, selectcoins, mempool, net, proxy, prune"; // Don't translate these and qt below
if (mode == HMM_BITCOIN_QT)
debugCategories += ", qt";
strUsage += HelpMessageOpt("-debug=<category>", strprintf(_("Output debugging information (default: %u, supplying <category> is optional)"), 0) + ". " +
- _("If <category> is not supplied, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
-#ifdef ENABLE_WALLET
+ _("If <category> is not supplied or if <category> = 1, output all debugging information.") + _("<category> can be:") + " " + debugCategories + ".");
strUsage += HelpMessageOpt("-gen", strprintf(_("Generate coins (default: %u)"), 0));
strUsage += HelpMessageOpt("-genproclimit=<n>", strprintf(_("Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)"), 1));
-#endif
strUsage += HelpMessageOpt("-help-debug", _("Show all debugging options (usage: --help -help-debug)"));
strUsage += HelpMessageOpt("-logips", strprintf(_("Include IP addresses in debug output (default: %u)"), 0));
strUsage += HelpMessageOpt("-logtimestamps", strprintf(_("Prepend debug output with timestamp (default: %u)"), 1));
- if (GetBoolArg("-help-debug", false))
+ if (showDebug)
{
- strUsage += HelpMessageOpt("-limitfreerelay=<n>", strprintf(_("Continuously rate-limit free transactions to <n>*1000 bytes per minute (default:%u)"), 15));
- strUsage += HelpMessageOpt("-relaypriority", strprintf(_("Require high priority for relaying free or low-fee transactions (default:%u)"), 1));
- strUsage += HelpMessageOpt("-maxsigcachesize=<n>", strprintf(_("Limit size of signature cache to <n> entries (default: %u)"), 50000));
+ strUsage += HelpMessageOpt("-limitfreerelay=<n>", strprintf("Continuously rate-limit free transactions to <n>*1000 bytes per minute (default: %u)", 15));
+ strUsage += HelpMessageOpt("-relaypriority", strprintf("Require high priority for relaying free or low-fee transactions (default: %u)", 1));
+ strUsage += HelpMessageOpt("-maxsigcachesize=<n>", strprintf("Limit size of signature cache to <n> entries (default: %u)", 50000));
}
strUsage += HelpMessageOpt("-minrelaytxfee=<amt>", strprintf(_("Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)"), FormatMoney(::minRelayTxFee.GetFeePerK())));
strUsage += HelpMessageOpt("-printtoconsole", _("Send trace/debug info to console instead of debug.log file"));
- if (GetBoolArg("-help-debug", false))
+ if (showDebug)
{
- strUsage += HelpMessageOpt("-printpriority", strprintf(_("Log transaction priority and fee per kB when mining blocks (default: %u)"), 0));
- strUsage += HelpMessageOpt("-privdb", strprintf(_("Sets the DB_PRIVATE flag in the wallet db environment (default: %u)"), 1));
- strUsage += HelpMessageOpt("-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.") + " " +
- _("In this mode -genproclimit controls how many blocks are generated immediately."));
+ strUsage += HelpMessageOpt("-printpriority", strprintf("Log transaction priority and fee per kB when mining blocks (default: %u)", 0));
+ strUsage += HelpMessageOpt("-privdb", strprintf("Sets the DB_PRIVATE flag in the wallet db environment (default: %u)", 1));
+ strUsage += HelpMessageOpt("-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.");
}
strUsage += HelpMessageOpt("-shrinkdebugfile", _("Shrink debug.log file on client startup (default: 1 when no -debug)"));
strUsage += HelpMessageOpt("-testnet", _("Use the test network"));
@@ -395,6 +401,8 @@ std::string HelpMessage(HelpMessageMode mode)
strUsage += HelpMessageOpt("-blockminsize=<n>", strprintf(_("Set minimum block size in bytes (default: %u)"), 0));
strUsage += HelpMessageOpt("-blockmaxsize=<n>", strprintf(_("Set maximum block size in bytes (default: %d)"), DEFAULT_BLOCK_MAX_SIZE));
strUsage += HelpMessageOpt("-blockprioritysize=<n>", strprintf(_("Set maximum size of high-priority/low-fee transactions in bytes (default: %d)"), DEFAULT_BLOCK_PRIORITY_SIZE));
+ if (showDebug)
+ strUsage += HelpMessageOpt("-blockversion=<n>", strprintf("Override block version to test forking scenarios (default: %d)", (int)CBlock::CURRENT_VERSION));
strUsage += HelpMessageGroup(_("RPC server options:"));
strUsage += HelpMessageOpt("-server", _("Accept command line and JSON-RPC commands"));
@@ -416,8 +424,8 @@ std::string HelpMessage(HelpMessageMode mode)
if (mode == HMM_BITCOIN_QT)
{
strUsage += HelpMessageGroup(_("UI Options:"));
- if (GetBoolArg("-help-debug", false)) {
- strUsage += HelpMessageOpt("-allowselfsignedrootcertificates", _("Allow self signed root certificates (default: 0)"));
+ if (showDebug) {
+ strUsage += HelpMessageOpt("-allowselfsignedrootcertificates", "Allow self signed root certificates (default: 0)");
}
strUsage += HelpMessageOpt("-choosedatadir", _("Choose data directory on startup (default: 0)"));
strUsage += HelpMessageOpt("-lang=<lang>", _("Set language, for example \"de_DE\" (default: system locale)"));
@@ -462,10 +470,52 @@ struct CImportingNow
}
};
+
+// If we're using -prune with -reindex, then delete block files that will be ignored by the
+// reindex. Since reindexing works by starting at block file 0 and looping until a blockfile
+// is missing, do the same here to delete any later block files after a gap. Also delete all
+// rev files since they'll be rewritten by the reindex anyway. This ensures that vinfoBlockFile
+// is in sync with what's actually on disk by the time we start downloading, so that pruning
+// works correctly.
+void CleanupBlockRevFiles()
+{
+ using namespace boost::filesystem;
+ map<string, path> mapBlockFiles;
+
+ // Glob all blk?????.dat and rev?????.dat files from the blocks directory.
+ // Remove the rev files immediately and insert the blk file paths into an
+ // ordered map keyed by block file index.
+ LogPrintf("Removing unusable blk?????.dat and rev?????.dat files for -reindex with -prune\n");
+ path blocksdir = GetDataDir() / "blocks";
+ for (directory_iterator it(blocksdir); it != directory_iterator(); it++) {
+ if (is_regular_file(*it) &&
+ it->path().filename().string().length() == 12 &&
+ it->path().filename().string().substr(8,4) == ".dat")
+ {
+ if (it->path().filename().string().substr(0,3) == "blk")
+ mapBlockFiles[it->path().filename().string().substr(3,5)] = it->path();
+ else if (it->path().filename().string().substr(0,3) == "rev")
+ remove(it->path());
+ }
+ }
+
+ // Remove all block files that aren't part of a contiguous set starting at
+ // zero by walking the ordered map (keys are block file indices) by
+ // keeping a separate counter. Once we hit a gap (or if 0 doesn't exist)
+ // start removing block files.
+ int nContigCounter = 0;
+ BOOST_FOREACH(const PAIRTYPE(string, path)& item, mapBlockFiles) {
+ if (atoi(item.first) == nContigCounter) {
+ nContigCounter++;
+ continue;
+ }
+ remove(item.second);
+ }
+}
+
void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
{
RenameThread("bitcoin-loadblk");
-
// -reindex
if (fReindex) {
CImportingNow imp;
@@ -504,7 +554,7 @@ void ThreadImport(std::vector<boost::filesystem::path> vImportFiles)
}
// -loadblock=
- BOOST_FOREACH(boost::filesystem::path &path, vImportFiles) {
+ BOOST_FOREACH(const boost::filesystem::path& path, vImportFiles) {
FILE *file = fopen(path.string().c_str(), "rb");
if (file) {
CImportingNow imp;
@@ -541,7 +591,7 @@ bool InitSanityCheck(void)
/** Initialize bitcoin.
* @pre Parameters should be parsed and config file should be read.
*/
-bool AppInit2(boost::thread_group& threadGroup)
+bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler)
{
// ********************************************************* Step 1: setup
#ifdef _MSC_VER
@@ -607,6 +657,7 @@ bool AppInit2(boost::thread_group& threadGroup)
#endif
// ********************************************************* Step 2: parameter interactions
+ const CChainParams& chainparams = Params();
// Set this early so that parameter interactions go to console
fPrintToConsole = GetBoolArg("-printtoconsole", false);
@@ -636,6 +687,10 @@ bool AppInit2(boost::thread_group& threadGroup)
// to protect privacy, do not listen by default if a default proxy server is specified
if (SoftSetBoolArg("-listen", false))
LogPrintf("%s: parameter interaction: -proxy set -> setting -listen=0\n", __func__);
+ // to protect privacy, do not use UPNP when a proxy is set. The user may still specify -listen=1
+ // to listen locally, so don't rely on this happening through -listen below.
+ if (SoftSetBoolArg("-upnp", false))
+ LogPrintf("%s: parameter interaction: -proxy set -> setting -upnp=0\n", __func__);
// to protect privacy, do not discover addresses by default
if (SoftSetBoolArg("-discover", false))
LogPrintf("%s: parameter interaction: -proxy set -> setting -discover=0\n", __func__);
@@ -677,6 +732,17 @@ bool AppInit2(boost::thread_group& threadGroup)
if (nFD - MIN_CORE_FILEDESCRIPTORS < nMaxConnections)
nMaxConnections = nFD - MIN_CORE_FILEDESCRIPTORS;
+ // if using block pruning, then disable txindex
+ if (GetArg("-prune", 0)) {
+ if (GetBoolArg("-txindex", false))
+ return InitError(_("Prune mode is incompatible with -txindex."));
+#ifdef ENABLE_WALLET
+ if (GetBoolArg("-rescan", false)) {
+ return InitError(_("Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again."));
+ }
+#endif
+ }
+
// ********************************************************* Step 3: parameter-to-internal-flags
fDebug = !mapMultiArgs["-debug"].empty();
@@ -699,9 +765,9 @@ bool AppInit2(boost::thread_group& threadGroup)
InitWarning(_("Warning: Unsupported argument -benchmark ignored, use -debug=bench."));
// Checkmempool and checkblockindex default to true in regtest mode
- mempool.setSanityCheck(GetBoolArg("-checkmempool", Params().DefaultConsistencyChecks()));
- fCheckBlockIndex = GetBoolArg("-checkblockindex", Params().DefaultConsistencyChecks());
- Checkpoints::fEnabled = GetBoolArg("-checkpoints", true);
+ mempool.setSanityCheck(GetBoolArg("-checkmempool", chainparams.DefaultConsistencyChecks()));
+ fCheckBlockIndex = GetBoolArg("-checkblockindex", chainparams.DefaultConsistencyChecks());
+ fCheckpointsEnabled = GetBoolArg("-checkpoints", true);
// -par=0 means autodetect, but nScriptCheckThreads==0 means no concurrency
nScriptCheckThreads = GetArg("-par", DEFAULT_SCRIPTCHECK_THREADS);
@@ -713,6 +779,21 @@ bool AppInit2(boost::thread_group& threadGroup)
nScriptCheckThreads = MAX_SCRIPTCHECK_THREADS;
fServer = GetBoolArg("-server", false);
+
+ // block pruning; get the amount of disk space (in MB) to allot for block & undo files
+ int64_t nSignedPruneTarget = GetArg("-prune", 0) * 1024 * 1024;
+ if (nSignedPruneTarget < 0) {
+ return InitError(_("Prune cannot be configured with a negative value."));
+ }
+ nPruneTarget = (uint64_t) nSignedPruneTarget;
+ if (nPruneTarget) {
+ if (nPruneTarget < MIN_DISK_SPACE_FOR_BLOCK_FILES) {
+ return InitError(strprintf(_("Prune configured below the minimum of %d MB. Please use a higher number."), MIN_DISK_SPACE_FOR_BLOCK_FILES / 1024 / 1024));
+ }
+ LogPrintf("Prune configured to target %uMiB on disk for block and undo files.\n", nPruneTarget / 1024 / 1024);
+ fPruneMode = true;
+ }
+
#ifdef ENABLE_WALLET
bool fDisableWallet = GetBoolArg("-disablewallet", false);
#endif
@@ -721,12 +802,6 @@ bool AppInit2(boost::thread_group& threadGroup)
if (nConnectTimeout <= 0)
nConnectTimeout = DEFAULT_CONNECT_TIMEOUT;
- // Continue to put "/P2SH/" in the coinbase to monitor
- // BIP16 support.
- // This can be removed eventually...
- const char* pszP2SH = "/P2SH/";
- COINBASE_FLAGS << std::vector<unsigned char>(pszP2SH, pszP2SH+strlen(pszP2SH));
-
// Fee-per-kilobyte amount considered the same as "free"
// If you are mining, be careful setting this:
// if you set it to zero then
@@ -779,18 +854,26 @@ bool AppInit2(boost::thread_group& threadGroup)
mapArgs["-maxtxfee"], ::minRelayTxFee.ToString()));
}
}
- nTxConfirmTarget = GetArg("-txconfirmtarget", 1);
- bSpendZeroConfChange = GetArg("-spendzeroconfchange", true);
- fSendFreeTransactions = GetArg("-sendfreetransactions", false);
+ nTxConfirmTarget = GetArg("-txconfirmtarget", DEFAULT_TX_CONFIRM_TARGET);
+ bSpendZeroConfChange = GetBoolArg("-spendzeroconfchange", true);
+ fSendFreeTransactions = GetBoolArg("-sendfreetransactions", false);
std::string strWalletFile = GetArg("-wallet", "wallet.dat");
#endif // ENABLE_WALLET
- fIsBareMultisigStd = GetArg("-permitbaremultisig", true) != 0;
+ fIsBareMultisigStd = GetBoolArg("-permitbaremultisig", true);
nMaxDatacarrierBytes = GetArg("-datacarriersize", nMaxDatacarrierBytes);
+ fAlerts = GetBoolArg("-alerts", DEFAULT_ALERTS);
+
+ // Option to startup with mocktime set (used for regression testing):
+ SetMockTime(GetArg("-mocktime", 0)); // SetMockTime(0) is a no-op
+
// ********************************************************* Step 4: application initialization: dir lock, daemonize, pidfile, debug log
+ // Initialize elliptic curve code
+ ECC_Start();
+
// Sanity check
if (!InitSanityCheck())
return InitError(_("Initialization sanity check failed. Bitcoin Core is shutting down."));
@@ -805,9 +888,15 @@ bool AppInit2(boost::thread_group& threadGroup)
boost::filesystem::path pathLockFile = GetDataDir() / ".lock";
FILE* file = fopen(pathLockFile.string().c_str(), "a"); // empty lock file; created if it doesn't exist.
if (file) fclose(file);
- static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
- if (!lock.try_lock())
- return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running."), strDataDir));
+
+ try {
+ static boost::interprocess::file_lock lock(pathLockFile.string().c_str());
+ if (!lock.try_lock())
+ return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running."), strDataDir));
+ } catch(const boost::interprocess::interprocess_exception& e) {
+ return InitError(strprintf(_("Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.") + " %s.", strDataDir, e.what()));
+ }
+
#ifndef WIN32
CreatePidFile(GetPidFile(), getpid());
#endif
@@ -833,6 +922,10 @@ bool AppInit2(boost::thread_group& threadGroup)
threadGroup.create_thread(&ThreadScriptCheck);
}
+ // Start the lightweight task scheduler thread
+ CScheduler::Function serviceLoop = boost::bind(&CScheduler::serviceQueue, &scheduler);
+ threadGroup.create_thread(boost::bind(&TraceThread<CScheduler::Function>, "scheduler", serviceLoop));
+
/* 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
@@ -856,15 +949,15 @@ bool AppInit2(boost::thread_group& threadGroup)
std::string warningString;
std::string errorString;
-
+
if (!CWallet::Verify(strWalletFile, warningString, errorString))
return false;
-
+
if (!warningString.empty())
InitWarning(warningString);
if (!errorString.empty())
return InitError(warningString);
-
+
} // (!fDisableWallet)
#endif // ENABLE_WALLET
// ********************************************************* Step 6: network initialization
@@ -873,7 +966,7 @@ bool AppInit2(boost::thread_group& threadGroup)
if (mapArgs.count("-onlynet")) {
std::set<enum Network> nets;
- BOOST_FOREACH(std::string snet, mapMultiArgs["-onlynet"]) {
+ BOOST_FOREACH(const std::string& snet, mapMultiArgs["-onlynet"]) {
enum Network net = ParseNetwork(snet);
if (net == NET_UNROUTABLE)
return InitError(strprintf(_("Unknown network specified in -onlynet: '%s'"), snet));
@@ -895,31 +988,36 @@ bool AppInit2(boost::thread_group& threadGroup)
}
}
- CService addrProxy;
- bool fProxy = false;
- if (mapArgs.count("-proxy")) {
- addrProxy = CService(mapArgs["-proxy"], 9050);
+ bool proxyRandomize = GetBoolArg("-proxyrandomize", true);
+ // -proxy sets a proxy for all outgoing network traffic
+ // -noproxy (or -proxy=0) as well as the empty string can be used to not set a proxy, this is the default
+ std::string proxyArg = GetArg("-proxy", "");
+ if (proxyArg != "" && proxyArg != "0") {
+ proxyType addrProxy = proxyType(CService(proxyArg, 9050), proxyRandomize);
if (!addrProxy.IsValid())
- return InitError(strprintf(_("Invalid -proxy address: '%s'"), mapArgs["-proxy"]));
+ return InitError(strprintf(_("Invalid -proxy address: '%s'"), proxyArg));
SetProxy(NET_IPV4, addrProxy);
SetProxy(NET_IPV6, addrProxy);
+ SetProxy(NET_TOR, addrProxy);
SetNameProxy(addrProxy);
- fProxy = true;
+ SetReachable(NET_TOR); // by default, -proxy sets onion as reachable, unless -noonion later
}
- // -onion can override normal proxy, -noonion disables tor entirely
- if (!(mapArgs.count("-onion") && mapArgs["-onion"] == "0") &&
- (fProxy || mapArgs.count("-onion"))) {
- CService addrOnion;
- if (!mapArgs.count("-onion"))
- addrOnion = addrProxy;
- else
- addrOnion = CService(mapArgs["-onion"], 9050);
- if (!addrOnion.IsValid())
- return InitError(strprintf(_("Invalid -onion address: '%s'"), mapArgs["-onion"]));
- SetProxy(NET_TOR, addrOnion);
- SetReachable(NET_TOR);
+ // -onion can be used to set only a proxy for .onion, or override normal proxy for .onion addresses
+ // -noonion (or -onion=0) disables connecting to .onion entirely
+ // An empty string is used to not override the onion proxy (in which case it defaults to -proxy set above, or none)
+ std::string onionArg = GetArg("-onion", "");
+ if (onionArg != "") {
+ if (onionArg == "0") { // Handle -noonion/-onion=0
+ SetReachable(NET_TOR, false); // set onions as unreachable
+ } else {
+ proxyType addrOnion = proxyType(CService(onionArg, 9050), proxyRandomize);
+ if (!addrOnion.IsValid())
+ return InitError(strprintf(_("Invalid -onion address: '%s'"), onionArg));
+ SetProxy(NET_TOR, addrOnion);
+ SetReachable(NET_TOR);
+ }
}
// see Step 2: parameter interactions for more information about these
@@ -930,13 +1028,13 @@ bool AppInit2(boost::thread_group& threadGroup)
bool fBound = false;
if (fListen) {
if (mapArgs.count("-bind") || mapArgs.count("-whitebind")) {
- BOOST_FOREACH(std::string strBind, mapMultiArgs["-bind"]) {
+ BOOST_FOREACH(const std::string& strBind, mapMultiArgs["-bind"]) {
CService addrBind;
if (!Lookup(strBind.c_str(), addrBind, GetListenPort(), false))
return InitError(strprintf(_("Cannot resolve -bind address: '%s'"), strBind));
fBound |= Bind(addrBind, (BF_EXPLICIT | BF_REPORT_ERROR));
}
- BOOST_FOREACH(std::string strBind, mapMultiArgs["-whitebind"]) {
+ BOOST_FOREACH(const std::string& strBind, mapMultiArgs["-whitebind"]) {
CService addrBind;
if (!Lookup(strBind.c_str(), addrBind, 0, false))
return InitError(strprintf(_("Cannot resolve -whitebind address: '%s'"), strBind));
@@ -956,7 +1054,7 @@ bool AppInit2(boost::thread_group& threadGroup)
}
if (mapArgs.count("-externalip")) {
- BOOST_FOREACH(string strAddr, mapMultiArgs["-externalip"]) {
+ BOOST_FOREACH(const std::string& strAddr, mapMultiArgs["-externalip"]) {
CService addrLocal(strAddr, GetListenPort(), fNameLookup);
if (!addrLocal.IsValid())
return InitError(strprintf(_("Cannot resolve -externalip address: '%s'"), strAddr));
@@ -964,7 +1062,7 @@ bool AppInit2(boost::thread_group& threadGroup)
}
}
- BOOST_FOREACH(string strDest, mapMultiArgs["-seednode"])
+ BOOST_FOREACH(const std::string& strDest, mapMultiArgs["-seednode"])
AddOneShot(strDest);
// ********************************************************* Step 7: load block chain
@@ -999,18 +1097,20 @@ bool AppInit2(boost::thread_group& threadGroup)
}
// cache size calculations
- size_t nTotalCache = (GetArg("-dbcache", nDefaultDbCache) << 20);
- if (nTotalCache < (nMinDbCache << 20))
- nTotalCache = (nMinDbCache << 20); // total cache cannot be less than nMinDbCache
- else if (nTotalCache > (nMaxDbCache << 20))
- nTotalCache = (nMaxDbCache << 20); // total cache cannot be greater than nMaxDbCache
- size_t nBlockTreeDBCache = nTotalCache / 8;
+ int64_t nTotalCache = (GetArg("-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 greated than nMaxDbcache
+ int64_t nBlockTreeDBCache = nTotalCache / 8;
if (nBlockTreeDBCache > (1 << 21) && !GetBoolArg("-txindex", false))
nBlockTreeDBCache = (1 << 21); // block tree db cache shouldn't be larger than 2 MiB
nTotalCache -= nBlockTreeDBCache;
- size_t nCoinDBCache = nTotalCache / 2; // use half of the remaining cache for coindb cache
+ int64_t nCoinDBCache = std::min(nTotalCache / 2, (nTotalCache / 4) + (1 << 23)); // use 25%-50% of the remainder for disk cache
nTotalCache -= nCoinDBCache;
- nCoinCacheSize = nTotalCache / 300; // coins in memory require around 300 bytes
+ nCoinCacheUsage = nTotalCache; // the rest goes to in-memory cache
+ LogPrintf("Cache configuration:\n");
+ LogPrintf("* Using %.1fMiB for block index database\n", nBlockTreeDBCache * (1.0 / 1024 / 1024));
+ LogPrintf("* Using %.1fMiB for chain state database\n", nCoinDBCache * (1.0 / 1024 / 1024));
+ LogPrintf("* Using %.1fMiB for in-memory UTXO set\n", nCoinCacheUsage * (1.0 / 1024 / 1024));
bool fLoaded = false;
while (!fLoaded) {
@@ -1033,8 +1133,12 @@ bool AppInit2(boost::thread_group& threadGroup)
pcoinscatcher = new CCoinsViewErrorCatcher(pcoinsdbview);
pcoinsTip = new CCoinsViewCache(pcoinscatcher);
- if (fReindex)
+ if (fReindex) {
pblocktree->WriteReindexing(true);
+ //If we're reindexing in prune mode, wipe away unusable block files and all undo data files
+ if (fPruneMode)
+ CleanupBlockRevFiles();
+ }
if (!LoadBlockIndex()) {
strLoadError = _("Error loading block database");
@@ -1043,7 +1147,7 @@ bool AppInit2(boost::thread_group& threadGroup)
// If the loaded chain has a wrong genesis, bail out immediately
// (we're likely using a testnet datadir, or the other way around).
- if (!mapBlockIndex.empty() && mapBlockIndex.count(Params().HashGenesisBlock()) == 0)
+ if (!mapBlockIndex.empty() && mapBlockIndex.count(chainparams.GetConsensus().hashGenesisBlock) == 0)
return InitError(_("Incorrect or no genesis block found. Wrong datadir for network?"));
// Initialize the block index (no-op if non-empty database was already loaded)
@@ -1058,7 +1162,18 @@ bool AppInit2(boost::thread_group& threadGroup)
break;
}
+ // Check for changed -prune state. What we are concerned about is a user who has pruned blocks
+ // in the past, but is now trying to run unpruned.
+ if (fHavePruned && !fPruneMode) {
+ strLoadError = _("You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain");
+ break;
+ }
+
uiInterface.InitMessage(_("Verifying blocks..."));
+ if (fHavePruned && GetArg("-checkblocks", 288) > MIN_BLOCKS_TO_KEEP) {
+ LogPrintf("Prune: pruned datadir may not have more than %d blocks; -checkblocks=%d may fail\n",
+ MIN_BLOCKS_TO_KEEP, GetArg("-checkblocks", 288));
+ }
if (!CVerifyDB().VerifyDB(pcoinsdbview, GetArg("-checklevel", 3),
GetArg("-checkblocks", 288))) {
strLoadError = _("Corrupted block database detected");
@@ -1109,6 +1224,15 @@ bool AppInit2(boost::thread_group& threadGroup)
mempool.ReadFeeEstimates(est_filein);
fFeeEstimatesInitialized = true;
+ // if prune mode, unset NODE_NETWORK and prune block files
+ if (fPruneMode) {
+ LogPrintf("Unsetting NODE_NETWORK on prune mode\n");
+ nLocalServices &= ~NODE_NETWORK;
+ if (!fReindex) {
+ PruneAndFlush();
+ }
+ }
+
// ********************************************************* Step 8: load wallet
#ifdef ENABLE_WALLET
if (fDisableWallet) {
@@ -1211,6 +1335,19 @@ bool AppInit2(boost::thread_group& threadGroup)
}
if (chainActive.Tip() && chainActive.Tip() != pindexRescan)
{
+ //We can't rescan beyond non-pruned blocks, stop and throw an error
+ //this might happen if a user uses a old wallet within a pruned node
+ // or if he ran -disablewallet for a longer time, then decided to re-enable
+ if (fPruneMode)
+ {
+ CBlockIndex *block = chainActive.Tip();
+ while (block && block->pprev && (block->pprev->nStatus & BLOCK_HAVE_DATA) && block->pprev->nTx > 0 && pindexRescan != block)
+ block = block->pprev;
+
+ if (pindexRescan != block)
+ return InitError(_("Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)"));
+ }
+
uiInterface.InitMessage(_("Rescanning..."));
LogPrintf("Rescanning last %i blocks (from block %i)...\n", chainActive.Height() - pindexRescan->nHeight, pindexRescan->nHeight);
nStart = GetTimeMillis();
@@ -1247,13 +1384,14 @@ bool AppInit2(boost::thread_group& threadGroup)
pwalletMain->SetBroadcastTransactions(GetBoolArg("-walletbroadcast", true));
} // (!fDisableWallet)
#else // ENABLE_WALLET
- LogPrintf("No wallet compiled in!\n");
+ LogPrintf("No wallet support compiled in!\n");
#endif // !ENABLE_WALLET
// ********************************************************* Step 9: import blocks
if (mapArgs.count("-blocknotify"))
uiInterface.NotifyBlockTip.connect(BlockNotifyCallback);
+ uiInterface.InitMessage(_("Activating best chain..."));
// scan for better chains in the block chain database, that are not yet connected in the active best chain
CValidationState state;
if (!ActivateBestChain(state))
@@ -1262,7 +1400,7 @@ bool AppInit2(boost::thread_group& threadGroup)
std::vector<boost::filesystem::path> vImportFiles;
if (mapArgs.count("-loadblock"))
{
- BOOST_FOREACH(string strFile, mapMultiArgs["-loadblock"])
+ BOOST_FOREACH(const std::string& strFile, mapMultiArgs["-loadblock"])
vImportFiles.push_back(strFile);
}
threadGroup.create_thread(boost::bind(&ThreadImport, vImportFiles));
@@ -1291,13 +1429,16 @@ bool AppInit2(boost::thread_group& threadGroup)
LogPrintf("mapAddressBook.size() = %u\n", pwalletMain ? pwalletMain->mapAddressBook.size() : 0);
#endif
- StartNode(threadGroup);
+ StartNode(threadGroup, scheduler);
+
+ // Monitor the chain, and alert if we get blocks much quicker or slower than expected
+ int64_t nPowTargetSpacing = Params().GetConsensus().nPowTargetSpacing;
+ CScheduler::Function f = boost::bind(&PartitionCheck, &IsInitialBlockDownload,
+ boost::ref(cs_main), boost::cref(pindexBestHeader), nPowTargetSpacing);
+ scheduler.scheduleEvery(f, nPowTargetSpacing);
-#ifdef ENABLE_WALLET
// Generate coins in the background
- if (pwalletMain)
- GenerateBitcoins(GetBoolArg("-gen", false), pwalletMain, GetArg("-genproclimit", 1));
-#endif
+ GenerateBitcoins(GetBoolArg("-gen", false), GetArg("-genproclimit", 1), Params());
// ********************************************************* Step 11: finished
diff --git a/src/init.h b/src/init.h
index d451f65be9..dcb2b29360 100644
--- a/src/init.h
+++ b/src/init.h
@@ -8,6 +8,7 @@
#include <string>
+class CScheduler;
class CWallet;
namespace boost
@@ -20,7 +21,7 @@ extern CWallet* pwalletMain;
void StartShutdown();
bool ShutdownRequested();
void Shutdown();
-bool AppInit2(boost::thread_group& threadGroup);
+bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler);
/** The help message mode determines what help message to show */
enum HelpMessageMode {
diff --git a/src/json/LICENSE.txt b/src/json/LICENSE.txt
deleted file mode 100644
index 797d5363b3..0000000000
--- a/src/json/LICENSE.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-The MIT License
-
-Copyright (c) 2007 - 2009 John W. Wilkinson
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/src/json/json_spirit.h b/src/json/json_spirit.h
deleted file mode 100644
index ac1879d5b3..0000000000
--- a/src/json/json_spirit.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef JSON_SPIRIT
-#define JSON_SPIRIT
-
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include "json_spirit_value.h"
-#include "json_spirit_reader.h"
-#include "json_spirit_writer.h"
-#include "json_spirit_utils.h"
-
-#endif
diff --git a/src/json/json_spirit_error_position.h b/src/json/json_spirit_error_position.h
deleted file mode 100644
index 17208507df..0000000000
--- a/src/json/json_spirit_error_position.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef JSON_SPIRIT_ERROR_POSITION
-#define JSON_SPIRIT_ERROR_POSITION
-
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <string>
-
-namespace json_spirit
-{
- // An Error_position exception is thrown by the "read_or_throw" functions below on finding an error.
- // Note the "read_or_throw" functions are around 3 times slower than the standard functions "read"
- // functions that return a bool.
- //
- struct Error_position
- {
- Error_position();
- Error_position( unsigned int line, unsigned int column, const std::string& reason );
- bool operator==( const Error_position& lhs ) const;
- unsigned int line_;
- unsigned int column_;
- std::string reason_;
- };
-
- inline Error_position::Error_position()
- : line_( 0 )
- , column_( 0 )
- {
- }
-
- inline Error_position::Error_position( unsigned int line, unsigned int column, const std::string& reason )
- : line_( line )
- , column_( column )
- , reason_( reason )
- {
- }
-
- inline bool Error_position::operator==( const Error_position& lhs ) const
- {
- if( this == &lhs ) return true;
-
- return ( reason_ == lhs.reason_ ) &&
- ( line_ == lhs.line_ ) &&
- ( column_ == lhs.column_ );
-}
-}
-
-#endif
diff --git a/src/json/json_spirit_reader.cpp b/src/json/json_spirit_reader.cpp
deleted file mode 100644
index aa4f637226..0000000000
--- a/src/json/json_spirit_reader.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#include "json_spirit_reader.h"
-#include "json_spirit_reader_template.h"
-
-using namespace json_spirit;
-
-bool json_spirit::read( const std::string& s, Value& value )
-{
- return read_string( s, value );
-}
-
-void json_spirit::read_or_throw( const std::string& s, Value& value )
-{
- read_string_or_throw( s, value );
-}
-
-bool json_spirit::read( std::istream& is, Value& value )
-{
- return read_stream( is, value );
-}
-
-void json_spirit::read_or_throw( std::istream& is, Value& value )
-{
- read_stream_or_throw( is, value );
-}
-
-bool json_spirit::read( std::string::const_iterator& begin, std::string::const_iterator end, Value& value )
-{
- return read_range( begin, end, value );
-}
-
-void json_spirit::read_or_throw( std::string::const_iterator& begin, std::string::const_iterator end, Value& value )
-{
- begin = read_range_or_throw( begin, end, value );
-}
-
-#ifndef BOOST_NO_STD_WSTRING
-
-bool json_spirit::read( const std::wstring& s, wValue& value )
-{
- return read_string( s, value );
-}
-
-void json_spirit::read_or_throw( const std::wstring& s, wValue& value )
-{
- read_string_or_throw( s, value );
-}
-
-bool json_spirit::read( std::wistream& is, wValue& value )
-{
- return read_stream( is, value );
-}
-
-void json_spirit::read_or_throw( std::wistream& is, wValue& value )
-{
- read_stream_or_throw( is, value );
-}
-
-bool json_spirit::read( std::wstring::const_iterator& begin, std::wstring::const_iterator end, wValue& value )
-{
- return read_range( begin, end, value );
-}
-
-void json_spirit::read_or_throw( std::wstring::const_iterator& begin, std::wstring::const_iterator end, wValue& value )
-{
- begin = read_range_or_throw( begin, end, value );
-}
-
-#endif
-
-bool json_spirit::read( const std::string& s, mValue& value )
-{
- return read_string( s, value );
-}
-
-void json_spirit::read_or_throw( const std::string& s, mValue& value )
-{
- read_string_or_throw( s, value );
-}
-
-bool json_spirit::read( std::istream& is, mValue& value )
-{
- return read_stream( is, value );
-}
-
-void json_spirit::read_or_throw( std::istream& is, mValue& value )
-{
- read_stream_or_throw( is, value );
-}
-
-bool json_spirit::read( std::string::const_iterator& begin, std::string::const_iterator end, mValue& value )
-{
- return read_range( begin, end, value );
-}
-
-void json_spirit::read_or_throw( std::string::const_iterator& begin, std::string::const_iterator end, mValue& value )
-{
- begin = read_range_or_throw( begin, end, value );
-}
-
-#ifndef BOOST_NO_STD_WSTRING
-
-bool json_spirit::read( const std::wstring& s, wmValue& value )
-{
- return read_string( s, value );
-}
-
-void json_spirit::read_or_throw( const std::wstring& s, wmValue& value )
-{
- read_string_or_throw( s, value );
-}
-
-bool json_spirit::read( std::wistream& is, wmValue& value )
-{
- return read_stream( is, value );
-}
-
-void json_spirit::read_or_throw( std::wistream& is, wmValue& value )
-{
- read_stream_or_throw( is, value );
-}
-
-bool json_spirit::read( std::wstring::const_iterator& begin, std::wstring::const_iterator end, wmValue& value )
-{
- return read_range( begin, end, value );
-}
-
-void json_spirit::read_or_throw( std::wstring::const_iterator& begin, std::wstring::const_iterator end, wmValue& value )
-{
- begin = read_range_or_throw( begin, end, value );
-}
-
-#endif
diff --git a/src/json/json_spirit_reader.h b/src/json/json_spirit_reader.h
deleted file mode 100644
index 96494a9789..0000000000
--- a/src/json/json_spirit_reader.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef JSON_SPIRIT_READER
-#define JSON_SPIRIT_READER
-
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include "json_spirit_value.h"
-#include "json_spirit_error_position.h"
-#include <iostream>
-
-namespace json_spirit
-{
- // functions to reads a JSON values
-
- bool read( const std::string& s, Value& value );
- bool read( std::istream& is, Value& value );
- bool read( std::string::const_iterator& begin, std::string::const_iterator end, Value& value );
-
- void read_or_throw( const std::string& s, Value& value );
- void read_or_throw( std::istream& is, Value& value );
- void read_or_throw( std::string::const_iterator& begin, std::string::const_iterator end, Value& value );
-
-#ifndef BOOST_NO_STD_WSTRING
-
- bool read( const std::wstring& s, wValue& value );
- bool read( std::wistream& is, wValue& value );
- bool read( std::wstring::const_iterator& begin, std::wstring::const_iterator end, wValue& value );
-
- void read_or_throw( const std::wstring& s, wValue& value );
- void read_or_throw( std::wistream& is, wValue& value );
- void read_or_throw( std::wstring::const_iterator& begin, std::wstring::const_iterator end, wValue& value );
-
-#endif
-
- bool read( const std::string& s, mValue& value );
- bool read( std::istream& is, mValue& value );
- bool read( std::string::const_iterator& begin, std::string::const_iterator end, mValue& value );
-
- void read_or_throw( const std::string& s, mValue& value );
- void read_or_throw( std::istream& is, mValue& value );
- void read_or_throw( std::string::const_iterator& begin, std::string::const_iterator end, mValue& value );
-
-#ifndef BOOST_NO_STD_WSTRING
-
- bool read( const std::wstring& s, wmValue& value );
- bool read( std::wistream& is, wmValue& value );
- bool read( std::wstring::const_iterator& begin, std::wstring::const_iterator end, wmValue& value );
-
- void read_or_throw( const std::wstring& s, wmValue& value );
- void read_or_throw( std::wistream& is, wmValue& value );
- void read_or_throw( std::wstring::const_iterator& begin, std::wstring::const_iterator end, wmValue& value );
-
-#endif
-}
-
-#endif
diff --git a/src/json/json_spirit_reader_template.h b/src/json/json_spirit_reader_template.h
deleted file mode 100644
index 46f5892f62..0000000000
--- a/src/json/json_spirit_reader_template.h
+++ /dev/null
@@ -1,612 +0,0 @@
-#ifndef JSON_SPIRIT_READER_TEMPLATE
-#define JSON_SPIRIT_READER_TEMPLATE
-
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#include "json_spirit_value.h"
-#include "json_spirit_error_position.h"
-
-//#define BOOST_SPIRIT_THREADSAFE // uncomment for multithreaded use, requires linking to boost.thread
-
-#include <boost/bind.hpp>
-#include <boost/function.hpp>
-#include <boost/version.hpp>
-
-#if BOOST_VERSION >= 103800
- #include <boost/spirit/include/classic_core.hpp>
- #include <boost/spirit/include/classic_confix.hpp>
- #include <boost/spirit/include/classic_escape_char.hpp>
- #include <boost/spirit/include/classic_multi_pass.hpp>
- #include <boost/spirit/include/classic_position_iterator.hpp>
- #define spirit_namespace boost::spirit::classic
-#else
- #include <boost/spirit/core.hpp>
- #include <boost/spirit/utility/confix.hpp>
- #include <boost/spirit/utility/escape_char.hpp>
- #include <boost/spirit/iterator/multi_pass.hpp>
- #include <boost/spirit/iterator/position_iterator.hpp>
- #define spirit_namespace boost::spirit
-#endif
-
-namespace json_spirit
-{
- const spirit_namespace::int_parser < int64_t > int64_p = spirit_namespace::int_parser < int64_t >();
- const spirit_namespace::uint_parser< uint64_t > uint64_p = spirit_namespace::uint_parser< uint64_t >();
-
- template< class Iter_type >
- bool is_eq( Iter_type first, Iter_type last, const char* c_str )
- {
- for( Iter_type i = first; i != last; ++i, ++c_str )
- {
- if( *c_str == 0 ) return false;
-
- if( *i != *c_str ) return false;
- }
-
- return true;
- }
-
- template< class Char_type >
- Char_type hex_to_num( const Char_type c )
- {
- if( ( c >= '0' ) && ( c <= '9' ) ) return c - '0';
- if( ( c >= 'a' ) && ( c <= 'f' ) ) return c - 'a' + 10;
- if( ( c >= 'A' ) && ( c <= 'F' ) ) return c - 'A' + 10;
- return 0;
- }
-
- template< class Char_type, class Iter_type >
- Char_type hex_str_to_char( Iter_type& begin )
- {
- const Char_type c1( *( ++begin ) );
- const Char_type c2( *( ++begin ) );
-
- return ( hex_to_num( c1 ) << 4 ) + hex_to_num( c2 );
- }
-
- template< class Char_type, class Iter_type >
- Char_type unicode_str_to_char( Iter_type& begin )
- {
- const Char_type c1( *( ++begin ) );
- const Char_type c2( *( ++begin ) );
- const Char_type c3( *( ++begin ) );
- const Char_type c4( *( ++begin ) );
-
- return ( hex_to_num( c1 ) << 12 ) +
- ( hex_to_num( c2 ) << 8 ) +
- ( hex_to_num( c3 ) << 4 ) +
- hex_to_num( c4 );
- }
-
- template< class String_type >
- void append_esc_char_and_incr_iter( String_type& s,
- typename String_type::const_iterator& begin,
- typename String_type::const_iterator end )
- {
- typedef typename String_type::value_type Char_type;
-
- const Char_type c2( *begin );
-
- switch( c2 )
- {
- case 't': s += '\t'; break;
- case 'b': s += '\b'; break;
- case 'f': s += '\f'; break;
- case 'n': s += '\n'; break;
- case 'r': s += '\r'; break;
- case '\\': s += '\\'; break;
- case '/': s += '/'; break;
- case '"': s += '"'; break;
- case 'x':
- {
- if( end - begin >= 3 ) // expecting "xHH..."
- {
- s += hex_str_to_char< Char_type >( begin );
- }
- break;
- }
- case 'u':
- {
- if( end - begin >= 5 ) // expecting "uHHHH..."
- {
- s += unicode_str_to_char< Char_type >( begin );
- }
- break;
- }
- }
- }
-
- template< class String_type >
- String_type substitute_esc_chars( typename String_type::const_iterator begin,
- typename String_type::const_iterator end )
- {
- typedef typename String_type::const_iterator Iter_type;
-
- if( end - begin < 2 ) return String_type( begin, end );
-
- String_type result;
-
- result.reserve( end - begin );
-
- const Iter_type end_minus_1( end - 1 );
-
- Iter_type substr_start = begin;
- Iter_type i = begin;
-
- for( ; i < end_minus_1; ++i )
- {
- if( *i == '\\' )
- {
- result.append( substr_start, i );
-
- ++i; // skip the '\'
-
- append_esc_char_and_incr_iter( result, i, end );
-
- substr_start = i + 1;
- }
- }
-
- result.append( substr_start, end );
-
- return result;
- }
-
- template< class String_type >
- String_type get_str_( typename String_type::const_iterator begin,
- typename String_type::const_iterator end )
- {
- assert( end - begin >= 2 );
-
- typedef typename String_type::const_iterator Iter_type;
-
- Iter_type str_without_quotes( ++begin );
- Iter_type end_without_quotes( --end );
-
- return substitute_esc_chars< String_type >( str_without_quotes, end_without_quotes );
- }
-
- inline std::string get_str( std::string::const_iterator begin, std::string::const_iterator end )
- {
- return get_str_< std::string >( begin, end );
- }
-
- inline std::wstring get_str( std::wstring::const_iterator begin, std::wstring::const_iterator end )
- {
- return get_str_< std::wstring >( begin, end );
- }
-
- template< class String_type, class Iter_type >
- String_type get_str( Iter_type begin, Iter_type end )
- {
- const String_type tmp( begin, end ); // convert multipass iterators to string iterators
-
- return get_str( tmp.begin(), tmp.end() );
- }
-
- // this class's methods get called by the spirit parse resulting
- // in the creation of a JSON object or array
- //
- // NB Iter_type could be a std::string iterator, wstring iterator, a position iterator or a multipass iterator
- //
- template< class Value_type, class Iter_type >
- class Semantic_actions
- {
- public:
-
- typedef typename Value_type::Config_type Config_type;
- typedef typename Config_type::String_type String_type;
- typedef typename Config_type::Object_type Object_type;
- typedef typename Config_type::Array_type Array_type;
- typedef typename String_type::value_type Char_type;
-
- Semantic_actions( Value_type& value )
- : value_( value )
- , current_p_( 0 )
- {
- }
-
- void begin_obj( Char_type c )
- {
- assert( c == '{' );
-
- begin_compound< Object_type >();
- }
-
- void end_obj( Char_type c )
- {
- assert( c == '}' );
-
- end_compound();
- }
-
- void begin_array( Char_type c )
- {
- assert( c == '[' );
-
- begin_compound< Array_type >();
- }
-
- void end_array( Char_type c )
- {
- assert( c == ']' );
-
- end_compound();
- }
-
- void new_name( Iter_type begin, Iter_type end )
- {
- assert( current_p_->type() == obj_type );
-
- name_ = get_str< String_type >( begin, end );
- }
-
- void new_str( Iter_type begin, Iter_type end )
- {
- add_to_current( get_str< String_type >( begin, end ) );
- }
-
- void new_true( Iter_type begin, Iter_type end )
- {
- assert( is_eq( begin, end, "true" ) );
-
- add_to_current( true );
- }
-
- void new_false( Iter_type begin, Iter_type end )
- {
- assert( is_eq( begin, end, "false" ) );
-
- add_to_current( false );
- }
-
- void new_null( Iter_type begin, Iter_type end )
- {
- assert( is_eq( begin, end, "null" ) );
-
- add_to_current( Value_type() );
- }
-
- void new_int( int64_t i )
- {
- add_to_current( i );
- }
-
- void new_uint64( uint64_t ui )
- {
- add_to_current( ui );
- }
-
- void new_real( double d )
- {
- add_to_current( d );
- }
-
- private:
-
- Semantic_actions& operator=( const Semantic_actions& );
- // to prevent "assignment operator could not be generated" warning
-
- Value_type* add_first( const Value_type& value )
- {
- assert( current_p_ == 0 );
-
- value_ = value;
- current_p_ = &value_;
- return current_p_;
- }
-
- template< class Array_or_obj >
- void begin_compound()
- {
- if( current_p_ == 0 )
- {
- add_first( Array_or_obj() );
- }
- else
- {
- stack_.push_back( current_p_ );
-
- Array_or_obj new_array_or_obj; // avoid copy by building new array or object in place
-
- current_p_ = add_to_current( new_array_or_obj );
- }
- }
-
- void end_compound()
- {
- if( current_p_ != &value_ )
- {
- current_p_ = stack_.back();
-
- stack_.pop_back();
- }
- }
-
- Value_type* add_to_current( const Value_type& value )
- {
- if( current_p_ == 0 )
- {
- return add_first( value );
- }
- else if( current_p_->type() == array_type )
- {
- current_p_->get_array().push_back( value );
-
- return &current_p_->get_array().back();
- }
-
- assert( current_p_->type() == obj_type );
-
- return &Config_type::add( current_p_->get_obj(), name_, value );
- }
-
- Value_type& value_; // this is the object or array that is being created
- Value_type* current_p_; // the child object or array that is currently being constructed
-
- std::vector< Value_type* > stack_; // previous child objects and arrays
-
- String_type name_; // of current name/value pair
- };
-
- template< typename Iter_type >
- void throw_error( spirit_namespace::position_iterator< Iter_type > i, const std::string& reason )
- {
- throw Error_position( i.get_position().line, i.get_position().column, reason );
- }
-
- template< typename Iter_type >
- void throw_error( Iter_type i, const std::string& reason )
- {
- throw reason;
- }
-
- // the spirit grammer
- //
- template< class Value_type, class Iter_type >
- class Json_grammer : public spirit_namespace::grammar< Json_grammer< Value_type, Iter_type > >
- {
- public:
-
- typedef Semantic_actions< Value_type, Iter_type > Semantic_actions_t;
-
- Json_grammer( Semantic_actions_t& semantic_actions )
- : actions_( semantic_actions )
- {
- }
-
- static void throw_not_value( Iter_type begin, Iter_type end )
- {
- throw_error( begin, "not a value" );
- }
-
- static void throw_not_array( Iter_type begin, Iter_type end )
- {
- throw_error( begin, "not an array" );
- }
-
- static void throw_not_object( Iter_type begin, Iter_type end )
- {
- throw_error( begin, "not an object" );
- }
-
- static void throw_not_pair( Iter_type begin, Iter_type end )
- {
- throw_error( begin, "not a pair" );
- }
-
- static void throw_not_colon( Iter_type begin, Iter_type end )
- {
- throw_error( begin, "no colon in pair" );
- }
-
- static void throw_not_string( Iter_type begin, Iter_type end )
- {
- throw_error( begin, "not a string" );
- }
-
- template< typename ScannerT >
- class definition
- {
- public:
-
- definition( const Json_grammer& self )
- {
- using namespace spirit_namespace;
-
- typedef typename Value_type::String_type::value_type Char_type;
-
- // first we convert the semantic action class methods to functors with the
- // parameter signature expected by spirit
-
- typedef boost::function< void( Char_type ) > Char_action;
- typedef boost::function< void( Iter_type, Iter_type ) > Str_action;
- typedef boost::function< void( double ) > Real_action;
- typedef boost::function< void( int64_t ) > Int_action;
- typedef boost::function< void( uint64_t ) > Uint64_action;
-
- Char_action begin_obj ( boost::bind( &Semantic_actions_t::begin_obj, &self.actions_, _1 ) );
- Char_action end_obj ( boost::bind( &Semantic_actions_t::end_obj, &self.actions_, _1 ) );
- Char_action begin_array( boost::bind( &Semantic_actions_t::begin_array, &self.actions_, _1 ) );
- Char_action end_array ( boost::bind( &Semantic_actions_t::end_array, &self.actions_, _1 ) );
- Str_action new_name ( boost::bind( &Semantic_actions_t::new_name, &self.actions_, _1, _2 ) );
- Str_action new_str ( boost::bind( &Semantic_actions_t::new_str, &self.actions_, _1, _2 ) );
- Str_action new_true ( boost::bind( &Semantic_actions_t::new_true, &self.actions_, _1, _2 ) );
- Str_action new_false ( boost::bind( &Semantic_actions_t::new_false, &self.actions_, _1, _2 ) );
- Str_action new_null ( boost::bind( &Semantic_actions_t::new_null, &self.actions_, _1, _2 ) );
- Real_action new_real ( boost::bind( &Semantic_actions_t::new_real, &self.actions_, _1 ) );
- Int_action new_int ( boost::bind( &Semantic_actions_t::new_int, &self.actions_, _1 ) );
- Uint64_action new_uint64 ( boost::bind( &Semantic_actions_t::new_uint64, &self.actions_, _1 ) );
-
- // actual grammer
-
- json_
- = value_ | eps_p[ &throw_not_value ]
- ;
-
- value_
- = string_[ new_str ]
- | number_
- | object_
- | array_
- | str_p( "true" ) [ new_true ]
- | str_p( "false" )[ new_false ]
- | str_p( "null" ) [ new_null ]
- ;
-
- object_
- = ch_p('{')[ begin_obj ]
- >> !members_
- >> ( ch_p('}')[ end_obj ] | eps_p[ &throw_not_object ] )
- ;
-
- members_
- = pair_ >> *( ',' >> pair_ )
- ;
-
- pair_
- = string_[ new_name ]
- >> ( ':' | eps_p[ &throw_not_colon ] )
- >> ( value_ | eps_p[ &throw_not_value ] )
- ;
-
- array_
- = ch_p('[')[ begin_array ]
- >> !elements_
- >> ( ch_p(']')[ end_array ] | eps_p[ &throw_not_array ] )
- ;
-
- elements_
- = value_ >> *( ',' >> value_ )
- ;
-
- string_
- = lexeme_d // this causes white space inside a string to be retained
- [
- confix_p
- (
- '"',
- *lex_escape_ch_p,
- '"'
- )
- ]
- ;
-
- number_
- = strict_real_p[ new_real ]
- | int64_p [ new_int ]
- | uint64_p [ new_uint64 ]
- ;
- }
-
- spirit_namespace::rule< ScannerT > json_, object_, members_, pair_, array_, elements_, value_, string_, number_;
-
- const spirit_namespace::rule< ScannerT >& start() const { return json_; }
- };
-
- private:
-
- Json_grammer& operator=( const Json_grammer& ); // to prevent "assignment operator could not be generated" warning
-
- Semantic_actions_t& actions_;
- };
-
- template< class Iter_type, class Value_type >
- Iter_type read_range_or_throw( Iter_type begin, Iter_type end, Value_type& value )
- {
- Semantic_actions< Value_type, Iter_type > semantic_actions( value );
-
- const spirit_namespace::parse_info< Iter_type > info =
- spirit_namespace::parse( begin, end,
- Json_grammer< Value_type, Iter_type >( semantic_actions ),
- spirit_namespace::space_p );
-
- if( !info.hit )
- {
- assert( false ); // in theory exception should already have been thrown
- throw_error( info.stop, "error" );
- }
-
- return info.stop;
- }
-
- template< class Iter_type, class Value_type >
- void add_posn_iter_and_read_range_or_throw( Iter_type begin, Iter_type end, Value_type& value )
- {
- typedef spirit_namespace::position_iterator< Iter_type > Posn_iter_t;
-
- const Posn_iter_t posn_begin( begin, end );
- const Posn_iter_t posn_end( end, end );
-
- read_range_or_throw( posn_begin, posn_end, value );
- }
-
- template< class Iter_type, class Value_type >
- bool read_range( Iter_type& begin, Iter_type end, Value_type& value )
- {
- try
- {
- begin = read_range_or_throw( begin, end, value );
-
- return true;
- }
- catch( ... )
- {
- return false;
- }
- }
-
- template< class String_type, class Value_type >
- void read_string_or_throw( const String_type& s, Value_type& value )
- {
- add_posn_iter_and_read_range_or_throw( s.begin(), s.end(), value );
- }
-
- template< class String_type, class Value_type >
- bool read_string( const String_type& s, Value_type& value )
- {
- typename String_type::const_iterator begin = s.begin();
-
- return read_range( begin, s.end(), value );
- }
-
- template< class Istream_type >
- struct Multi_pass_iters
- {
- typedef typename Istream_type::char_type Char_type;
- typedef std::istream_iterator< Char_type, Char_type > istream_iter;
- typedef spirit_namespace::multi_pass< istream_iter > Mp_iter;
-
- Multi_pass_iters( Istream_type& is )
- {
- is.unsetf( std::ios::skipws );
-
- begin_ = spirit_namespace::make_multi_pass( istream_iter( is ) );
- end_ = spirit_namespace::make_multi_pass( istream_iter() );
- }
-
- Mp_iter begin_;
- Mp_iter end_;
- };
-
- template< class Istream_type, class Value_type >
- bool read_stream( Istream_type& is, Value_type& value )
- {
- Multi_pass_iters< Istream_type > mp_iters( is );
-
- return read_range( mp_iters.begin_, mp_iters.end_, value );
- }
-
- template< class Istream_type, class Value_type >
- void read_stream_or_throw( Istream_type& is, Value_type& value )
- {
- const Multi_pass_iters< Istream_type > mp_iters( is );
-
- add_posn_iter_and_read_range_or_throw( mp_iters.begin_, mp_iters.end_, value );
- }
-}
-
-#endif
diff --git a/src/json/json_spirit_stream_reader.h b/src/json/json_spirit_stream_reader.h
deleted file mode 100644
index 7e59c9adc2..0000000000
--- a/src/json/json_spirit_stream_reader.h
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef JSON_SPIRIT_READ_STREAM
-#define JSON_SPIRIT_READ_STREAM
-
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include "json_spirit_reader_template.h"
-
-namespace json_spirit
-{
- // these classes allows you to read multiple top level contiguous values from a stream,
- // the normal stream read functions have a bug that prevent multiple top level values
- // from being read unless they are separated by spaces
-
- template< class Istream_type, class Value_type >
- class Stream_reader
- {
- public:
-
- Stream_reader( Istream_type& is )
- : iters_( is )
- {
- }
-
- bool read_next( Value_type& value )
- {
- return read_range( iters_.begin_, iters_.end_, value );
- }
-
- private:
-
- typedef Multi_pass_iters< Istream_type > Mp_iters;
-
- Mp_iters iters_;
- };
-
- template< class Istream_type, class Value_type >
- class Stream_reader_thrower
- {
- public:
-
- Stream_reader_thrower( Istream_type& is )
- : iters_( is )
- , posn_begin_( iters_.begin_, iters_.end_ )
- , posn_end_( iters_.end_, iters_.end_ )
- {
- }
-
- void read_next( Value_type& value )
- {
- posn_begin_ = read_range_or_throw( posn_begin_, posn_end_, value );
- }
-
- private:
-
- typedef Multi_pass_iters< Istream_type > Mp_iters;
- typedef spirit_namespace::position_iterator< typename Mp_iters::Mp_iter > Posn_iter_t;
-
- Mp_iters iters_;
- Posn_iter_t posn_begin_, posn_end_;
- };
-}
-
-#endif
diff --git a/src/json/json_spirit_utils.h b/src/json/json_spirit_utils.h
deleted file mode 100644
index 553e3b96a4..0000000000
--- a/src/json/json_spirit_utils.h
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef JSON_SPIRIT_UTILS
-#define JSON_SPIRIT_UTILS
-
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include "json_spirit_value.h"
-#include <map>
-
-namespace json_spirit
-{
- template< class Obj_t, class Map_t >
- void obj_to_map( const Obj_t& obj, Map_t& mp_obj )
- {
- mp_obj.clear();
-
- for( typename Obj_t::const_iterator i = obj.begin(); i != obj.end(); ++i )
- {
- mp_obj[ i->name_ ] = i->value_;
- }
- }
-
- template< class Obj_t, class Map_t >
- void map_to_obj( const Map_t& mp_obj, Obj_t& obj )
- {
- obj.clear();
-
- for( typename Map_t::const_iterator i = mp_obj.begin(); i != mp_obj.end(); ++i )
- {
- obj.push_back( typename Obj_t::value_type( i->first, i->second ) );
- }
- }
-
- typedef std::map< std::string, Value > Mapped_obj;
-
-#ifndef BOOST_NO_STD_WSTRING
- typedef std::map< std::wstring, wValue > wMapped_obj;
-#endif
-
- template< class Object_type, class String_type >
- const typename Object_type::value_type::Value_type& find_value( const Object_type& obj, const String_type& name )
- {
- for( typename Object_type::const_iterator i = obj.begin(); i != obj.end(); ++i )
- {
- if( i->name_ == name )
- {
- return i->value_;
- }
- }
-
- return Object_type::value_type::Value_type::null;
- }
-}
-
-#endif
diff --git a/src/json/json_spirit_value.cpp b/src/json/json_spirit_value.cpp
deleted file mode 100644
index 44d2f06a01..0000000000
--- a/src/json/json_spirit_value.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Copyright (c) 2007 John W Wilkinson
-
- This source code can be used for any purpose as long as
- this comment is retained. */
-
-// json spirit version 2.00
-
-#include "json_spirit_value.h"
diff --git a/src/json/json_spirit_value.h b/src/json/json_spirit_value.h
deleted file mode 100644
index 13cc89210c..0000000000
--- a/src/json/json_spirit_value.h
+++ /dev/null
@@ -1,534 +0,0 @@
-#ifndef JSON_SPIRIT_VALUE
-#define JSON_SPIRIT_VALUE
-
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <vector>
-#include <map>
-#include <string>
-#include <cassert>
-#include <sstream>
-#include <stdexcept>
-#include <stdint.h>
-#include <boost/config.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/variant.hpp>
-
-namespace json_spirit
-{
- enum Value_type{ obj_type, array_type, str_type, bool_type, int_type, real_type, null_type };
- static const char* Value_type_name[]={"obj", "array", "str", "bool", "int", "real", "null"};
-
- template< class Config > // Config determines whether the value uses std::string or std::wstring and
- // whether JSON Objects are represented as vectors or maps
- class Value_impl
- {
- public:
-
- typedef Config Config_type;
- typedef typename Config::String_type String_type;
- typedef typename Config::Object_type Object;
- typedef typename Config::Array_type Array;
- typedef typename String_type::const_pointer Const_str_ptr; // eg const char*
-
- Value_impl(); // creates null value
- Value_impl( Const_str_ptr value );
- Value_impl( const String_type& value );
- Value_impl( const Object& value );
- Value_impl( const Array& value );
- Value_impl( bool value );
- Value_impl( int value );
- Value_impl( int64_t value );
- Value_impl( uint64_t value );
- Value_impl( double value );
-
- Value_impl( const Value_impl& other );
-
- bool operator==( const Value_impl& lhs ) const;
-
- Value_impl& operator=( const Value_impl& lhs );
-
- Value_type type() const;
-
- bool is_uint64() const;
- bool is_null() const;
-
- const String_type& get_str() const;
- const Object& get_obj() const;
- const Array& get_array() const;
- bool get_bool() const;
- int get_int() const;
- int64_t get_int64() const;
- uint64_t get_uint64() const;
- double get_real() const;
-
- Object& get_obj();
- Array& get_array();
-
- template< typename T > T get_value() const; // example usage: int i = value.get_value< int >();
- // or double d = value.get_value< double >();
-
- static const Value_impl null;
-
- private:
-
- void check_type( const Value_type vtype ) const;
-
- typedef boost::variant< String_type,
- boost::recursive_wrapper< Object >, boost::recursive_wrapper< Array >,
- bool, int64_t, double > Variant;
-
- Value_type type_;
- Variant v_;
- bool is_uint64_;
- };
-
- // vector objects
-
- template< class Config >
- struct Pair_impl
- {
- typedef typename Config::String_type String_type;
- typedef typename Config::Value_type Value_type;
-
- Pair_impl( const String_type& name, const Value_type& value );
-
- bool operator==( const Pair_impl& lhs ) const;
-
- String_type name_;
- Value_type value_;
- };
-
- template< class String >
- struct Config_vector
- {
- typedef String String_type;
- typedef Value_impl< Config_vector > Value_type;
- typedef Pair_impl < Config_vector > Pair_type;
- typedef std::vector< Value_type > Array_type;
- typedef std::vector< Pair_type > Object_type;
-
- static Value_type& add( Object_type& obj, const String_type& name, const Value_type& value )
- {
- obj.push_back( Pair_type( name , value ) );
-
- return obj.back().value_;
- }
-
- static String_type get_name( const Pair_type& pair )
- {
- return pair.name_;
- }
-
- static Value_type get_value( const Pair_type& pair )
- {
- return pair.value_;
- }
- };
-
- // typedefs for ASCII
-
- typedef Config_vector< std::string > Config;
-
- typedef Config::Value_type Value;
- typedef Config::Pair_type Pair;
- typedef Config::Object_type Object;
- typedef Config::Array_type Array;
-
- // typedefs for Unicode
-
-#ifndef BOOST_NO_STD_WSTRING
-
- typedef Config_vector< std::wstring > wConfig;
-
- typedef wConfig::Value_type wValue;
- typedef wConfig::Pair_type wPair;
- typedef wConfig::Object_type wObject;
- typedef wConfig::Array_type wArray;
-#endif
-
- // map objects
-
- template< class String >
- struct Config_map
- {
- typedef String String_type;
- typedef Value_impl< Config_map > Value_type;
- typedef std::vector< Value_type > Array_type;
- typedef std::map< String_type, Value_type > Object_type;
- typedef typename Object_type::value_type Pair_type;
-
- static Value_type& add( Object_type& obj, const String_type& name, const Value_type& value )
- {
- return obj[ name ] = value;
- }
-
- static String_type get_name( const Pair_type& pair )
- {
- return pair.first;
- }
-
- static Value_type get_value( const Pair_type& pair )
- {
- return pair.second;
- }
- };
-
- // typedefs for ASCII
-
- typedef Config_map< std::string > mConfig;
-
- typedef mConfig::Value_type mValue;
- typedef mConfig::Object_type mObject;
- typedef mConfig::Array_type mArray;
-
- // typedefs for Unicode
-
-#ifndef BOOST_NO_STD_WSTRING
-
- typedef Config_map< std::wstring > wmConfig;
-
- typedef wmConfig::Value_type wmValue;
- typedef wmConfig::Object_type wmObject;
- typedef wmConfig::Array_type wmArray;
-
-#endif
-
- ///////////////////////////////////////////////////////////////////////////////////////////////
- //
- // implementation
-
- template< class Config >
- const Value_impl< Config > Value_impl< Config >::null;
-
- template< class Config >
- Value_impl< Config >::Value_impl()
- : type_( null_type )
- , is_uint64_( false )
- {
- }
-
- template< class Config >
- Value_impl< Config >::Value_impl( const Const_str_ptr value )
- : type_( str_type )
- , v_( String_type( value ) )
- , is_uint64_( false )
- {
- }
-
- template< class Config >
- Value_impl< Config >::Value_impl( const String_type& value )
- : type_( str_type )
- , v_( value )
- , is_uint64_( false )
- {
- }
-
- template< class Config >
- Value_impl< Config >::Value_impl( const Object& value )
- : type_( obj_type )
- , v_( value )
- , is_uint64_( false )
- {
- }
-
- template< class Config >
- Value_impl< Config >::Value_impl( const Array& value )
- : type_( array_type )
- , v_( value )
- , is_uint64_( false )
- {
- }
-
- template< class Config >
- Value_impl< Config >::Value_impl( bool value )
- : type_( bool_type )
- , v_( value )
- , is_uint64_( false )
- {
- }
-
- template< class Config >
- Value_impl< Config >::Value_impl( int value )
- : type_( int_type )
- , v_( static_cast< int64_t >( value ) )
- , is_uint64_( false )
- {
- }
-
- template< class Config >
- Value_impl< Config >::Value_impl( int64_t value )
- : type_( int_type )
- , v_( value )
- , is_uint64_( false )
- {
- }
-
- template< class Config >
- Value_impl< Config >::Value_impl( uint64_t value )
- : type_( int_type )
- , v_( static_cast< int64_t >( value ) )
- , is_uint64_( true )
- {
- }
-
- template< class Config >
- Value_impl< Config >::Value_impl( double value )
- : type_( real_type )
- , v_( value )
- , is_uint64_( false )
- {
- }
-
- template< class Config >
- Value_impl< Config >::Value_impl( const Value_impl< Config >& other )
- : type_( other.type() )
- , v_( other.v_ )
- , is_uint64_( other.is_uint64_ )
- {
- }
-
- template< class Config >
- Value_impl< Config >& Value_impl< Config >::operator=( const Value_impl& lhs )
- {
- Value_impl tmp( lhs );
-
- std::swap( type_, tmp.type_ );
- std::swap( v_, tmp.v_ );
- std::swap( is_uint64_, tmp.is_uint64_ );
-
- return *this;
- }
-
- template< class Config >
- bool Value_impl< Config >::operator==( const Value_impl& lhs ) const
- {
- if( this == &lhs ) return true;
-
- if( type() != lhs.type() ) return false;
-
- return v_ == lhs.v_;
- }
-
- template< class Config >
- Value_type Value_impl< Config >::type() const
- {
- return type_;
- }
-
- template< class Config >
- bool Value_impl< Config >::is_uint64() const
- {
- return is_uint64_;
- }
-
- template< class Config >
- bool Value_impl< Config >::is_null() const
- {
- return type() == null_type;
- }
-
- template< class Config >
- void Value_impl< Config >::check_type( const Value_type vtype ) const
- {
- if( type() != vtype )
- {
- std::ostringstream os;
-
- ///// Bitcoin: Tell the types by name instead of by number
- os << "value is type " << Value_type_name[type()] << ", expected " << Value_type_name[vtype];
-
- throw std::runtime_error( os.str() );
- }
- }
-
- template< class Config >
- const typename Config::String_type& Value_impl< Config >::get_str() const
- {
- check_type( str_type );
-
- return *boost::get< String_type >( &v_ );
- }
-
- template< class Config >
- const typename Value_impl< Config >::Object& Value_impl< Config >::get_obj() const
- {
- check_type( obj_type );
-
- return *boost::get< Object >( &v_ );
- }
-
- template< class Config >
- const typename Value_impl< Config >::Array& Value_impl< Config >::get_array() const
- {
- check_type( array_type );
-
- return *boost::get< Array >( &v_ );
- }
-
- template< class Config >
- bool Value_impl< Config >::get_bool() const
- {
- check_type( bool_type );
-
- return boost::get< bool >( v_ );
- }
-
- template< class Config >
- int Value_impl< Config >::get_int() const
- {
- check_type( int_type );
-
- return static_cast< int >( get_int64() );
- }
-
- template< class Config >
- int64_t Value_impl< Config >::get_int64() const
- {
- check_type( int_type );
-
- return boost::get< int64_t >( v_ );
- }
-
- template< class Config >
- uint64_t Value_impl< Config >::get_uint64() const
- {
- check_type( int_type );
-
- return static_cast< uint64_t >( get_int64() );
- }
-
- template< class Config >
- double Value_impl< Config >::get_real() const
- {
- if( type() == int_type )
- {
- return is_uint64() ? static_cast< double >( get_uint64() )
- : static_cast< double >( get_int64() );
- }
-
- check_type( real_type );
-
- return boost::get< double >( v_ );
- }
-
- template< class Config >
- typename Value_impl< Config >::Object& Value_impl< Config >::get_obj()
- {
- check_type( obj_type );
-
- return *boost::get< Object >( &v_ );
- }
-
- template< class Config >
- typename Value_impl< Config >::Array& Value_impl< Config >::get_array()
- {
- check_type( array_type );
-
- return *boost::get< Array >( &v_ );
- }
-
- template< class Config >
- Pair_impl< Config >::Pair_impl( const String_type& name, const Value_type& value )
- : name_( name )
- , value_( value )
- {
- }
-
- template< class Config >
- bool Pair_impl< Config >::operator==( const Pair_impl< Config >& lhs ) const
- {
- if( this == &lhs ) return true;
-
- return ( name_ == lhs.name_ ) && ( value_ == lhs.value_ );
- }
-
- // converts a C string, ie. 8 bit char array, to a string object
- //
- template < class String_type >
- String_type to_str( const char* c_str )
- {
- String_type result;
-
- for( const char* p = c_str; *p != 0; ++p )
- {
- result += *p;
- }
-
- return result;
- }
-
- //
-
- namespace internal_
- {
- template< typename T >
- struct Type_to_type
- {
- };
-
- template< class Value >
- int get_value( const Value& value, Type_to_type< int > )
- {
- return value.get_int();
- }
-
- template< class Value >
- int64_t get_value( const Value& value, Type_to_type< int64_t > )
- {
- return value.get_int64();
- }
-
- template< class Value >
- uint64_t get_value( const Value& value, Type_to_type< uint64_t > )
- {
- return value.get_uint64();
- }
-
- template< class Value >
- double get_value( const Value& value, Type_to_type< double > )
- {
- return value.get_real();
- }
-
- template< class Value >
- typename Value::String_type get_value( const Value& value, Type_to_type< typename Value::String_type > )
- {
- return value.get_str();
- }
-
- template< class Value >
- typename Value::Array get_value( const Value& value, Type_to_type< typename Value::Array > )
- {
- return value.get_array();
- }
-
- template< class Value >
- typename Value::Object get_value( const Value& value, Type_to_type< typename Value::Object > )
- {
- return value.get_obj();
- }
-
- template< class Value >
- bool get_value( const Value& value, Type_to_type< bool > )
- {
- return value.get_bool();
- }
- }
-
- template< class Config >
- template< typename T >
- T Value_impl< Config >::get_value() const
- {
- return internal_::get_value( *this, internal_::Type_to_type< T >() );
- }
-}
-
-#endif
diff --git a/src/json/json_spirit_writer.cpp b/src/json/json_spirit_writer.cpp
deleted file mode 100644
index d24a632cf3..0000000000
--- a/src/json/json_spirit_writer.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#include "json_spirit_writer.h"
-#include "json_spirit_writer_template.h"
-
-void json_spirit::write( const Value& value, std::ostream& os )
-{
- write_stream( value, os, false );
-}
-
-void json_spirit::write_formatted( const Value& value, std::ostream& os )
-{
- write_stream( value, os, true );
-}
-
-std::string json_spirit::write( const Value& value )
-{
- return write_string( value, false );
-}
-
-std::string json_spirit::write_formatted( const Value& value )
-{
- return write_string( value, true );
-}
-
-#ifndef BOOST_NO_STD_WSTRING
-
-void json_spirit::write( const wValue& value, std::wostream& os )
-{
- write_stream( value, os, false );
-}
-
-void json_spirit::write_formatted( const wValue& value, std::wostream& os )
-{
- write_stream( value, os, true );
-}
-
-std::wstring json_spirit::write( const wValue& value )
-{
- return write_string( value, false );
-}
-
-std::wstring json_spirit::write_formatted( const wValue& value )
-{
- return write_string( value, true );
-}
-
-#endif
-
-void json_spirit::write( const mValue& value, std::ostream& os )
-{
- write_stream( value, os, false );
-}
-
-void json_spirit::write_formatted( const mValue& value, std::ostream& os )
-{
- write_stream( value, os, true );
-}
-
-std::string json_spirit::write( const mValue& value )
-{
- return write_string( value, false );
-}
-
-std::string json_spirit::write_formatted( const mValue& value )
-{
- return write_string( value, true );
-}
-
-#ifndef BOOST_NO_STD_WSTRING
-
-void json_spirit::write( const wmValue& value, std::wostream& os )
-{
- write_stream( value, os, false );
-}
-
-void json_spirit::write_formatted( const wmValue& value, std::wostream& os )
-{
- write_stream( value, os, true );
-}
-
-std::wstring json_spirit::write( const wmValue& value )
-{
- return write_string( value, false );
-}
-
-std::wstring json_spirit::write_formatted( const wmValue& value )
-{
- return write_string( value, true );
-}
-
-#endif
diff --git a/src/json/json_spirit_writer.h b/src/json/json_spirit_writer.h
deleted file mode 100644
index 52e14068e7..0000000000
--- a/src/json/json_spirit_writer.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef JSON_SPIRIT_WRITER
-#define JSON_SPIRIT_WRITER
-
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include "json_spirit_value.h"
-#include <iostream>
-
-namespace json_spirit
-{
- // functions to convert JSON Values to text,
- // the "formatted" versions add whitespace to format the output nicely
-
- void write ( const Value& value, std::ostream& os );
- void write_formatted( const Value& value, std::ostream& os );
- std::string write ( const Value& value );
- std::string write_formatted( const Value& value );
-
-#ifndef BOOST_NO_STD_WSTRING
-
- void write ( const wValue& value, std::wostream& os );
- void write_formatted( const wValue& value, std::wostream& os );
- std::wstring write ( const wValue& value );
- std::wstring write_formatted( const wValue& value );
-
-#endif
-
- void write ( const mValue& value, std::ostream& os );
- void write_formatted( const mValue& value, std::ostream& os );
- std::string write ( const mValue& value );
- std::string write_formatted( const mValue& value );
-
-#ifndef BOOST_NO_STD_WSTRING
-
- void write ( const wmValue& value, std::wostream& os );
- void write_formatted( const wmValue& value, std::wostream& os );
- std::wstring write ( const wmValue& value );
- std::wstring write_formatted( const wmValue& value );
-
-#endif
-}
-
-#endif
diff --git a/src/json/json_spirit_writer_template.h b/src/json/json_spirit_writer_template.h
deleted file mode 100644
index 6b4978a1ff..0000000000
--- a/src/json/json_spirit_writer_template.h
+++ /dev/null
@@ -1,249 +0,0 @@
-#ifndef JSON_SPIRIT_WRITER_TEMPLATE
-#define JSON_SPIRIT_WRITER_TEMPLATE
-
-// Copyright John W. Wilkinson 2007 - 2009.
-// Distributed under the MIT License, see accompanying file LICENSE.txt
-
-// json spirit version 4.03
-
-#include "json_spirit_value.h"
-
-#include <cassert>
-#include <sstream>
-#include <iomanip>
-
-namespace json_spirit
-{
- inline char to_hex_char( unsigned int c )
- {
- assert( c <= 0xF );
-
- const char ch = static_cast< char >( c );
-
- if( ch < 10 ) return '0' + ch;
-
- return 'A' - 10 + ch;
- }
-
- template< class String_type >
- String_type non_printable_to_string( unsigned int c )
- {
- // Silence the warning: typedef ‘Char_type’ locally defined but not used [-Wunused-local-typedefs]
- // typedef typename String_type::value_type Char_type;
-
- String_type result( 6, '\\' );
-
- result[1] = 'u';
-
- result[ 5 ] = to_hex_char( c & 0x000F ); c >>= 4;
- result[ 4 ] = to_hex_char( c & 0x000F ); c >>= 4;
- result[ 3 ] = to_hex_char( c & 0x000F ); c >>= 4;
- result[ 2 ] = to_hex_char( c & 0x000F );
-
- return result;
- }
-
- template< typename Char_type, class String_type >
- bool add_esc_char( Char_type c, String_type& s )
- {
- switch( c )
- {
- case '"': s += to_str< String_type >( "\\\"" ); return true;
- case '\\': s += to_str< String_type >( "\\\\" ); return true;
- case '\b': s += to_str< String_type >( "\\b" ); return true;
- case '\f': s += to_str< String_type >( "\\f" ); return true;
- case '\n': s += to_str< String_type >( "\\n" ); return true;
- case '\r': s += to_str< String_type >( "\\r" ); return true;
- case '\t': s += to_str< String_type >( "\\t" ); return true;
- }
-
- return false;
- }
-
- template< class String_type >
- String_type add_esc_chars( const String_type& s )
- {
- typedef typename String_type::const_iterator Iter_type;
- typedef typename String_type::value_type Char_type;
-
- String_type result;
-
- const Iter_type end( s.end() );
-
- for( Iter_type i = s.begin(); i != end; ++i )
- {
- const Char_type c( *i );
-
- if( add_esc_char( c, result ) ) continue;
-
- const wint_t unsigned_c( ( c >= 0 ) ? c : 256 + c );
-
- if( iswprint( unsigned_c ) )
- {
- result += c;
- }
- else
- {
- result += non_printable_to_string< String_type >( unsigned_c );
- }
- }
-
- return result;
- }
-
- // this class generates the JSON text,
- // it keeps track of the indentation level etc.
- //
- template< class Value_type, class Ostream_type >
- class Generator
- {
- typedef typename Value_type::Config_type Config_type;
- typedef typename Config_type::String_type String_type;
- typedef typename Config_type::Object_type Object_type;
- typedef typename Config_type::Array_type Array_type;
- typedef typename String_type::value_type Char_type;
- typedef typename Object_type::value_type Obj_member_type;
-
- public:
-
- Generator( const Value_type& value, Ostream_type& os, bool pretty )
- : os_( os )
- , indentation_level_( 0 )
- , pretty_( pretty )
- {
- output( value );
- }
-
- private:
-
- void output( const Value_type& value )
- {
- switch( value.type() )
- {
- case obj_type: output( value.get_obj() ); break;
- case array_type: output( value.get_array() ); break;
- case str_type: output( value.get_str() ); break;
- case bool_type: output( value.get_bool() ); break;
- case int_type: output_int( value ); break;
-
- /// Bitcoin: Added std::fixed and changed precision from 16 to 8
- case real_type: os_ << std::showpoint << std::fixed << std::setprecision(8)
- << value.get_real(); break;
-
- case null_type: os_ << "null"; break;
- default: assert( false );
- }
- }
-
- void output( const Object_type& obj )
- {
- output_array_or_obj( obj, '{', '}' );
- }
-
- void output( const Array_type& arr )
- {
- output_array_or_obj( arr, '[', ']' );
- }
-
- void output( const Obj_member_type& member )
- {
- output( Config_type::get_name( member ) ); space();
- os_ << ':'; space();
- output( Config_type::get_value( member ) );
- }
-
- void output_int( const Value_type& value )
- {
- if( value.is_uint64() )
- {
- os_ << value.get_uint64();
- }
- else
- {
- os_ << value.get_int64();
- }
- }
-
- void output( const String_type& s )
- {
- os_ << '"' << add_esc_chars( s ) << '"';
- }
-
- void output( bool b )
- {
- os_ << to_str< String_type >( b ? "true" : "false" );
- }
-
- template< class T >
- void output_array_or_obj( const T& t, Char_type start_char, Char_type end_char )
- {
- os_ << start_char; new_line();
-
- ++indentation_level_;
-
- for( typename T::const_iterator i = t.begin(); i != t.end(); ++i )
- {
- indent(); output( *i );
-
- typename T::const_iterator next = i;
-
- if( ++next != t.end())
- {
- os_ << ',';
- }
-
- new_line();
- }
-
- --indentation_level_;
-
- indent(); os_ << end_char;
- }
-
- void indent()
- {
- if( !pretty_ ) return;
-
- for( int i = 0; i < indentation_level_; ++i )
- {
- os_ << " ";
- }
- }
-
- void space()
- {
- if( pretty_ ) os_ << ' ';
- }
-
- void new_line()
- {
- if( pretty_ ) os_ << '\n';
- }
-
- Generator& operator=( const Generator& ); // to prevent "assignment operator could not be generated" warning
-
- Ostream_type& os_;
- int indentation_level_;
- bool pretty_;
- };
-
- template< class Value_type, class Ostream_type >
- void write_stream( const Value_type& value, Ostream_type& os, bool pretty )
- {
- Generator< Value_type, Ostream_type >( value, os, pretty );
- }
-
- template< class Value_type >
- typename Value_type::String_type write_string( const Value_type& value, bool pretty )
- {
- typedef typename Value_type::String_type::value_type Char_type;
-
- std::basic_ostringstream< Char_type > os;
-
- write_stream( value, os, pretty );
-
- return os.str();
- }
-}
-
-#endif
diff --git a/src/key.cpp b/src/key.cpp
index e146e47d0d..b772dff333 100644
--- a/src/key.cpp
+++ b/src/key.cpp
@@ -14,21 +14,7 @@
#include <secp256k1.h>
#include "ecwrapper.h"
-//! anonymous namespace
-namespace {
-
-class CSecp256k1Init {
-public:
- CSecp256k1Init() {
- secp256k1_start(SECP256K1_START_SIGN);
- }
- ~CSecp256k1Init() {
- secp256k1_stop();
- }
-};
-static CSecp256k1Init instance_of_csecp256k1;
-
-} // anon namespace
+static secp256k1_context_t* secp256k1_context = NULL;
bool CKey::Check(const unsigned char *vch) {
return eccrypto::Check(vch);
@@ -44,7 +30,7 @@ void CKey::MakeNewKey(bool fCompressedIn) {
}
bool CKey::SetPrivKey(const CPrivKey &privkey, bool fCompressedIn) {
- if (!secp256k1_ec_privkey_import((unsigned char*)begin(), &privkey[0], privkey.size()))
+ if (!secp256k1_ec_privkey_import(secp256k1_context, (unsigned char*)begin(), &privkey[0], privkey.size()))
return false;
fCompressed = fCompressedIn;
fValid = true;
@@ -57,7 +43,7 @@ CPrivKey CKey::GetPrivKey() const {
int privkeylen, ret;
privkey.resize(279);
privkeylen = 279;
- ret = secp256k1_ec_privkey_export(begin(), (unsigned char*)&privkey[0], &privkeylen, fCompressed);
+ ret = secp256k1_ec_privkey_export(secp256k1_context, begin(), (unsigned char*)&privkey[0], &privkeylen, fCompressed);
assert(ret);
privkey.resize(privkeylen);
return privkey;
@@ -67,7 +53,7 @@ CPubKey CKey::GetPubKey() const {
assert(fValid);
CPubKey result;
int clen = 65;
- int ret = secp256k1_ec_pubkey_create((unsigned char*)result.begin(), &clen, begin(), fCompressed);
+ int ret = secp256k1_ec_pubkey_create(secp256k1_context, (unsigned char*)result.begin(), &clen, begin(), fCompressed);
assert((int)result.size() == clen);
assert(ret);
assert(result.IsValid());
@@ -81,7 +67,7 @@ bool CKey::Sign(const uint256 &hash, std::vector<unsigned char>& vchSig, uint32_
int nSigLen = 72;
unsigned char extra_entropy[32] = {0};
WriteLE32(extra_entropy, test_case);
- int ret = secp256k1_ecdsa_sign(hash.begin(), (unsigned char*)&vchSig[0], &nSigLen, begin(), secp256k1_nonce_function_rfc6979, test_case ? extra_entropy : NULL);
+ int ret = secp256k1_ecdsa_sign(secp256k1_context, hash.begin(), (unsigned char*)&vchSig[0], &nSigLen, begin(), secp256k1_nonce_function_rfc6979, test_case ? extra_entropy : NULL);
assert(ret);
vchSig.resize(nSigLen);
return true;
@@ -106,7 +92,7 @@ bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig)
return false;
vchSig.resize(65);
int rec = -1;
- int ret = secp256k1_ecdsa_sign_compact(hash.begin(), &vchSig[1], begin(), secp256k1_nonce_function_rfc6979, NULL, &rec);
+ int ret = secp256k1_ecdsa_sign_compact(secp256k1_context, hash.begin(), &vchSig[1], begin(), secp256k1_nonce_function_rfc6979, NULL, &rec);
assert(ret);
assert(rec != -1);
vchSig[0] = 27 + rec + (fCompressed ? 4 : 0);
@@ -114,7 +100,7 @@ bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig)
}
bool CKey::Load(CPrivKey &privkey, CPubKey &vchPubKey, bool fSkipCheck=false) {
- if (!secp256k1_ec_privkey_import((unsigned char*)begin(), &privkey[0], privkey.size()))
+ if (!secp256k1_ec_privkey_import(secp256k1_context, (unsigned char*)begin(), &privkey[0], privkey.size()))
return false;
fCompressed = vchPubKey.IsCompressed();
fValid = true;
@@ -125,7 +111,7 @@ bool CKey::Load(CPrivKey &privkey, CPubKey &vchPubKey, bool fSkipCheck=false) {
return VerifyPubKey(vchPubKey);
}
-bool CKey::Derive(CKey& keyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const {
+bool CKey::Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode& cc) const {
assert(IsValid());
assert(IsCompressed());
unsigned char out[64];
@@ -138,9 +124,9 @@ bool CKey::Derive(CKey& keyChild, unsigned char ccChild[32], unsigned int nChild
assert(begin() + 32 == end());
BIP32Hash(cc, nChild, 0, begin(), out);
}
- memcpy(ccChild, out+32, 32);
+ memcpy(ccChild.begin(), out+32, 32);
memcpy((unsigned char*)keyChild.begin(), begin(), 32);
- bool ret = secp256k1_ec_privkey_tweak_add((unsigned char*)keyChild.begin(), out);
+ bool ret = secp256k1_ec_privkey_tweak_add(secp256k1_context, (unsigned char*)keyChild.begin(), out);
UnlockObject(out);
keyChild.fCompressed = true;
keyChild.fValid = ret;
@@ -152,7 +138,7 @@ bool CExtKey::Derive(CExtKey &out, unsigned int nChild) const {
CKeyID id = key.GetPubKey().GetID();
memcpy(&out.vchFingerprint[0], &id, 4);
out.nChild = nChild;
- return key.Derive(out.key, out.vchChainCode, nChild, vchChainCode);
+ return key.Derive(out.key, out.chaincode, nChild, chaincode);
}
void CExtKey::SetMaster(const unsigned char *seed, unsigned int nSeedLen) {
@@ -161,7 +147,7 @@ void CExtKey::SetMaster(const unsigned char *seed, unsigned int nSeedLen) {
LockObject(out);
CHMAC_SHA512(hashkey, sizeof(hashkey)).Write(seed, nSeedLen).Finalize(out);
key.Set(&out[0], &out[32], true);
- memcpy(vchChainCode, &out[32], 32);
+ memcpy(chaincode.begin(), &out[32], 32);
UnlockObject(out);
nDepth = 0;
nChild = 0;
@@ -174,7 +160,7 @@ CExtPubKey CExtKey::Neuter() const {
memcpy(&ret.vchFingerprint[0], &vchFingerprint[0], 4);
ret.nChild = nChild;
ret.pubkey = key.GetPubKey();
- memcpy(&ret.vchChainCode[0], &vchChainCode[0], 32);
+ ret.chaincode = chaincode;
return ret;
}
@@ -183,7 +169,7 @@ void CExtKey::Encode(unsigned char code[74]) const {
memcpy(code+1, vchFingerprint, 4);
code[5] = (nChild >> 24) & 0xFF; code[6] = (nChild >> 16) & 0xFF;
code[7] = (nChild >> 8) & 0xFF; code[8] = (nChild >> 0) & 0xFF;
- memcpy(code+9, vchChainCode, 32);
+ memcpy(code+9, chaincode.begin(), 32);
code[41] = 0;
assert(key.size() == 32);
memcpy(code+42, key.begin(), 32);
@@ -193,7 +179,7 @@ void CExtKey::Decode(const unsigned char code[74]) {
nDepth = code[0];
memcpy(vchFingerprint, code+1, 4);
nChild = (code[5] << 24) | (code[6] << 16) | (code[7] << 8) | code[8];
- memcpy(vchChainCode, code+9, 32);
+ memcpy(chaincode.begin(), code+9, 32);
key.Set(code+42, code+74, true);
}
@@ -206,3 +192,32 @@ bool ECC_InitSanityCheck() {
CPubKey pubkey = key.GetPubKey();
return key.VerifyPubKey(pubkey);
}
+
+
+void ECC_Start() {
+ assert(secp256k1_context == NULL);
+
+ secp256k1_context_t *ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);
+ assert(ctx != NULL);
+
+ {
+ // Pass in a random blinding seed to the secp256k1 context.
+ unsigned char seed[32];
+ LockObject(seed);
+ GetRandBytes(seed, 32);
+ bool ret = secp256k1_context_randomize(ctx, seed);
+ assert(ret);
+ UnlockObject(seed);
+ }
+
+ secp256k1_context = ctx;
+}
+
+void ECC_Stop() {
+ secp256k1_context_t *ctx = secp256k1_context;
+ secp256k1_context = NULL;
+
+ if (ctx) {
+ secp256k1_context_destroy(ctx);
+ }
+}
diff --git a/src/key.h b/src/key.h
index 104a8f5c72..021eac2a8d 100644
--- a/src/key.h
+++ b/src/key.h
@@ -6,6 +6,7 @@
#ifndef BITCOIN_KEY_H
#define BITCOIN_KEY_H
+#include "pubkey.h"
#include "serialize.h"
#include "support/allocators/secure.h"
#include "uint256.h"
@@ -13,9 +14,6 @@
#include <stdexcept>
#include <vector>
-class CPubKey;
-
-struct CExtPubKey;
/**
* secp256k1:
@@ -138,7 +136,7 @@ public:
bool SignCompact(const uint256& hash, std::vector<unsigned char>& vchSig) const;
//! Derive BIP32 child key.
- bool Derive(CKey& keyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const;
+ bool Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode& cc) const;
/**
* Verify thoroughly whether a private key and a public key match.
@@ -157,13 +155,13 @@ struct CExtKey {
unsigned char nDepth;
unsigned char vchFingerprint[4];
unsigned int nChild;
- unsigned char vchChainCode[32];
+ ChainCode chaincode;
CKey key;
friend bool operator==(const CExtKey& a, const CExtKey& b)
{
return a.nDepth == b.nDepth && memcmp(&a.vchFingerprint[0], &b.vchFingerprint[0], 4) == 0 && a.nChild == b.nChild &&
- memcmp(&a.vchChainCode[0], &b.vchChainCode[0], 32) == 0 && a.key == b.key;
+ a.chaincode == b.chaincode && a.key == b.key;
}
void Encode(unsigned char code[74]) const;
@@ -173,7 +171,13 @@ struct CExtKey {
void SetMaster(const unsigned char* seed, unsigned int nSeedLen);
};
-/** Check that required EC support is available at runtime */
+/** Initialize the elliptic curve support. May not be called twice without calling ECC_Stop first. */
+void ECC_Start(void);
+
+/** Deinitialize the elliptic curve support. No-op if ECC_Start wasn't called first. */
+void ECC_Stop(void);
+
+/** Check that required EC support is available at runtime. */
bool ECC_InitSanityCheck(void);
#endif // BITCOIN_KEY_H
diff --git a/src/main.cpp b/src/main.cpp
index 8fb6766301..6c4cfe75aa 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -11,6 +11,7 @@
#include "chainparams.h"
#include "checkpoints.h"
#include "checkqueue.h"
+#include "consensus/validation.h"
#include "init.h"
#include "merkleblock.h"
#include "net.h"
@@ -28,6 +29,7 @@
#include <boost/algorithm/string/replace.hpp>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
+#include <boost/math/distributions/poisson.hpp>
#include <boost/thread.hpp>
using namespace std;
@@ -52,9 +54,14 @@ int nScriptCheckThreads = 0;
bool fImporting = false;
bool fReindex = false;
bool fTxIndex = false;
+bool fHavePruned = false;
+bool fPruneMode = false;
bool fIsBareMultisigStd = true;
bool fCheckBlockIndex = false;
-unsigned int nCoinCacheSize = 5000;
+bool fCheckpointsEnabled = true;
+size_t nCoinCacheUsage = 5000 * 300;
+uint64_t nPruneTarget = 0;
+bool fAlerts = DEFAULT_ALERTS;
/** Fees smaller than this (in satoshi) are considered zero fee (for relaying and mining) */
CFeeRate minRelayTxFee = CFeeRate(1000);
@@ -71,10 +78,9 @@ void EraseOrphansFor(NodeId peer);
/**
* Returns true if there are nRequired or more blocks of minVersion or above
- * in the last Params().ToCheckBlockUpgradeMajority() blocks, starting at pstart
- * and going backwards.
+ * in the last Consensus::Params::nMajorityWindow blocks, starting at pstart and going backwards.
*/
-static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned int nRequired);
+static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned nRequired, const Consensus::Params& consensusParams);
static void CheckBlockIndex();
/** Constant stuff for coinbase transactions we create: */
@@ -110,17 +116,25 @@ namespace {
/**
* The set of all CBlockIndex entries with BLOCK_VALID_TRANSACTIONS (for itself and all ancestors) and
- * as good as our current tip or better. Entries may be failed, though.
+ * as good as our current tip or better. Entries may be failed, though, and pruning nodes may be
+ * missing the data for the block.
*/
set<CBlockIndex*, CBlockIndexWorkComparator> setBlockIndexCandidates;
/** Number of nodes with fSyncStarted. */
int nSyncStarted = 0;
- /** All pairs A->B, where A (or one if its ancestors) misses transactions, but B has transactions. */
+ /** All pairs A->B, where A (or one if its ancestors) misses transactions, but B has transactions.
+ * Pruned nodes may have entries where B is missing data.
+ */
multimap<CBlockIndex*, CBlockIndex*> mapBlocksUnlinked;
CCriticalSection cs_LastBlockFile;
std::vector<CBlockFileInfo> vinfoBlockFile;
int nLastBlockFile = 0;
+ /** Global flag to indicate we should check to see if there are
+ * block/undo files that should be deleted. Set on startup
+ * or if we allocate more file space when we're in prune mode
+ */
+ bool fCheckForPruning = false;
/**
* Every received block is assigned a unique and increasing identifier, so we
@@ -131,8 +145,9 @@ namespace {
uint32_t nBlockSequenceId = 1;
/**
- * Sources of received blocks, to be able to send them reject messages or ban
- * them, if processing happens afterwards. Protected by cs_main.
+ * Sources of received blocks, saved to be able to send them reject
+ * messages or ban them when processing happens afterwards. Protected by
+ * cs_main.
*/
map<uint256, NodeId> mapBlockSource;
@@ -141,8 +156,8 @@ namespace {
uint256 hash;
CBlockIndex *pindex; //! Optional.
int64_t nTime; //! Time of "getdata" request in microseconds.
- int nValidatedQueuedBefore; //! Number of blocks queued with validated headers (globally) at the time this one is requested.
bool fValidatedHeaders; //! Whether this block has validated headers at the time of request.
+ int64_t nTimeDisconnect; //! The timeout for this block request (for disconnecting a slow peer)
};
map<uint256, pair<NodeId, list<QueuedBlock>::iterator> > mapBlocksInFlight;
@@ -203,6 +218,7 @@ struct CNodeState {
int64_t nStallingSince;
list<QueuedBlock> vBlocksInFlight;
int nBlocksInFlight;
+ int nBlocksInFlightValidHeaders;
//! Whether we consider this a preferred download peer.
bool fPreferredDownload;
@@ -216,6 +232,7 @@ struct CNodeState {
fSyncStarted = false;
nStallingSince = 0;
nBlocksInFlight = 0;
+ nBlocksInFlightValidHeaders = 0;
fPreferredDownload = false;
}
};
@@ -247,6 +264,12 @@ void UpdatePreferredDownload(CNode* node, CNodeState* state)
nPreferredDownload += state->fPreferredDownload;
}
+// Returns time at which to timeout block request (nTime in microseconds)
+int64_t GetBlockTimeout(int64_t nTime, int nValidatedQueuedBefore, const Consensus::Params &consensusParams)
+{
+ return nTime + 500000 * consensusParams.nPowTargetSpacing * (4 + nValidatedQueuedBefore);
+}
+
void InitializeNode(NodeId nodeid, const CNode *pnode) {
LOCK(cs_main);
CNodeState &state = mapNodeState.insert(std::make_pair(nodeid, CNodeState())).first->second;
@@ -274,30 +297,36 @@ void FinalizeNode(NodeId nodeid) {
}
// Requires cs_main.
-void MarkBlockAsReceived(const uint256& hash) {
+// Returns a bool indicating whether we requested this block.
+bool MarkBlockAsReceived(const uint256& hash) {
map<uint256, pair<NodeId, list<QueuedBlock>::iterator> >::iterator itInFlight = mapBlocksInFlight.find(hash);
if (itInFlight != mapBlocksInFlight.end()) {
CNodeState *state = State(itInFlight->second.first);
nQueuedValidatedHeaders -= itInFlight->second.second->fValidatedHeaders;
+ state->nBlocksInFlightValidHeaders -= itInFlight->second.second->fValidatedHeaders;
state->vBlocksInFlight.erase(itInFlight->second.second);
state->nBlocksInFlight--;
state->nStallingSince = 0;
mapBlocksInFlight.erase(itInFlight);
+ return true;
}
+ return false;
}
// Requires cs_main.
-void MarkBlockAsInFlight(NodeId nodeid, const uint256& hash, CBlockIndex *pindex = NULL) {
+void MarkBlockAsInFlight(NodeId nodeid, const uint256& hash, const Consensus::Params& consensusParams, CBlockIndex *pindex = NULL) {
CNodeState *state = State(nodeid);
assert(state != NULL);
// Make sure it's not listed somewhere already.
MarkBlockAsReceived(hash);
- QueuedBlock newentry = {hash, pindex, GetTimeMicros(), nQueuedValidatedHeaders, pindex != NULL};
+ int64_t nNow = GetTimeMicros();
+ QueuedBlock newentry = {hash, pindex, nNow, pindex != NULL, GetBlockTimeout(nNow, nQueuedValidatedHeaders, consensusParams)};
nQueuedValidatedHeaders += newentry.fValidatedHeaders;
list<QueuedBlock>::iterator it = state->vBlocksInFlight.insert(state->vBlocksInFlight.end(), newentry);
state->nBlocksInFlight++;
+ state->nBlocksInFlightValidHeaders += newentry.fValidatedHeaders;
mapBlocksInFlight[hash] = std::make_pair(nodeid, it);
}
@@ -378,7 +407,7 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<CBl
}
// If the peer reorganized, our previous pindexLastCommonBlock may not be an ancestor
- // of their current tip anymore. Go back enough to fix that.
+ // of its current tip anymore. Go back enough to fix that.
state->pindexLastCommonBlock = LastCommonAncestor(state->pindexLastCommonBlock, state->pindexBestKnownBlock);
if (state->pindexLastCommonBlock == state->pindexBestKnownBlock)
return;
@@ -405,13 +434,14 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<CBl
// Iterate over those blocks in vToFetch (in forward direction), adding the ones that
// are not yet downloaded and not in flight to vBlocks. In the mean time, update
- // pindexLastCommonBlock as long as all ancestors are already downloaded.
+ // pindexLastCommonBlock as long as all ancestors are already downloaded, or if it's
+ // already part of our chain (and therefore don't need it even if pruned).
BOOST_FOREACH(CBlockIndex* pindex, vToFetch) {
if (!pindex->IsValid(BLOCK_VALID_TREE)) {
// We consider the chain that this peer is on invalid.
return;
}
- if (pindex->nStatus & BLOCK_HAVE_DATA) {
+ if (pindex->nStatus & BLOCK_HAVE_DATA || chainActive.Contains(pindex)) {
if (pindex->nChainTx)
state->pindexLastCommonBlock = pindex;
} else if (mapBlocksInFlight.count(pindex->GetBlockHash()) == 0) {
@@ -646,14 +676,8 @@ bool IsStandardTx(const CTransaction& tx, string& reason)
bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime)
{
- AssertLockHeld(cs_main);
- // Time based nLockTime implemented in 0.1.6
if (tx.nLockTime == 0)
return true;
- if (nBlockHeight == 0)
- nBlockHeight = chainActive.Height();
- if (nBlockTime == 0)
- nBlockTime = GetAdjustedTime();
if ((int64_t)tx.nLockTime < ((int64_t)tx.nLockTime < LOCKTIME_THRESHOLD ? (int64_t)nBlockHeight : nBlockTime))
return true;
BOOST_FOREACH(const CTxIn& txin, tx.vin)
@@ -662,10 +686,16 @@ bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime)
return true;
}
+bool CheckFinalTx(const CTransaction &tx)
+{
+ AssertLockHeld(cs_main);
+ return IsFinalTx(tx, chainActive.Height() + 1, GetAdjustedTime());
+}
+
/**
* Check transaction inputs to mitigate two
* potential denial-of-service attacks:
- *
+ *
* 1. scriptSigs with extra data stuffed into them,
* not consumed by scriptPubKey (or P2SH script)
* 2. P2SH scripts with a crazy number of expensive
@@ -878,21 +908,8 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
// Only accept nLockTime-using transactions that can be mined in the next
// block; we don't want our mempool filled up with transactions that can't
// be mined yet.
- //
- // However, IsFinalTx() is confusing... Without arguments, it uses
- // chainActive.Height() to evaluate nLockTime; when a block is accepted,
- // chainActive.Height() is set to the value of nHeight in the block.
- // However, when IsFinalTx() is called within CBlock::AcceptBlock(), the
- // height of the block *being* evaluated is what is used. Thus if we want
- // to know if a transaction can be part of the *next* block, we need to
- // call IsFinalTx() with one more than chainActive.Height().
- //
- // Timestamps on the other hand don't get any special treatment, because we
- // can't know what timestamp the next block will have, and there aren't
- // timestamp applications where it matters.
- if (!IsFinalTx(tx, chainActive.Height() + 1))
- return state.DoS(0,
- error("AcceptToMemoryPool: non-final"),
+ if (!CheckFinalTx(tx))
+ return state.DoS(0, error("AcceptToMemoryPool: non-final"),
REJECT_NONSTANDARD, "non-final");
// is it already in the memory pool?
@@ -930,7 +947,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
// do all inputs exist?
// Note that this does not check for the presence of actual outputs (see the next check for that),
- // only helps filling in pfMissingInputs (to determine missing vs spent).
+ // and only helps with filling in pfMissingInputs (to determine missing vs spent).
BOOST_FOREACH(const CTxIn txin, tx.vin) {
if (!view.HaveCoins(txin.prevout.hash)) {
if (pfMissingInputs)
@@ -974,7 +991,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
CAmount nFees = nValueIn-nValueOut;
double dPriority = view.GetPriority(tx, chainActive.Height());
- CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height());
+ CTxMemPoolEntry entry(tx, nFees, GetTime(), dPriority, chainActive.Height(), mempool.HasNoInputsOf(tx));
unsigned int nSize = entry.GetTxSize();
// Don't accept it if it can't get into a block
@@ -1040,7 +1057,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
}
// Store transaction in memory
- pool.addUnchecked(hash, entry);
+ pool.addUnchecked(hash, entry, !IsInitialBlockDownload());
}
SyncWithWallets(tx, NULL);
@@ -1121,7 +1138,7 @@ bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock
// CBlock and CBlockIndex
//
-bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos)
+bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos, const CMessageHeader::MessageStartChars& messageStart)
{
// Open history file to append
CAutoFile fileout(OpenBlockFile(pos), SER_DISK, CLIENT_VERSION);
@@ -1130,7 +1147,7 @@ bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos)
// Write index header
unsigned int nSize = fileout.GetSerializeSize(block);
- fileout << FLATDATA(Params().MessageStart()) << nSize;
+ fileout << FLATDATA(messageStart) << nSize;
// Write block
long fileOutPos = ftell(fileout.Get());
@@ -1176,25 +1193,26 @@ bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex)
return true;
}
-CAmount GetBlockValue(int nHeight, const CAmount& nFees)
+CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams)
{
- CAmount nSubsidy = 50 * COIN;
- int halvings = nHeight / Params().SubsidyHalvingInterval();
-
+ int halvings = nHeight / consensusParams.nSubsidyHalvingInterval;
// Force block reward to zero when right shift is undefined.
if (halvings >= 64)
- return nFees;
+ return 0;
+ CAmount nSubsidy = 50 * COIN;
// Subsidy is cut in half every 210,000 blocks which will occur approximately every 4 years.
nSubsidy >>= halvings;
-
- return nSubsidy + nFees;
+ return nSubsidy;
}
bool IsInitialBlockDownload()
{
+ const CChainParams& chainParams = Params();
LOCK(cs_main);
- if (fImporting || fReindex || chainActive.Height() < Checkpoints::GetTotalBlocksEstimate())
+ if (fImporting || fReindex)
+ return true;
+ if (fCheckpointsEnabled && chainActive.Height() < Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints()))
return true;
static bool lockIBDState = false;
if (lockIBDState)
@@ -1233,14 +1251,14 @@ void CheckForkWarningConditions()
}
if (pindexBestForkTip && pindexBestForkBase)
{
- LogPrintf("CheckForkWarningConditions: Warning: Large valid fork found\n forking the chain at height %d (%s)\n lasting to height %d (%s).\nChain state database corruption likely.\n",
+ LogPrintf("%s: Warning: Large valid fork found\n forking the chain at height %d (%s)\n lasting to height %d (%s).\nChain state database corruption likely.\n", __func__,
pindexBestForkBase->nHeight, pindexBestForkBase->phashBlock->ToString(),
pindexBestForkTip->nHeight, pindexBestForkTip->phashBlock->ToString());
fLargeWorkForkFound = true;
}
else
{
- LogPrintf("CheckForkWarningConditions: Warning: Found invalid chain at least ~6 blocks longer than our best chain.\nChain state database corruption likely.\n");
+ LogPrintf("%s: Warning: Found invalid chain at least ~6 blocks longer than our best chain.\nChain state database corruption likely.\n", __func__);
fLargeWorkInvalidChainFound = true;
}
}
@@ -1266,8 +1284,8 @@ void CheckForkWarningConditionsOnNewFork(CBlockIndex* pindexNewForkTip)
pfork = pfork->pprev;
}
- // We define a condition which we should warn the user about as a fork of at least 7 blocks
- // who's tip is within 72 blocks (+/- 12 hours if no one mines it) of ours
+ // We define a condition where we should warn the user about as a fork of at least 7 blocks
+ // with a tip within 72 blocks (+/- 12 hours if no one mines it) of ours
// We use 7 blocks rather arbitrarily as it represents just under 10% of sustained network
// hash rate operating on the fork.
// or a chain that is entirely longer than ours and invalid (note that this should be detected by both)
@@ -1298,10 +1316,10 @@ void Misbehaving(NodeId pnode, int howmuch)
int banscore = GetArg("-banscore", 100);
if (state->nMisbehavior >= banscore && state->nMisbehavior - howmuch < banscore)
{
- LogPrintf("Misbehaving: %s (%d -> %d) BAN THRESHOLD EXCEEDED\n", state->name, state->nMisbehavior-howmuch, state->nMisbehavior);
+ LogPrintf("%s: %s (%d -> %d) BAN THRESHOLD EXCEEDED\n", __func__, state->name, state->nMisbehavior-howmuch, state->nMisbehavior);
state->fShouldBan = true;
} else
- LogPrintf("Misbehaving: %s (%d -> %d)\n", state->name, state->nMisbehavior-howmuch, state->nMisbehavior);
+ LogPrintf("%s: %s (%d -> %d)\n", __func__, state->name, state->nMisbehavior-howmuch, state->nMisbehavior);
}
void static InvalidChainFound(CBlockIndex* pindexNew)
@@ -1309,11 +1327,11 @@ void static InvalidChainFound(CBlockIndex* pindexNew)
if (!pindexBestInvalid || pindexNew->nChainWork > pindexBestInvalid->nChainWork)
pindexBestInvalid = pindexNew;
- LogPrintf("InvalidChainFound: invalid block=%s height=%d log2_work=%.8g date=%s\n",
+ LogPrintf("%s: invalid block=%s height=%d log2_work=%.8g date=%s\n", __func__,
pindexNew->GetBlockHash().ToString(), pindexNew->nHeight,
log(pindexNew->nChainWork.getdouble())/log(2.0), DateTimeStrFormat("%Y-%m-%d %H:%M:%S",
pindexNew->GetBlockTime()));
- LogPrintf("InvalidChainFound: current best=%s height=%d log2_work=%.8g date=%s\n",
+ LogPrintf("%s: current best=%s height=%d log2_work=%.8g date=%s\n", __func__,
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0),
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()));
CheckForkWarningConditions();
@@ -1379,22 +1397,21 @@ bool CScriptCheck::operator()() {
return true;
}
-bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, std::vector<CScriptCheck> *pvChecks)
+int GetSpendHeight(const CCoinsViewCache& inputs)
{
- if (!tx.IsCoinBase())
- {
- if (pvChecks)
- pvChecks->reserve(tx.vin.size());
+ LOCK(cs_main);
+ CBlockIndex* pindexPrev = mapBlockIndex.find(inputs.GetBestBlock())->second;
+ return pindexPrev->nHeight + 1;
+}
+namespace Consensus {
+bool CheckTxInputs(const CTransaction& tx, CValidationState& state, const CCoinsViewCache& inputs, int nSpendHeight)
+{
// This doesn't trigger the DoS code on purpose; if it did, it would make it easier
// for an attacker to attempt to split the network.
if (!inputs.HaveInputs(tx))
return state.Invalid(error("CheckInputs(): %s inputs unavailable", tx.GetHash().ToString()));
- // While checking, GetBestBlock() refers to the parent block.
- // This is also true for mempool checks.
- CBlockIndex *pindexPrev = mapBlockIndex.find(inputs.GetBestBlock())->second;
- int nSpendHeight = pindexPrev->nHeight + 1;
CAmount nValueIn = 0;
CAmount nFees = 0;
for (unsigned int i = 0; i < tx.vin.size(); i++)
@@ -1433,6 +1450,19 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi
if (!MoneyRange(nFees))
return state.DoS(100, error("CheckInputs(): nFees out of range"),
REJECT_INVALID, "bad-txns-fee-outofrange");
+ return true;
+}
+}// namespace Consensus
+
+bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsViewCache &inputs, bool fScriptChecks, unsigned int flags, bool cacheStore, std::vector<CScriptCheck> *pvChecks)
+{
+ if (!tx.IsCoinBase())
+ {
+ if (!Consensus::CheckTxInputs(tx, state, inputs, GetSpendHeight(inputs)))
+ return false;
+
+ if (pvChecks)
+ pvChecks->reserve(tx.vin.size());
// The first loop above does all the inexpensive checks.
// Only if ALL inputs pass do we perform expensive ECDSA signature checks.
@@ -1483,7 +1513,7 @@ bool CheckInputs(const CTransaction& tx, CValidationState &state, const CCoinsVi
namespace {
-bool UndoWriteToDisk(const CBlockUndo& blockundo, CDiskBlockPos& pos, const uint256& hashBlock)
+bool UndoWriteToDisk(const CBlockUndo& blockundo, CDiskBlockPos& pos, const uint256& hashBlock, const CMessageHeader::MessageStartChars& messageStart)
{
// Open history file to append
CAutoFile fileout(OpenUndoFile(pos), SER_DISK, CLIENT_VERSION);
@@ -1492,7 +1522,7 @@ bool UndoWriteToDisk(const CBlockUndo& blockundo, CDiskBlockPos& pos, const uint
// Write index header
unsigned int nSize = fileout.GetSerializeSize(blockundo);
- fileout << FLATDATA(Params().MessageStart()) << nSize;
+ fileout << FLATDATA(messageStart) << nSize;
// Write undo data
long fileOutPos = ftell(fileout.Get());
@@ -1537,6 +1567,24 @@ bool UndoReadFromDisk(CBlockUndo& blockundo, const CDiskBlockPos& pos, const uin
return true;
}
+/** Abort with a message */
+bool AbortNode(const std::string& strMessage, const std::string& userMessage="")
+{
+ strMiscWarning = strMessage;
+ LogPrintf("*** %s\n", strMessage);
+ uiInterface.ThreadSafeMessageBox(
+ userMessage.empty() ? _("Error: A fatal internal error occured, see debug.log for details") : userMessage,
+ "", CClientUIInterface::MSG_ERROR);
+ StartShutdown();
+ return false;
+}
+
+bool AbortNode(CValidationState& state, const std::string& strMessage, const std::string& userMessage="")
+{
+ AbortNode(strMessage, userMessage);
+ return state.Error(strMessage);
+}
+
} // anon namespace
/**
@@ -1672,6 +1720,68 @@ void ThreadScriptCheck() {
scriptcheckqueue.Thread();
}
+//
+// Called periodically asynchronously; alerts if it smells like
+// we're being fed a bad chain (blocks being generated much
+// too slowly or too quickly).
+//
+void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const CBlockIndex *const &bestHeader,
+ int64_t nPowTargetSpacing)
+{
+ if (bestHeader == NULL || initialDownloadCheck()) return;
+
+ static int64_t lastAlertTime = 0;
+ int64_t now = GetAdjustedTime();
+ if (lastAlertTime > now-60*60*24) return; // Alert at most once per day
+
+ const int SPAN_HOURS=4;
+ const int SPAN_SECONDS=SPAN_HOURS*60*60;
+ int BLOCKS_EXPECTED = SPAN_SECONDS / nPowTargetSpacing;
+
+ boost::math::poisson_distribution<double> poisson(BLOCKS_EXPECTED);
+
+ std::string strWarning;
+ int64_t startTime = GetAdjustedTime()-SPAN_SECONDS;
+
+ LOCK(cs);
+ const CBlockIndex* i = bestHeader;
+ int nBlocks = 0;
+ while (i->GetBlockTime() >= startTime) {
+ ++nBlocks;
+ i = i->pprev;
+ if (i == NULL) return; // Ran out of chain, we must not be fully sync'ed
+ }
+
+ // How likely is it to find that many by chance?
+ double p = boost::math::pdf(poisson, nBlocks);
+
+ LogPrint("partitioncheck", "%s : Found %d blocks in the last %d hours\n", __func__, nBlocks, SPAN_HOURS);
+ LogPrint("partitioncheck", "%s : likelihood: %g\n", __func__, p);
+
+ // Aim for one false-positive about every fifty years of normal running:
+ const int FIFTY_YEARS = 50*365*24*60*60;
+ double alertThreshold = 1.0 / (FIFTY_YEARS / SPAN_SECONDS);
+
+ if (p <= alertThreshold && nBlocks < BLOCKS_EXPECTED)
+ {
+ // Many fewer blocks than expected: alert!
+ strWarning = strprintf(_("WARNING: check your network connection, %d blocks received in the last %d hours (%d expected)"),
+ nBlocks, SPAN_HOURS, BLOCKS_EXPECTED);
+ }
+ else if (p <= alertThreshold && nBlocks > BLOCKS_EXPECTED)
+ {
+ // Many more blocks than expected: alert!
+ strWarning = strprintf(_("WARNING: abnormally high number of blocks generated, %d blocks received in the last %d hours (%d expected)"),
+ nBlocks, SPAN_HOURS, BLOCKS_EXPECTED);
+ }
+ if (!strWarning.empty())
+ {
+ strMiscWarning = strWarning;
+ CAlert::Notify(strWarning, true);
+ lastAlertTime = now;
+ }
+}
+
static int64_t nTimeVerify = 0;
static int64_t nTimeConnect = 0;
static int64_t nTimeIndex = 0;
@@ -1680,6 +1790,7 @@ static int64_t nTimeTotal = 0;
bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pindex, CCoinsViewCache& view, bool fJustCheck)
{
+ const CChainParams& chainparams = Params();
AssertLockHeld(cs_main);
// Check it again in case a previous version let a bad block in
if (!CheckBlock(block, state, !fJustCheck, !fJustCheck))
@@ -1691,13 +1802,20 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
// Special case for the genesis block, skipping connection of its transactions
// (its coinbase is unspendable)
- if (block.GetHash() == Params().HashGenesisBlock()) {
+ if (block.GetHash() == chainparams.GetConsensus().hashGenesisBlock) {
if (!fJustCheck)
view.SetBestBlock(pindex->GetBlockHash());
return true;
}
- bool fScriptChecks = pindex->nHeight >= Checkpoints::GetTotalBlocksEstimate();
+ bool fScriptChecks = true;
+ if (fCheckpointsEnabled) {
+ CBlockIndex *pindexLastCheckpoint = Checkpoints::GetLastCheckpoint(chainparams.Checkpoints());
+ if (pindexLastCheckpoint && pindexLastCheckpoint->GetAncestor(pindex->nHeight) == pindex) {
+ // This block is an ancestor of a checkpoint: disable script checks
+ fScriptChecks = false;
+ }
+ }
// Do not allow blocks that contain transactions which 'overwrite' older transactions,
// unless those are already completely spent.
@@ -1707,9 +1825,9 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
// See BIP30 and http://r6.ca/blog/20120206T005236Z.html for more information.
// This logic is not necessary for memory pool transactions, as AcceptToMemoryPool
// already refuses previously-known transaction ids entirely.
- // This rule was originally applied all blocks whose timestamp was after March 15, 2012, 0:00 UTC.
+ // This rule was originally applied to all blocks with a timestamp after March 15, 2012, 0:00 UTC.
// Now that the whole chain is irreversibly beyond that time it is applied to all blocks except the
- // two in the chain that violate it. This prevents exploiting the issue against nodes in their
+ // two in the chain that violate it. This prevents exploiting the issue against nodes during their
// initial block download.
bool fEnforceBIP30 = (!pindex->phashBlock) || // Enforce on CreateNewBlock invocations which don't have a hash.
!((pindex->nHeight==91842 && pindex->GetBlockHash() == uint256S("0x00000000000a4d0a398161ffc163c503763b1f4360639393e0e4c8e300e0caec")) ||
@@ -1730,7 +1848,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
unsigned int flags = fStrictPayToScriptHash ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE;
// Start enforcing the DERSIG (BIP66) rules, for block.nVersion=3 blocks, when 75% of the network has upgraded:
- if (block.nVersion >= 3 && IsSuperMajority(3, pindex->pprev, Params().EnforceBlockUpgradeMajority())) {
+ if (block.nVersion >= 3 && IsSuperMajority(3, pindex->pprev, chainparams.GetConsensus().nMajorityEnforceBlockUpgrade, chainparams.GetConsensus())) {
flags |= SCRIPT_VERIFY_DERSIG;
}
@@ -1793,10 +1911,11 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
int64_t nTime1 = GetTimeMicros(); nTimeConnect += nTime1 - nTimeStart;
LogPrint("bench", " - Connect %u transactions: %.2fms (%.3fms/tx, %.3fms/txin) [%.2fs]\n", (unsigned)block.vtx.size(), 0.001 * (nTime1 - nTimeStart), 0.001 * (nTime1 - nTimeStart) / block.vtx.size(), nInputs <= 1 ? 0 : 0.001 * (nTime1 - nTimeStart) / (nInputs-1), nTimeConnect * 0.000001);
- if (block.vtx[0].GetValueOut() > GetBlockValue(pindex->nHeight, nFees))
+ CAmount blockReward = nFees + GetBlockSubsidy(pindex->nHeight, chainparams.GetConsensus());
+ if (block.vtx[0].GetValueOut() > blockReward)
return state.DoS(100,
error("ConnectBlock(): coinbase pays too much (actual=%d vs limit=%d)",
- block.vtx[0].GetValueOut(), GetBlockValue(pindex->nHeight, nFees)),
+ block.vtx[0].GetValueOut(), blockReward),
REJECT_INVALID, "bad-cb-amount");
if (!control.Wait())
@@ -1814,8 +1933,8 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
CDiskBlockPos pos;
if (!FindUndoPos(state, pindex->nFile, pos, ::GetSerializeSize(blockundo, SER_DISK, CLIENT_VERSION) + 40))
return error("ConnectBlock(): FindUndoPos failed");
- if (!UndoWriteToDisk(blockundo, pos, pindex->pprev->GetBlockHash()))
- return state.Abort("Failed to write undo data");
+ if (!UndoWriteToDisk(blockundo, pos, pindex->pprev->GetBlockHash(), chainparams.MessageStart()))
+ return AbortNode(state, "Failed to write undo data");
// update nUndoPos in block index
pindex->nUndoPos = pos.nPos;
@@ -1828,7 +1947,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
if (fTxIndex)
if (!pblocktree->WriteTxIndex(vPos))
- return state.Abort("Failed to write transaction index");
+ return AbortNode(state, "Failed to write transaction index");
// add this block to the view's block chain
view.SetBestBlock(pindex->GetBlockHash());
@@ -1848,6 +1967,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
}
enum FlushStateMode {
+ FLUSH_STATE_NONE,
FLUSH_STATE_IF_NEEDED,
FLUSH_STATE_PERIODIC,
FLUSH_STATE_ALWAYS
@@ -1855,22 +1975,55 @@ enum FlushStateMode {
/**
* Update the on-disk chain state.
- * The caches and indexes are flushed if either they're too large, forceWrite is set, or
- * fast is not set and it's been a while since the last write.
+ * The caches and indexes are flushed depending on the mode we're called with
+ * if they're too large, if it's been a while since the last write,
+ * or always and in all cases if we're in prune mode and are deleting files.
*/
bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
- LOCK(cs_main);
+ LOCK2(cs_main, cs_LastBlockFile);
static int64_t nLastWrite = 0;
+ static int64_t nLastFlush = 0;
+ static int64_t nLastSetChain = 0;
+ std::set<int> setFilesToPrune;
+ bool fFlushForPrune = false;
try {
- if ((mode == FLUSH_STATE_ALWAYS) ||
- ((mode == FLUSH_STATE_PERIODIC || mode == FLUSH_STATE_IF_NEEDED) && pcoinsTip->GetCacheSize() > nCoinCacheSize) ||
- (mode == FLUSH_STATE_PERIODIC && GetTimeMicros() > nLastWrite + DATABASE_WRITE_INTERVAL * 1000000)) {
- // Typical CCoins structures on disk are around 100 bytes in size.
- // Pushing a new one to the database can cause it to be written
- // twice (once in the log, and once in the tables). This is already
- // an overestimation, as most will delete an existing entry or
- // overwrite one. Still, use a conservative safety factor of 2.
- if (!CheckDiskSpace(100 * 2 * 2 * pcoinsTip->GetCacheSize()))
+ if (fPruneMode && fCheckForPruning) {
+ FindFilesToPrune(setFilesToPrune);
+ fCheckForPruning = false;
+ if (!setFilesToPrune.empty()) {
+ fFlushForPrune = true;
+ if (!fHavePruned) {
+ pblocktree->WriteFlag("prunedblockfiles", true);
+ fHavePruned = true;
+ }
+ }
+ }
+ int64_t nNow = GetTimeMicros();
+ // Avoid writing/flushing immediately after startup.
+ if (nLastWrite == 0) {
+ nLastWrite = nNow;
+ }
+ if (nLastFlush == 0) {
+ nLastFlush = nNow;
+ }
+ if (nLastSetChain == 0) {
+ nLastSetChain = nNow;
+ }
+ size_t cacheSize = pcoinsTip->DynamicMemoryUsage();
+ // The cache is large and close to the limit, but we have time now (not in the middle of a block processing).
+ bool fCacheLarge = mode == FLUSH_STATE_PERIODIC && cacheSize * (10.0/9) > nCoinCacheUsage;
+ // The cache is over the limit, we have to write now.
+ bool fCacheCritical = mode == FLUSH_STATE_IF_NEEDED && cacheSize > nCoinCacheUsage;
+ // It's been a while since we wrote the block index to disk. Do this frequently, so we don't need to redownload after a crash.
+ bool fPeriodicWrite = mode == FLUSH_STATE_PERIODIC && nNow > nLastWrite + (int64_t)DATABASE_WRITE_INTERVAL * 1000000;
+ // It's been very long since we flushed the cache. Do this infrequently, to optimize cache usage.
+ bool fPeriodicFlush = mode == FLUSH_STATE_PERIODIC && nNow > nLastFlush + (int64_t)DATABASE_FLUSH_INTERVAL * 1000000;
+ // Combine all conditions that result in a full cache flush.
+ bool fDoFullFlush = (mode == FLUSH_STATE_ALWAYS) || fCacheLarge || fCacheCritical || fPeriodicFlush || fFlushForPrune;
+ // Write blocks and block index to disk.
+ if (fDoFullFlush || fPeriodicWrite) {
+ // Depend on nMinDiskSpace to ensure we can write block index
+ if (!CheckDiskSpace(0))
return state.Error("out of disk space");
// First make sure all block and undo data is flushed to disk.
FlushBlockFile();
@@ -1889,20 +2042,35 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
setDirtyBlockIndex.erase(it++);
}
if (!pblocktree->WriteBatchSync(vFiles, nLastBlockFile, vBlocks)) {
- return state.Abort("Files to write to block index database");
+ return AbortNode(state, "Files to write to block index database");
}
}
- // Finally flush the chainstate (which may refer to block index entries).
+ // Finally remove any pruned files
+ if (fFlushForPrune)
+ UnlinkPrunedFiles(setFilesToPrune);
+ nLastWrite = nNow;
+ }
+ // Flush best chain related state. This can only be done if the blocks / block index write was also done.
+ if (fDoFullFlush) {
+ // Typical CCoins structures on disk are around 128 bytes in size.
+ // Pushing a new one to the database can cause it to be written
+ // twice (once in the log, and once in the tables). This is already
+ // an overestimation, as most will delete an existing entry or
+ // overwrite one. Still, use a conservative safety factor of 2.
+ if (!CheckDiskSpace(128 * 2 * 2 * pcoinsTip->GetCacheSize()))
+ return state.Error("out of disk space");
+ // Flush the chainstate (which may refer to block index entries).
if (!pcoinsTip->Flush())
- return state.Abort("Failed to write to coin database");
+ return AbortNode(state, "Failed to write to coin database");
+ nLastFlush = nNow;
+ }
+ if ((mode == FLUSH_STATE_ALWAYS || mode == FLUSH_STATE_PERIODIC) && nNow > nLastSetChain + (int64_t)DATABASE_WRITE_INTERVAL * 1000000) {
// Update best block in wallet (so we can detect restored wallets).
- if (mode != FLUSH_STATE_IF_NEEDED) {
- GetMainSignals().SetBestChain(chainActive.GetLocator());
- }
- nLastWrite = GetTimeMicros();
+ GetMainSignals().SetBestChain(chainActive.GetLocator());
+ nLastSetChain = nNow;
}
} catch (const std::runtime_error& e) {
- return state.Abort(std::string("System error while flushing: ") + e.what());
+ return AbortNode(state, std::string("System error while flushing: ") + e.what());
}
return true;
}
@@ -1912,18 +2080,25 @@ void FlushStateToDisk() {
FlushStateToDisk(state, FLUSH_STATE_ALWAYS);
}
+void PruneAndFlush() {
+ CValidationState state;
+ fCheckForPruning = true;
+ FlushStateToDisk(state, FLUSH_STATE_NONE);
+}
+
/** Update chainActive and related internal data structures. */
void static UpdateTip(CBlockIndex *pindexNew) {
+ const CChainParams& chainParams = Params();
chainActive.SetTip(pindexNew);
// New best block
nTimeBestReceived = GetTime();
mempool.AddTransactionsUpdated(1);
- LogPrintf("UpdateTip: new best=%s height=%d log2_work=%.8g tx=%lu date=%s progress=%f cache=%u\n",
+ LogPrintf("%s: new best=%s height=%d log2_work=%.8g tx=%lu date=%s progress=%f cache=%.1fMiB(%utx)\n", __func__,
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(), log(chainActive.Tip()->nChainWork.getdouble())/log(2.0), (unsigned long)chainActive.Tip()->nChainTx,
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()),
- Checkpoints::GuessVerificationProgress(chainActive.Tip()), (unsigned int)pcoinsTip->GetCacheSize());
+ Checkpoints::GuessVerificationProgress(chainParams.Checkpoints(), chainActive.Tip()), pcoinsTip->DynamicMemoryUsage() * (1.0 / (1<<20)), pcoinsTip->GetCacheSize());
cvBlockChange.notify_all();
@@ -1940,11 +2115,11 @@ void static UpdateTip(CBlockIndex *pindexNew) {
pindex = pindex->pprev;
}
if (nUpgraded > 0)
- LogPrintf("SetBestChain: %d of last 100 blocks above version %d\n", nUpgraded, (int)CBlock::CURRENT_VERSION);
+ LogPrintf("%s: %d of last 100 blocks above version %d\n", __func__, nUpgraded, (int)CBlock::CURRENT_VERSION);
if (nUpgraded > 100/2)
{
// strMiscWarning is read by GetWarnings(), called by Qt and the JSON-RPC code to warn the user:
- strMiscWarning = _("Warning: This version is obsolete, upgrade required!");
+ strMiscWarning = _("Warning: This version is obsolete; upgrade required!");
CAlert::Notify(strMiscWarning, true);
fWarned = true;
}
@@ -1959,7 +2134,7 @@ bool static DisconnectTip(CValidationState &state) {
// Read block from disk.
CBlock block;
if (!ReadBlockFromDisk(block, pindexDelete))
- return state.Abort("Failed to read block");
+ return AbortNode(state, "Failed to read block");
// Apply the block atomically to the chain state.
int64_t nStart = GetTimeMicros();
{
@@ -1998,7 +2173,7 @@ static int64_t nTimeFlush = 0;
static int64_t nTimeChainState = 0;
static int64_t nTimePostConnect = 0;
-/**
+/**
* Connect a new block to chainActive. pblock is either NULL or a pointer to a CBlock
* corresponding to pindexNew, to bypass loading it again from disk.
*/
@@ -2010,7 +2185,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock *
CBlock block;
if (!pblock) {
if (!ReadBlockFromDisk(block, pindexNew))
- return state.Abort("Failed to read block");
+ return AbortNode(state, "Failed to read block");
pblock = &block;
}
// Apply the block atomically to the chain state.
@@ -2041,7 +2216,7 @@ bool static ConnectTip(CValidationState &state, CBlockIndex *pindexNew, CBlock *
LogPrint("bench", " - Writing chainstate: %.2fms [%.2fs]\n", (nTime5 - nTime4) * 0.001, nTimeChainState * 0.000001);
// Remove conflicting transactions from the mempool.
list<CTransaction> txConflicted;
- mempool.removeForBlock(pblock->vtx, pindexNew->nHeight, txConflicted);
+ mempool.removeForBlock(pblock->vtx, pindexNew->nHeight, txConflicted, !IsInitialBlockDownload());
mempool.check(pcoinsTip);
// Update chainActive & related variables.
UpdateTip(pindexNew);
@@ -2082,15 +2257,29 @@ static CBlockIndex* FindMostWorkChain() {
CBlockIndex *pindexTest = pindexNew;
bool fInvalidAncestor = false;
while (pindexTest && !chainActive.Contains(pindexTest)) {
- assert(pindexTest->nStatus & BLOCK_HAVE_DATA);
assert(pindexTest->nChainTx || pindexTest->nHeight == 0);
- if (pindexTest->nStatus & BLOCK_FAILED_MASK) {
- // Candidate has an invalid ancestor, remove entire chain from the set.
- if (pindexBestInvalid == NULL || pindexNew->nChainWork > pindexBestInvalid->nChainWork)
+
+ // Pruned nodes may have entries in setBlockIndexCandidates for
+ // which block files have been deleted. Remove those as candidates
+ // for the most work chain if we come across them; we can't switch
+ // to a chain unless we have all the non-active-chain parent blocks.
+ bool fFailedChain = pindexTest->nStatus & BLOCK_FAILED_MASK;
+ bool fMissingData = !(pindexTest->nStatus & BLOCK_HAVE_DATA);
+ if (fFailedChain || fMissingData) {
+ // Candidate chain is not usable (either invalid or missing data)
+ if (fFailedChain && (pindexBestInvalid == NULL || pindexNew->nChainWork > pindexBestInvalid->nChainWork))
pindexBestInvalid = pindexNew;
CBlockIndex *pindexFailed = pindexNew;
+ // Remove the entire chain from the set.
while (pindexTest != pindexFailed) {
- pindexFailed->nStatus |= BLOCK_FAILED_CHILD;
+ if (fFailedChain) {
+ pindexFailed->nStatus |= BLOCK_FAILED_CHILD;
+ } else if (fMissingData) {
+ // If we're missing data, then add back to mapBlocksUnlinked,
+ // so that if the block arrives in the future we can try adding
+ // to setBlockIndexCandidates again.
+ mapBlocksUnlinked.insert(std::make_pair(pindexFailed->pprev, pindexFailed));
+ }
setBlockIndexCandidates.erase(pindexFailed);
pindexFailed = pindexFailed->pprev;
}
@@ -2193,6 +2382,7 @@ static bool ActivateBestChainStep(CValidationState &state, CBlockIndex *pindexMo
bool ActivateBestChain(CValidationState &state, CBlock *pblock) {
CBlockIndex *pindexNewTip = NULL;
CBlockIndex *pindexMostWork = NULL;
+ const CChainParams& chainParams = Params();
do {
boost::this_thread::interruption_point();
@@ -2217,8 +2407,12 @@ bool ActivateBestChain(CValidationState &state, CBlock *pblock) {
if (!fInitialDownload) {
uint256 hashNewTip = pindexNewTip->GetBlockHash();
// Relay inventory, but don't relay old inventory during initial block download.
- int nBlockEstimate = Checkpoints::GetTotalBlocksEstimate();
- {
+ int nBlockEstimate = 0;
+ if (fCheckpointsEnabled)
+ nBlockEstimate = Checkpoints::GetTotalBlocksEstimate(chainParams.Checkpoints());
+ // Don't relay blocks if pruning -- could cause a peer to try to download, resulting
+ // in a stalled download if the block file is pruned before the request.
+ if (nLocalServices & NODE_NETWORK) {
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
if (chainActive.Height() > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate))
@@ -2259,7 +2453,7 @@ bool InvalidateBlock(CValidationState& state, CBlockIndex *pindex) {
}
// The resulting new best tip may not be in setBlockIndexCandidates anymore, so
- // add them again.
+ // add it again.
BlockMap::iterator it = mapBlockIndex.begin();
while (it != mapBlockIndex.end()) {
if (it->second->IsValid(BLOCK_VALID_TRANSACTIONS) && it->second->nChainTx && !setBlockIndexCandidates.value_comp()(it->second, chainActive.Tip())) {
@@ -2349,10 +2543,6 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
pindexNew->nUndoPos = 0;
pindexNew->nStatus |= BLOCK_HAVE_DATA;
pindexNew->RaiseValidity(BLOCK_VALID_TRANSACTIONS);
- {
- LOCK(cs_nBlockSequenceId);
- pindexNew->nSequenceId = nBlockSequenceId++;
- }
setDirtyBlockIndex.insert(pindexNew);
if (pindexNew->pprev == NULL || pindexNew->pprev->nChainTx) {
@@ -2365,6 +2555,10 @@ bool ReceivedBlockTransactions(const CBlock &block, CValidationState& state, CBl
CBlockIndex *pindex = queue.front();
queue.pop_front();
pindex->nChainTx = (pindex->pprev ? pindex->pprev->nChainTx : 0) + pindex->nTx;
+ {
+ LOCK(cs_nBlockSequenceId);
+ pindex->nSequenceId = nBlockSequenceId++;
+ }
if (chainActive.Tip() == NULL || !setBlockIndexCandidates.value_comp()(pindex, chainActive.Tip())) {
setBlockIndexCandidates.insert(pindex);
}
@@ -2418,6 +2612,8 @@ bool FindBlockPos(CValidationState &state, CDiskBlockPos &pos, unsigned int nAdd
unsigned int nOldChunks = (pos.nPos + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE;
unsigned int nNewChunks = (vinfoBlockFile[nFile].nSize + BLOCKFILE_CHUNK_SIZE - 1) / BLOCKFILE_CHUNK_SIZE;
if (nNewChunks > nOldChunks) {
+ if (fPruneMode)
+ fCheckForPruning = true;
if (CheckDiskSpace(nNewChunks * BLOCKFILE_CHUNK_SIZE - pos.nPos)) {
FILE *file = OpenBlockFile(pos);
if (file) {
@@ -2449,6 +2645,8 @@ bool FindUndoPos(CValidationState &state, int nFile, CDiskBlockPos &pos, unsigne
unsigned int nOldChunks = (pos.nPos + UNDOFILE_CHUNK_SIZE - 1) / UNDOFILE_CHUNK_SIZE;
unsigned int nNewChunks = (nNewSize + UNDOFILE_CHUNK_SIZE - 1) / UNDOFILE_CHUNK_SIZE;
if (nNewChunks > nOldChunks) {
+ if (fPruneMode)
+ fCheckForPruning = true;
if (CheckDiskSpace(nNewChunks * UNDOFILE_CHUNK_SIZE - pos.nPos)) {
FILE *file = OpenUndoFile(pos);
if (file) {
@@ -2539,18 +2737,25 @@ bool CheckBlock(const CBlock& block, CValidationState& state, bool fCheckPOW, bo
return true;
}
-bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex * const pindexPrev)
+static bool CheckIndexAgainstCheckpoint(const CBlockIndex* pindexPrev, CValidationState& state, const CChainParams& chainparams, const uint256& hash)
{
- uint256 hash = block.GetHash();
- if (hash == Params().HashGenesisBlock())
+ if (*pindexPrev->phashBlock == chainparams.GetConsensus().hashGenesisBlock)
return true;
- assert(pindexPrev);
-
int nHeight = pindexPrev->nHeight+1;
+ // Don't accept any forks from the main chain prior to last checkpoint
+ CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint(chainparams.Checkpoints());
+ if (pcheckpoint && nHeight < pcheckpoint->nHeight)
+ return state.DoS(100, error("%s: forked chain older than last checkpoint (height %d)", __func__, nHeight));
+
+ return true;
+}
+bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex * const pindexPrev)
+{
+ const Consensus::Params& consensusParams = Params().GetConsensus();
// Check proof of work
- if (block.nBits != GetNextWorkRequired(pindexPrev, &block, Params().GetConsensus()))
+ if (block.nBits != GetNextWorkRequired(pindexPrev, &block, consensusParams))
return state.DoS(100, error("%s: incorrect proof of work", __func__),
REJECT_INVALID, "bad-diffbits");
@@ -2559,29 +2764,15 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta
return state.Invalid(error("%s: block's timestamp is too early", __func__),
REJECT_INVALID, "time-too-old");
- // Check that the block chain matches the known block chain up to a checkpoint
- if (!Checkpoints::CheckBlock(nHeight, hash))
- return state.DoS(100, error("%s: rejected by checkpoint lock-in at %d", __func__, nHeight),
- REJECT_CHECKPOINT, "checkpoint mismatch");
-
- // Don't accept any forks from the main chain prior to last checkpoint
- CBlockIndex* pcheckpoint = Checkpoints::GetLastCheckpoint();
- if (pcheckpoint && nHeight < pcheckpoint->nHeight)
- return state.DoS(100, error("%s: forked chain older than last checkpoint (height %d)", __func__, nHeight));
-
// Reject block.nVersion=1 blocks when 95% (75% on testnet) of the network has upgraded:
- if (block.nVersion < 2 && IsSuperMajority(2, pindexPrev, Params().RejectBlockOutdatedMajority()))
- {
+ if (block.nVersion < 2 && IsSuperMajority(2, pindexPrev, consensusParams.nMajorityRejectBlockOutdated, consensusParams))
return state.Invalid(error("%s: rejected nVersion=1 block", __func__),
REJECT_OBSOLETE, "bad-version");
- }
// Reject block.nVersion=2 blocks when 95% (75% on testnet) of the network has upgraded:
- if (block.nVersion < 3 && IsSuperMajority(3, pindexPrev, Params().RejectBlockOutdatedMajority()))
- {
+ if (block.nVersion < 3 && IsSuperMajority(3, pindexPrev, consensusParams.nMajorityRejectBlockOutdated, consensusParams))
return state.Invalid(error("%s : rejected nVersion=2 block", __func__),
REJECT_OBSOLETE, "bad-version");
- }
return true;
}
@@ -2589,6 +2780,7 @@ bool ContextualCheckBlockHeader(const CBlockHeader& block, CValidationState& sta
bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIndex * const pindexPrev)
{
const int nHeight = pindexPrev == NULL ? 0 : pindexPrev->nHeight + 1;
+ const Consensus::Params& consensusParams = Params().GetConsensus();
// Check that all transactions are finalized
BOOST_FOREACH(const CTransaction& tx, block.vtx)
@@ -2598,7 +2790,7 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn
// Enforce block.nVersion=2 rule that the coinbase starts with serialized block height
// if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet):
- if (block.nVersion >= 2 && IsSuperMajority(2, pindexPrev, Params().EnforceBlockUpgradeMajority()))
+ if (block.nVersion >= 2 && IsSuperMajority(2, pindexPrev, consensusParams.nMajorityEnforceBlockUpgrade, consensusParams))
{
CScript expect = CScript() << nHeight;
if (block.vtx[0].vin[0].scriptSig.size() < expect.size() ||
@@ -2612,38 +2804,43 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn
bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex** ppindex)
{
+ const CChainParams& chainparams = Params();
AssertLockHeld(cs_main);
// Check for duplicate
uint256 hash = block.GetHash();
BlockMap::iterator miSelf = mapBlockIndex.find(hash);
CBlockIndex *pindex = NULL;
- if (miSelf != mapBlockIndex.end()) {
- // Block header is already known.
- pindex = miSelf->second;
- if (ppindex)
- *ppindex = pindex;
- if (pindex->nStatus & BLOCK_FAILED_MASK)
- return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate");
- return true;
- }
+ if (hash != chainparams.GetConsensus().hashGenesisBlock) {
+
+ if (miSelf != mapBlockIndex.end()) {
+ // Block header is already known.
+ pindex = miSelf->second;
+ if (ppindex)
+ *ppindex = pindex;
+ if (pindex->nStatus & BLOCK_FAILED_MASK)
+ return state.Invalid(error("%s: block is marked invalid", __func__), 0, "duplicate");
+ return true;
+ }
- if (!CheckBlockHeader(block, state))
- return false;
+ if (!CheckBlockHeader(block, state))
+ return false;
- // Get prev block index
- CBlockIndex* pindexPrev = NULL;
- if (hash != Params().HashGenesisBlock()) {
+ // Get prev block index
+ CBlockIndex* pindexPrev = NULL;
BlockMap::iterator mi = mapBlockIndex.find(block.hashPrevBlock);
if (mi == mapBlockIndex.end())
return state.DoS(10, error("%s: prev block not found", __func__), 0, "bad-prevblk");
pindexPrev = (*mi).second;
if (pindexPrev->nStatus & BLOCK_FAILED_MASK)
return state.DoS(100, error("%s: prev block invalid", __func__), REJECT_INVALID, "bad-prevblk");
- }
- if (!ContextualCheckBlockHeader(block, state, pindexPrev))
- return false;
+ assert(pindexPrev);
+ if (fCheckpointsEnabled && !CheckIndexAgainstCheckpoint(pindexPrev, state, chainparams, hash))
+ return error("%s: CheckIndexAgainstCheckpoint(): %s", __func__, state.GetRejectReason().c_str());
+ if (!ContextualCheckBlockHeader(block, state, pindexPrev))
+ return false;
+ }
if (pindex == NULL)
pindex = AddToBlockIndex(block);
@@ -2653,8 +2850,9 @@ bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBloc
return true;
}
-bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, CDiskBlockPos* dbp)
+bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex, bool fRequested, CDiskBlockPos* dbp)
{
+ const CChainParams& chainparams = Params();
AssertLockHeld(cs_main);
CBlockIndex *&pindex = *ppindex;
@@ -2662,10 +2860,18 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex,
if (!AcceptBlockHeader(block, state, &pindex))
return false;
- if (pindex->nStatus & BLOCK_HAVE_DATA) {
- // TODO: deal better with duplicate blocks.
- // return state.DoS(20, error("AcceptBlock(): already have block %d %s", pindex->nHeight, pindex->GetBlockHash().ToString()), REJECT_DUPLICATE, "duplicate");
- return true;
+ // Try to process all requested blocks that we don't have, but only
+ // process an unrequested block if it's new and has enough work to
+ // advance our tip.
+ bool fAlreadyHave = pindex->nStatus & BLOCK_HAVE_DATA;
+ bool fHasMoreWork = (chainActive.Tip() ? pindex->nChainWork > chainActive.Tip()->nChainWork : true);
+
+ // TODO: deal better with return value and error conditions for duplicate
+ // and unrequested blocks.
+ if (fAlreadyHave) return true;
+ if (!fRequested) { // If we didn't ask for it:
+ if (pindex->nTx != 0) return true; // This is a previously-processed block that was pruned
+ if (!fHasMoreWork) return true; // Don't process less-work chains
}
if ((!CheckBlock(block, state)) || !ContextualCheckBlock(block, state, pindex->pprev)) {
@@ -2687,22 +2893,24 @@ bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex** ppindex,
if (!FindBlockPos(state, blockPos, nBlockSize+8, nHeight, block.GetBlockTime(), dbp != NULL))
return error("AcceptBlock(): FindBlockPos failed");
if (dbp == NULL)
- if (!WriteBlockToDisk(block, blockPos))
- return state.Abort("Failed to write block");
+ if (!WriteBlockToDisk(block, blockPos, chainparams.MessageStart()))
+ AbortNode(state, "Failed to write block");
if (!ReceivedBlockTransactions(block, state, pindex, blockPos))
return error("AcceptBlock(): ReceivedBlockTransactions failed");
} catch (const std::runtime_error& e) {
- return state.Abort(std::string("System error: ") + e.what());
+ return AbortNode(state, std::string("System error: ") + e.what());
}
+ if (fCheckForPruning)
+ FlushStateToDisk(state, FLUSH_STATE_NONE); // we just allocated more disk space for block files
+
return true;
}
-static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned int nRequired)
+static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned nRequired, const Consensus::Params& consensusParams)
{
- unsigned int nToCheck = Params().ToCheckBlockUpgradeMajority();
unsigned int nFound = 0;
- for (unsigned int i = 0; i < nToCheck && nFound < nRequired && pstart != NULL; i++)
+ for (int i = 0; i < consensusParams.nMajorityWindow && nFound < nRequired && pstart != NULL; i++)
{
if (pstart->nVersion >= minVersion)
++nFound;
@@ -2712,21 +2920,22 @@ static bool IsSuperMajority(int minVersion, const CBlockIndex* pstart, unsigned
}
-bool ProcessNewBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBlockPos *dbp)
+bool ProcessNewBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, bool fForceProcessing, CDiskBlockPos *dbp)
{
// Preliminary checks
bool checked = CheckBlock(*pblock, state);
{
LOCK(cs_main);
- MarkBlockAsReceived(pblock->GetHash());
+ bool fRequested = MarkBlockAsReceived(pblock->GetHash());
+ fRequested |= fForceProcessing;
if (!checked) {
return error("%s: CheckBlock FAILED", __func__);
}
// Store to disk
CBlockIndex *pindex = NULL;
- bool ret = AcceptBlock(*pblock, state, &pindex, dbp);
+ bool ret = AcceptBlock(*pblock, state, &pindex, fRequested, dbp);
if (pindex && pfrom) {
mapBlockSource[pindex->GetBlockHash()] = pfrom->GetId();
}
@@ -2743,8 +2952,11 @@ bool ProcessNewBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDis
bool TestBlockValidity(CValidationState &state, const CBlock& block, CBlockIndex * const pindexPrev, bool fCheckPOW, bool fCheckMerkleRoot)
{
+ const CChainParams& chainparams = Params();
AssertLockHeld(cs_main);
- assert(pindexPrev == chainActive.Tip());
+ assert(pindexPrev && pindexPrev == chainActive.Tip());
+ if (fCheckpointsEnabled && !CheckIndexAgainstCheckpoint(pindexPrev, state, chainparams, block.GetHash()))
+ return error("%s: CheckIndexAgainstCheckpoint(): %s", __func__, state.GetRejectReason().c_str());
CCoinsViewCache viewNew(pcoinsTip);
CBlockIndex indexDummy(block);
@@ -2765,21 +2977,109 @@ bool TestBlockValidity(CValidationState &state, const CBlock& block, CBlockIndex
return true;
}
+/**
+ * BLOCK PRUNING CODE
+ */
+/* Calculate the amount of disk space the block & undo files currently use */
+uint64_t CalculateCurrentUsage()
+{
+ uint64_t retval = 0;
+ BOOST_FOREACH(const CBlockFileInfo &file, vinfoBlockFile) {
+ retval += file.nSize + file.nUndoSize;
+ }
+ return retval;
+}
+/* Prune a block file (modify associated database entries)*/
+void PruneOneBlockFile(const int fileNumber)
+{
+ for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); ++it) {
+ CBlockIndex* pindex = it->second;
+ if (pindex->nFile == fileNumber) {
+ pindex->nStatus &= ~BLOCK_HAVE_DATA;
+ pindex->nStatus &= ~BLOCK_HAVE_UNDO;
+ pindex->nFile = 0;
+ pindex->nDataPos = 0;
+ pindex->nUndoPos = 0;
+ setDirtyBlockIndex.insert(pindex);
+ // Prune from mapBlocksUnlinked -- any block we prune would have
+ // to be downloaded again in order to consider its chain, at which
+ // point it would be considered as a candidate for
+ // mapBlocksUnlinked or setBlockIndexCandidates.
+ std::pair<std::multimap<CBlockIndex*, CBlockIndex*>::iterator, std::multimap<CBlockIndex*, CBlockIndex*>::iterator> range = mapBlocksUnlinked.equal_range(pindex->pprev);
+ while (range.first != range.second) {
+ std::multimap<CBlockIndex *, CBlockIndex *>::iterator it = range.first;
+ range.first++;
+ if (it->second == pindex) {
+ mapBlocksUnlinked.erase(it);
+ }
+ }
+ }
+ }
+ vinfoBlockFile[fileNumber].SetNull();
+ setDirtyFileInfo.insert(fileNumber);
+}
+void UnlinkPrunedFiles(std::set<int>& setFilesToPrune)
+{
+ for (set<int>::iterator it = setFilesToPrune.begin(); it != setFilesToPrune.end(); ++it) {
+ CDiskBlockPos pos(*it, 0);
+ boost::filesystem::remove(GetBlockPosFilename(pos, "blk"));
+ boost::filesystem::remove(GetBlockPosFilename(pos, "rev"));
+ LogPrintf("Prune: %s deleted blk/rev (%05u)\n", __func__, *it);
+ }
+}
-bool AbortNode(const std::string &strMessage, const std::string &userMessage) {
- strMiscWarning = strMessage;
- LogPrintf("*** %s\n", strMessage);
- uiInterface.ThreadSafeMessageBox(
- userMessage.empty() ? _("Error: A fatal internal error occured, see debug.log for details") : userMessage,
- "", CClientUIInterface::MSG_ERROR);
- StartShutdown();
- return false;
+/* Calculate the block/rev files that should be deleted to remain under target*/
+void FindFilesToPrune(std::set<int>& setFilesToPrune)
+{
+ LOCK2(cs_main, cs_LastBlockFile);
+ if (chainActive.Tip() == NULL || nPruneTarget == 0) {
+ return;
+ }
+ if (chainActive.Tip()->nHeight <= Params().PruneAfterHeight()) {
+ return;
+ }
+
+ unsigned int nLastBlockWeCanPrune = chainActive.Tip()->nHeight - MIN_BLOCKS_TO_KEEP;
+ uint64_t nCurrentUsage = CalculateCurrentUsage();
+ // We don't check to prune until after we've allocated new space for files
+ // So we should leave a buffer under our target to account for another allocation
+ // before the next pruning.
+ uint64_t nBuffer = BLOCKFILE_CHUNK_SIZE + UNDOFILE_CHUNK_SIZE;
+ uint64_t nBytesToPrune;
+ int count=0;
+
+ if (nCurrentUsage + nBuffer >= nPruneTarget) {
+ for (int fileNumber = 0; fileNumber < nLastBlockFile; fileNumber++) {
+ nBytesToPrune = vinfoBlockFile[fileNumber].nSize + vinfoBlockFile[fileNumber].nUndoSize;
+
+ if (vinfoBlockFile[fileNumber].nSize == 0)
+ continue;
+
+ if (nCurrentUsage + nBuffer < nPruneTarget) // are we below our target?
+ break;
+
+ // don't prune files that could have a block within MIN_BLOCKS_TO_KEEP of the main chain's tip but keep scanning
+ if (vinfoBlockFile[fileNumber].nHeightLast > nLastBlockWeCanPrune)
+ continue;
+
+ PruneOneBlockFile(fileNumber);
+ // Queue up the files for removal
+ setFilesToPrune.insert(fileNumber);
+ nCurrentUsage -= nBytesToPrune;
+ count++;
+ }
+ }
+
+ LogPrint("prune", "Prune: target=%dMiB actual=%dMiB diff=%dMiB max_prune_height=%d removed %d blk/rev pairs\n",
+ nPruneTarget/1024/1024, nCurrentUsage/1024/1024,
+ ((int64_t)nPruneTarget - (int64_t)nCurrentUsage)/1024/1024,
+ nLastBlockWeCanPrune, count);
}
bool CheckDiskSpace(uint64_t nAdditionalBytes)
@@ -2851,6 +3151,7 @@ CBlockIndex * InsertBlockIndex(uint256 hash)
bool static LoadBlockIndexDB()
{
+ const CChainParams& chainparams = Params();
if (!pblocktree->LoadBlockIndexGuts())
return false;
@@ -2869,7 +3170,9 @@ bool static LoadBlockIndexDB()
{
CBlockIndex* pindex = item.second;
pindex->nChainWork = (pindex->pprev ? pindex->pprev->nChainWork : 0) + GetBlockProof(*pindex);
- if (pindex->nStatus & BLOCK_HAVE_DATA) {
+ // We can link the chain of blocks for which we've received transactions at some point.
+ // Pruned nodes may have deleted the block.
+ if (pindex->nTx > 0) {
if (pindex->pprev) {
if (pindex->pprev->nChainTx) {
pindex->nChainTx = pindex->pprev->nChainTx + pindex->nTx;
@@ -2926,6 +3229,11 @@ bool static LoadBlockIndexDB()
}
}
+ // Check whether we have ever pruned block & undo files
+ pblocktree->ReadFlag("prunedblockfiles", fHavePruned);
+ if (fHavePruned)
+ LogPrintf("LoadBlockIndexDB(): Block files have previously been pruned\n");
+
// Check whether we need to continue reindexing
bool fReindexing = false;
pblocktree->ReadReindexing(fReindexing);
@@ -2933,7 +3241,7 @@ bool static LoadBlockIndexDB()
// Check whether we have a transaction index
pblocktree->ReadFlag("txindex", fTxIndex);
- LogPrintf("LoadBlockIndexDB(): transaction index %s\n", fTxIndex ? "enabled" : "disabled");
+ LogPrintf("%s: transaction index %s\n", __func__, fTxIndex ? "enabled" : "disabled");
// Load pointer to end of best chain
BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock());
@@ -2943,10 +3251,10 @@ bool static LoadBlockIndexDB()
PruneBlockIndexCandidates();
- LogPrintf("LoadBlockIndexDB(): hashBestChain=%s height=%d date=%s progress=%f\n",
+ LogPrintf("%s: hashBestChain=%s height=%d date=%s progress=%f\n", __func__,
chainActive.Tip()->GetBlockHash().ToString(), chainActive.Height(),
DateTimeStrFormat("%Y-%m-%d %H:%M:%S", chainActive.Tip()->GetBlockTime()),
- Checkpoints::GuessVerificationProgress(chainActive.Tip()));
+ Checkpoints::GuessVerificationProgress(chainparams.Checkpoints(), chainActive.Tip()));
return true;
}
@@ -3002,7 +3310,7 @@ bool CVerifyDB::VerifyDB(CCoinsView *coinsview, int nCheckLevel, int nCheckDepth
}
}
// check level 3: check for inconsistencies during memory-only disconnect of tip blocks
- if (nCheckLevel >= 3 && pindex == pindexState && (coins.GetCacheSize() + pcoinsTip->GetCacheSize()) <= nCoinCacheSize) {
+ if (nCheckLevel >= 3 && pindex == pindexState && (coins.DynamicMemoryUsage() + pcoinsTip->DynamicMemoryUsage()) <= nCoinCacheUsage) {
bool fClean = true;
if (!DisconnectBlock(block, state, pindex, coins, &fClean))
return error("VerifyDB(): *** irrecoverable inconsistency in block data at %d, hash=%s", pindex->nHeight, pindex->GetBlockHash().ToString());
@@ -3066,6 +3374,7 @@ void UnloadBlockIndex()
delete entry.second;
}
mapBlockIndex.clear();
+ fHavePruned = false;
}
bool LoadBlockIndex()
@@ -3078,6 +3387,7 @@ bool LoadBlockIndex()
bool InitBlockIndex() {
+ const CChainParams& chainparams = Params();
LOCK(cs_main);
// Check whether we're already initialized
if (chainActive.Genesis() != NULL)
@@ -3098,7 +3408,7 @@ bool InitBlockIndex() {
CValidationState state;
if (!FindBlockPos(state, blockPos, nBlockSize+8, 0, block.GetBlockTime()))
return error("LoadBlockIndex(): FindBlockPos failed");
- if (!WriteBlockToDisk(block, blockPos))
+ if (!WriteBlockToDisk(block, blockPos, chainparams.MessageStart()))
return error("LoadBlockIndex(): writing genesis block to disk failed");
CBlockIndex *pindex = AddToBlockIndex(block);
if (!ReceivedBlockTransactions(block, state, pindex, blockPos))
@@ -3119,6 +3429,7 @@ bool InitBlockIndex() {
bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp)
{
+ const CChainParams& chainparams = Params();
// Map of disk positions for blocks with unknown parent (only used for reindex)
static std::multimap<uint256, CDiskBlockPos> mapBlocksUnknownParent;
int64_t nStart = GetTimeMillis();
@@ -3164,7 +3475,7 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp)
// detect out of order blocks, and store them for later
uint256 hash = block.GetHash();
- if (hash != Params().HashGenesisBlock() && mapBlockIndex.find(block.hashPrevBlock) == mapBlockIndex.end()) {
+ if (hash != chainparams.GetConsensus().hashGenesisBlock && mapBlockIndex.find(block.hashPrevBlock) == mapBlockIndex.end()) {
LogPrint("reindex", "%s: Out of order block %s, parent %s not known\n", __func__, hash.ToString(),
block.hashPrevBlock.ToString());
if (dbp)
@@ -3175,11 +3486,11 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp)
// process in case the block isn't known yet
if (mapBlockIndex.count(hash) == 0 || (mapBlockIndex[hash]->nStatus & BLOCK_HAVE_DATA) == 0) {
CValidationState state;
- if (ProcessNewBlock(state, NULL, &block, dbp))
+ if (ProcessNewBlock(state, NULL, &block, true, dbp))
nLoaded++;
if (state.IsError())
break;
- } else if (hash != Params().HashGenesisBlock() && mapBlockIndex[hash]->nHeight % 1000 == 0) {
+ } else if (hash != chainparams.GetConsensus().hashGenesisBlock && mapBlockIndex[hash]->nHeight % 1000 == 0) {
LogPrintf("Block Import: already had block %s at height %d\n", hash.ToString(), mapBlockIndex[hash]->nHeight);
}
@@ -3197,7 +3508,7 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp)
LogPrintf("%s: Processing out of order child %s of %s\n", __func__, block.GetHash().ToString(),
head.ToString());
CValidationState dummy;
- if (ProcessNewBlock(dummy, NULL, &block, &it->second))
+ if (ProcessNewBlock(dummy, NULL, &block, true, &it->second))
{
nLoaded++;
queue.push_back(block.GetHash());
@@ -3221,12 +3532,21 @@ bool LoadExternalBlockFile(FILE* fileIn, CDiskBlockPos *dbp)
void static CheckBlockIndex()
{
+ const Consensus::Params& consensusParams = Params().GetConsensus();
if (!fCheckBlockIndex) {
return;
}
LOCK(cs_main);
+ // During a reindex, we read the genesis block and call CheckBlockIndex before ActivateBestChain,
+ // so we have the genesis block in mapBlockIndex but no active chain. (A few of the tests when
+ // iterating the block tree require that chainActive has been initialized.)
+ if (chainActive.Height() < 0) {
+ assert(mapBlockIndex.size() <= 1);
+ return;
+ }
+
// Build forward-pointing map of the entire block tree.
std::multimap<CBlockIndex*,CBlockIndex*> forward;
for (BlockMap::iterator it = mapBlockIndex.begin(); it != mapBlockIndex.end(); it++) {
@@ -3247,6 +3567,7 @@ void static CheckBlockIndex()
int nHeight = 0;
CBlockIndex* pindexFirstInvalid = NULL; // Oldest ancestor of pindex which is invalid.
CBlockIndex* pindexFirstMissing = NULL; // Oldest ancestor of pindex which does not have BLOCK_HAVE_DATA.
+ CBlockIndex* pindexFirstNeverProcessed = NULL; // Oldest ancestor of pindex for which nTx == 0.
CBlockIndex* pindexFirstNotTreeValid = NULL; // Oldest ancestor of pindex which does not have BLOCK_VALID_TREE (regardless of being valid or not).
CBlockIndex* pindexFirstNotTransactionsValid = NULL; // Oldest ancestor of pindex which does not have BLOCK_VALID_TRANSACTIONS (regardless of being valid or not).
CBlockIndex* pindexFirstNotChainValid = NULL; // Oldest ancestor of pindex which does not have BLOCK_VALID_CHAIN (regardless of being valid or not).
@@ -3255,6 +3576,7 @@ void static CheckBlockIndex()
nNodes++;
if (pindexFirstInvalid == NULL && pindex->nStatus & BLOCK_FAILED_VALID) pindexFirstInvalid = pindex;
if (pindexFirstMissing == NULL && !(pindex->nStatus & BLOCK_HAVE_DATA)) pindexFirstMissing = pindex;
+ if (pindexFirstNeverProcessed == NULL && pindex->nTx == 0) pindexFirstNeverProcessed = pindex;
if (pindex->pprev != NULL && pindexFirstNotTreeValid == NULL && (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_TREE) pindexFirstNotTreeValid = pindex;
if (pindex->pprev != NULL && pindexFirstNotTransactionsValid == NULL && (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_TRANSACTIONS) pindexFirstNotTransactionsValid = pindex;
if (pindex->pprev != NULL && pindexFirstNotChainValid == NULL && (pindex->nStatus & BLOCK_VALID_MASK) < BLOCK_VALID_CHAIN) pindexFirstNotChainValid = pindex;
@@ -3263,14 +3585,24 @@ void static CheckBlockIndex()
// Begin: actual consistency checks.
if (pindex->pprev == NULL) {
// Genesis block checks.
- assert(pindex->GetBlockHash() == Params().HashGenesisBlock()); // Genesis block's hash must match.
+ assert(pindex->GetBlockHash() == consensusParams.hashGenesisBlock); // Genesis block's hash must match.
assert(pindex == chainActive.Genesis()); // The current active chain's genesis block must be this block.
}
- // HAVE_DATA is equivalent to VALID_TRANSACTIONS and equivalent to nTx > 0 (we stored the number of transactions in the block)
- assert(!(pindex->nStatus & BLOCK_HAVE_DATA) == (pindex->nTx == 0));
- assert(((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TRANSACTIONS) == (pindex->nTx > 0));
- // All parents having data is equivalent to all parents being VALID_TRANSACTIONS, which is equivalent to nChainTx being set.
- assert((pindexFirstMissing != NULL) == (pindex->nChainTx == 0)); // nChainTx == 0 is used to signal that all parent block's transaction data is available.
+ if (pindex->nChainTx == 0) assert(pindex->nSequenceId == 0); // nSequenceId can't be set for blocks that aren't linked
+ // VALID_TRANSACTIONS is equivalent to nTx > 0 for all nodes (whether or not pruning has occurred).
+ // HAVE_DATA is only equivalent to nTx > 0 (or VALID_TRANSACTIONS) if no pruning has occurred.
+ if (!fHavePruned) {
+ // If we've never pruned, then HAVE_DATA should be equivalent to nTx > 0
+ assert(!(pindex->nStatus & BLOCK_HAVE_DATA) == (pindex->nTx == 0));
+ assert(pindexFirstMissing == pindexFirstNeverProcessed);
+ } else {
+ // If we have pruned, then we can only say that HAVE_DATA implies nTx > 0
+ if (pindex->nStatus & BLOCK_HAVE_DATA) assert(pindex->nTx > 0);
+ }
+ if (pindex->nStatus & BLOCK_HAVE_UNDO) assert(pindex->nStatus & BLOCK_HAVE_DATA);
+ assert(((pindex->nStatus & BLOCK_VALID_MASK) >= BLOCK_VALID_TRANSACTIONS) == (pindex->nTx > 0)); // This is pruning-independent.
+ // All parents having had data (at some point) is equivalent to all parents being VALID_TRANSACTIONS, which is equivalent to nChainTx being set.
+ assert((pindexFirstNeverProcessed != NULL) == (pindex->nChainTx == 0)); // nChainTx != 0 is used to signal that all parent blocks have been processed (but may have been pruned).
assert((pindexFirstNotTransactionsValid != NULL) == (pindex->nChainTx == 0));
assert(pindex->nHeight == nHeight); // nHeight must be consistent.
assert(pindex->pprev == NULL || pindex->nChainWork >= pindex->pprev->nChainWork); // For every block except the genesis block, the chainwork must be larger than the parent's.
@@ -3283,11 +3615,20 @@ void static CheckBlockIndex()
// Checks for not-invalid blocks.
assert((pindex->nStatus & BLOCK_FAILED_MASK) == 0); // The failed mask cannot be set for blocks without invalid parents.
}
- if (!CBlockIndexWorkComparator()(pindex, chainActive.Tip()) && pindexFirstMissing == NULL) {
- if (pindexFirstInvalid == NULL) { // If this block sorts at least as good as the current tip and is valid, it must be in setBlockIndexCandidates.
- assert(setBlockIndexCandidates.count(pindex));
+ if (!CBlockIndexWorkComparator()(pindex, chainActive.Tip()) && pindexFirstNeverProcessed == NULL) {
+ if (pindexFirstInvalid == NULL) {
+ // If this block sorts at least as good as the current tip and
+ // is valid and we have all data for its parents, it must be in
+ // setBlockIndexCandidates. chainActive.Tip() must also be there
+ // even if some data has been pruned.
+ if (pindexFirstMissing == NULL || pindex == chainActive.Tip()) {
+ assert(setBlockIndexCandidates.count(pindex));
+ }
+ // If some parent is missing, then it could be that this block was in
+ // setBlockIndexCandidates but had to be removed because of the missing data.
+ // In this case it must be in mapBlocksUnlinked -- see test below.
}
- } else { // If this block sorts worse than the current tip, it cannot be in setBlockIndexCandidates.
+ } else { // If this block sorts worse than the current tip or some ancestor's block has never been seen, it cannot be in setBlockIndexCandidates.
assert(setBlockIndexCandidates.count(pindex) == 0);
}
// Check whether this block is in mapBlocksUnlinked.
@@ -3301,12 +3642,28 @@ void static CheckBlockIndex()
}
rangeUnlinked.first++;
}
- if (pindex->pprev && pindex->nStatus & BLOCK_HAVE_DATA && pindexFirstMissing != NULL) {
- if (pindexFirstInvalid == NULL) { // If this block has block data available, some parent doesn't, and has no invalid parents, it must be in mapBlocksUnlinked.
- assert(foundInUnlinked);
+ if (pindex->pprev && (pindex->nStatus & BLOCK_HAVE_DATA) && pindexFirstNeverProcessed != NULL && pindexFirstInvalid == NULL) {
+ // If this block has block data available, some parent was never received, and has no invalid parents, it must be in mapBlocksUnlinked.
+ assert(foundInUnlinked);
+ }
+ if (!(pindex->nStatus & BLOCK_HAVE_DATA)) assert(!foundInUnlinked); // Can't be in mapBlocksUnlinked if we don't HAVE_DATA
+ if (pindexFirstMissing == NULL) assert(!foundInUnlinked); // We aren't missing data for any parent -- cannot be in mapBlocksUnlinked.
+ if (pindex->pprev && (pindex->nStatus & BLOCK_HAVE_DATA) && pindexFirstNeverProcessed == NULL && pindexFirstMissing != NULL) {
+ // We HAVE_DATA for this block, have received data for all parents at some point, but we're currently missing data for some parent.
+ assert(fHavePruned); // We must have pruned.
+ // This block may have entered mapBlocksUnlinked if:
+ // - it has a descendant that at some point had more work than the
+ // tip, and
+ // - we tried switching to that descendant but were missing
+ // data for some intermediate block between chainActive and the
+ // tip.
+ // So if this block is itself better than chainActive.Tip() and it wasn't in
+ // setBlockIndexCandidates, then it must be in mapBlocksUnlinked.
+ if (!CBlockIndexWorkComparator()(pindex, chainActive.Tip()) && setBlockIndexCandidates.count(pindex) == 0) {
+ if (pindexFirstInvalid == NULL) {
+ assert(foundInUnlinked);
+ }
}
- } else { // If this block does not have block data available, or all parents do, it cannot be in mapBlocksUnlinked.
- assert(!foundInUnlinked);
}
// assert(pindex->GetBlockHash() == pindex->GetBlockHeader().GetHash()); // Perhaps too slow
// End: actual consistency checks.
@@ -3326,6 +3683,7 @@ void static CheckBlockIndex()
// If pindex was the first with a certain property, unset the corresponding variable.
if (pindex == pindexFirstInvalid) pindexFirstInvalid = NULL;
if (pindex == pindexFirstMissing) pindexFirstMissing = NULL;
+ if (pindex == pindexFirstNeverProcessed) pindexFirstNeverProcessed = NULL;
if (pindex == pindexFirstNotTreeValid) pindexFirstNotTreeValid = NULL;
if (pindex == pindexFirstNotTransactionsValid) pindexFirstNotTransactionsValid = NULL;
if (pindex == pindexFirstNotChainValid) pindexFirstNotChainValid = NULL;
@@ -3362,7 +3720,7 @@ void static CheckBlockIndex()
// CAlert
//
-string GetWarnings(string strFor)
+std::string GetWarnings(const std::string& strFor)
{
int nPriority = 0;
string strStatusBar;
@@ -3445,7 +3803,6 @@ bool static AlreadyHave(const CInv& inv)
return true;
}
-
void static ProcessGetData(CNode* pfrom)
{
std::deque<CInv>::iterator it = pfrom->vRecvGetData.begin();
@@ -3473,17 +3830,21 @@ void static ProcessGetData(CNode* pfrom)
if (chainActive.Contains(mi->second)) {
send = true;
} else {
+ static const int nOneMonth = 30 * 24 * 60 * 60;
// To prevent fingerprinting attacks, only send blocks outside of the active
- // chain if they are valid, and no more than a month older than the best header
- // chain we know about.
+ // chain if they are valid, and no more than a month older (both in time, and in
+ // best equivalent proof of work) than the best header chain we know about.
send = mi->second->IsValid(BLOCK_VALID_SCRIPTS) && (pindexBestHeader != NULL) &&
- (mi->second->GetBlockTime() > pindexBestHeader->GetBlockTime() - 30 * 24 * 60 * 60);
+ (pindexBestHeader->GetBlockTime() - mi->second->GetBlockTime() < nOneMonth) &&
+ (GetBlockProofEquivalentTime(*pindexBestHeader, *mi->second, *pindexBestHeader, Params().GetConsensus()) < nOneMonth);
if (!send) {
- LogPrintf("ProcessGetData(): ignoring request from peer=%i for old block that isn't in the main chain\n", pfrom->GetId());
+ LogPrintf("%s: ignoring request from peer=%i for old block that isn't in the main chain\n", __func__, pfrom->GetId());
}
}
}
- if (send)
+ // Pruned nodes may have deleted the block, so check whether
+ // it's available before trying to send.
+ if (send && (mi->second->nStatus & BLOCK_HAVE_DATA))
{
// Send block from disk
CBlock block;
@@ -3500,7 +3861,7 @@ void static ProcessGetData(CNode* pfrom)
pfrom->PushMessage("merkleblock", merkleBlock);
// CMerkleBlock just contains hashes, so also push any transactions in the block the client did not see
// This avoids hurting performance by pointlessly requiring a round-trip
- // Note that there is currently no way for a node to request any single transactions we didnt send here -
+ // Note that there is currently no way for a node to request any single transactions we didn't send here -
// they must either disconnect and retry or request the full block.
// Thus, the protocol spec specified allows for us to provide duplicate txn here,
// however we MUST always provide at least what the remote peer needs
@@ -3513,7 +3874,7 @@ void static ProcessGetData(CNode* pfrom)
// no response
}
- // Trigger them to send a getblocks request for the next batch of inventory
+ // Trigger the peer node to send a getblocks request for the next batch of inventory
if (inv.hash == pfrom->hashContinue)
{
// Bypass PushInventory, this must send even if redundant,
@@ -3577,6 +3938,7 @@ void static ProcessGetData(CNode* pfrom)
bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv, int64_t nTimeReceived)
{
+ const CChainParams& chainparams = Params();
RandAddSeedPerfmon();
LogPrint("net", "received: %s (%u bytes) peer=%d\n", SanitizeString(strCommand), vRecv.size(), pfrom->id);
if (mapArgs.count("-dropmessagestest") && GetRand(atoi(mapArgs["-dropmessagestest"])) == 0)
@@ -3761,7 +4123,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
{
LOCK(cs_vNodes);
// Use deterministic randomness to send to the same nodes for 24 hours
- // at a time so the setAddrKnowns of the chosen nodes prevent repeats
+ // at a time so the addrKnowns of the chosen nodes prevent repeats
static uint256 hashSalt;
if (hashSalt.IsNull())
hashSalt = GetRandHash();
@@ -3826,7 +4188,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
if (inv.type == MSG_BLOCK) {
UpdateBlockAvailability(pfrom->GetId(), inv.hash);
if (!fAlreadyHave && !fImporting && !fReindex && !mapBlocksInFlight.count(inv.hash)) {
- // First request the headers preceeding the announced block. In the normal fully-synced
+ // First request the headers preceding the announced block. In the normal fully-synced
// case where a new block is announced that succeeds the current tip (no reorganization),
// there are no such headers.
// Secondly, and only when we are close to being synced, we request the announced block directly,
@@ -3836,12 +4198,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// not a direct successor.
pfrom->PushMessage("getheaders", chainActive.GetLocator(pindexBestHeader), inv.hash);
CNodeState *nodestate = State(pfrom->GetId());
- if (chainActive.Tip()->GetBlockTime() > GetAdjustedTime() - Params().TargetSpacing() * 20 &&
+ if (chainActive.Tip()->GetBlockTime() > GetAdjustedTime() - chainparams.GetConsensus().nPowTargetSpacing * 20 &&
nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
vToFetch.push_back(inv);
// Mark block as in flight already, even though the actual "getdata" message only goes out
// later (within the same cs_main lock, though).
- MarkBlockAsInFlight(pfrom->GetId(), inv.hash);
+ MarkBlockAsInFlight(pfrom->GetId(), inv.hash, chainparams.GetConsensus());
}
LogPrint("net", "getheaders (%d) %s to peer=%d\n", pindexBestHeader->nHeight, inv.hash.ToString(), pfrom->id);
}
@@ -3908,8 +4270,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
pfrom->PushInventory(CInv(MSG_BLOCK, pindex->GetBlockHash()));
if (--nLimit <= 0)
{
- // When this block is requested, we'll send an inv that'll make them
- // getblocks the next batch of inventory.
+ // When this block is requested, we'll send an inv that'll
+ // trigger the peer to getblocks the next batch of inventory.
LogPrint("net", " getblocks stopping at limit %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
pfrom->hashContinue = pindex->GetBlockHash();
break;
@@ -3926,6 +4288,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
LOCK(cs_main);
+ if (IsInitialBlockDownload())
+ return true;
+
CBlockIndex* pindex = NULL;
if (locator.IsNull())
{
@@ -3979,7 +4344,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
mempool.check(pcoinsTip);
RelayTransaction(tx);
vWorkQueue.push_back(inv.hash);
- vEraseQueue.push_back(inv.hash);
LogPrint("mempool", "AcceptToMemoryPool: peer=%d %s: accepted %s (poolsz %u)\n",
pfrom->id, pfrom->cleanSubVer,
@@ -4006,7 +4370,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// anyone relaying LegitTxX banned)
CValidationState stateDummy;
- vEraseQueue.push_back(orphanHash);
if (setMisbehaving.count(fromPeer))
continue;
@@ -4015,6 +4378,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
LogPrint("mempool", " accepted orphan tx %s\n", orphanHash.ToString());
RelayTransaction(orphanTx);
vWorkQueue.push_back(orphanHash);
+ vEraseQueue.push_back(orphanHash);
}
else if (!fMissingInputs2)
{
@@ -4026,8 +4390,10 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
setMisbehaving.insert(fromPeer);
LogPrint("mempool", " invalid orphan tx %s\n", orphanHash.ToString());
}
- // too-little-fee orphan
+ // Has inputs but not accepted to mempool
+ // Probably non-standard or insufficient fee/priority
LogPrint("mempool", " removed orphan tx %s\n", orphanHash.ToString());
+ vEraseQueue.push_back(orphanHash);
}
mempool.check(pcoinsTip);
}
@@ -4130,7 +4496,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
pfrom->AddInventoryKnown(inv);
CValidationState state;
- ProcessNewBlock(state, pfrom, &block);
+ // Process all blocks from whitelisted peers, even if not requested.
+ ProcessNewBlock(state, pfrom, &block, pfrom->fWhitelisted, NULL);
int nDoS;
if (state.IsInvalid(nDoS)) {
pfrom->PushMessage("reject", strCommand, state.GetRejectCode(),
@@ -4146,9 +4513,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// This asymmetric behavior for inbound and outbound connections was introduced
// to prevent a fingerprinting attack: an attacker can send specific fake addresses
- // to users' AddrMan and later request them by sending getaddr messages.
- // Making users (which are behind NAT and can only make outgoing connections) ignore
- // getaddr message mitigates the attack.
+ // to users' AddrMan and later request them by sending getaddr messages.
+ // Making nodes which are behind NAT and can only make outgoing connections ignore
+ // the getaddr message mitigates the attack.
else if ((strCommand == "getaddr") && (pfrom->fInbound))
{
pfrom->vAddrToSend.clear();
@@ -4233,7 +4600,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// Nonce mismatches are normal when pings are overlapping
sProblem = "Nonce mismatch";
if (nonce == 0) {
- // This is most likely a bug in another implementation somewhere, cancel this ping
+ // This is most likely a bug in another implementation somewhere; cancel this ping
bPingFinished = true;
sProblem = "Nonce zero";
}
@@ -4242,7 +4609,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
sProblem = "Unsolicited pong without ping";
}
} else {
- // This is most likely a bug in another implementation somewhere, cancel this ping
+ // This is most likely a bug in another implementation somewhere; cancel this ping
bPingFinished = true;
sProblem = "Short payload";
}
@@ -4262,7 +4629,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
- else if (strCommand == "alert")
+ else if (fAlerts && strCommand == "alert")
{
CAlert alert;
vRecv >> alert;
@@ -4380,7 +4747,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
bool ProcessMessages(CNode* pfrom)
{
//if (fDebug)
- // LogPrintf("ProcessMessages(%u messages)\n", pfrom->vRecvMsg.size());
+ // LogPrintf("%s(%u messages)\n", __func__, pfrom->vRecvMsg.size());
//
// Message format
@@ -4408,7 +4775,7 @@ bool ProcessMessages(CNode* pfrom)
CNetMessage& msg = *it;
//if (fDebug)
- // LogPrintf("ProcessMessages(message %u msgsz, %u bytes, complete:%s)\n",
+ // LogPrintf("%s(message %u msgsz, %u bytes, complete:%s)\n", __func__,
// msg.hdr.nMessageSize, msg.vRecv.size(),
// msg.complete() ? "Y" : "N");
@@ -4444,7 +4811,7 @@ bool ProcessMessages(CNode* pfrom)
unsigned int nChecksum = ReadLE32((unsigned char*)&hash);
if (nChecksum != hdr.nChecksum)
{
- LogPrintf("ProcessMessages(%s, %u bytes): CHECKSUM ERROR nChecksum=%08x hdr.nChecksum=%08x\n",
+ LogPrintf("%s(%s, %u bytes): CHECKSUM ERROR nChecksum=%08x hdr.nChecksum=%08x\n", __func__,
SanitizeString(strCommand), nMessageSize, nChecksum, hdr.nChecksum);
continue;
}
@@ -4462,12 +4829,12 @@ bool ProcessMessages(CNode* pfrom)
if (strstr(e.what(), "end of data"))
{
// Allow exceptions from under-length message on vRecv
- LogPrintf("ProcessMessages(%s, %u bytes): Exception '%s' caught, normally caused by a message being shorter than its stated length\n", SanitizeString(strCommand), nMessageSize, e.what());
+ LogPrintf("%s(%s, %u bytes): Exception '%s' caught, normally caused by a message being shorter than its stated length\n", __func__, SanitizeString(strCommand), nMessageSize, e.what());
}
else if (strstr(e.what(), "size too large"))
{
// Allow exceptions from over-long size
- LogPrintf("ProcessMessages(%s, %u bytes): Exception '%s' caught\n", SanitizeString(strCommand), nMessageSize, e.what());
+ LogPrintf("%s(%s, %u bytes): Exception '%s' caught\n", __func__, SanitizeString(strCommand), nMessageSize, e.what());
}
else
{
@@ -4484,7 +4851,7 @@ bool ProcessMessages(CNode* pfrom)
}
if (!fRet)
- LogPrintf("ProcessMessage(%s, %u bytes) FAILED peer=%d\n", SanitizeString(strCommand), nMessageSize, pfrom->id);
+ LogPrintf("%s(%s, %u bytes) FAILED peer=%d\n", __func__, SanitizeString(strCommand), nMessageSize, pfrom->id);
break;
}
@@ -4499,8 +4866,9 @@ bool ProcessMessages(CNode* pfrom)
bool SendMessages(CNode* pto, bool fSendTrickle)
{
+ const Consensus::Params& consensusParams = Params().GetConsensus();
{
- // Don't send anything until we get their version message
+ // Don't send anything until we get its version message
if (pto->nVersion == 0)
return true;
@@ -4544,9 +4912,9 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
{
- // Periodically clear setAddrKnown to allow refresh broadcasts
+ // Periodically clear addrKnown to allow refresh broadcasts
if (nLastRebroadcast)
- pnode->setAddrKnown.clear();
+ pnode->addrKnown.clear();
// Rebroadcast our address
AdvertizeLocal(pnode);
@@ -4564,9 +4932,9 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
vAddr.reserve(pto->vAddrToSend.size());
BOOST_FOREACH(const CAddress& addr, pto->vAddrToSend)
{
- // returns true if wasn't already contained in the set
- if (pto->setAddrKnown.insert(addr).second)
+ if (!pto->addrKnown.contains(addr.GetKey()))
{
+ pto->addrKnown.insert(addr.GetKey());
vAddr.push_back(addr);
// receiver rejects addr messages larger than 1000
if (vAddr.size() >= 1000)
@@ -4605,9 +4973,9 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
if (pindexBestHeader == NULL)
pindexBestHeader = chainActive.Tip();
bool fFetch = state.fPreferredDownload || (nPreferredDownload == 0 && !pto->fClient && !pto->fOneShot); // Download if this is a nice peer, or we have no nice peers and this one might do.
- if (!state.fSyncStarted && !pto->fClient && fFetch && !fImporting && !fReindex) {
+ if (!state.fSyncStarted && !pto->fClient && !fImporting && !fReindex) {
// Only actively request headers from a single peer, unless we're close to today.
- if (nSyncStarted == 0 || pindexBestHeader->GetBlockTime() > GetAdjustedTime() - 24 * 60 * 60) {
+ if ((nSyncStarted == 0 && fFetch) || pindexBestHeader->GetBlockTime() > GetAdjustedTime() - 24 * 60 * 60) {
state.fSyncStarted = true;
nSyncStarted++;
CBlockIndex *pindexStart = pindexBestHeader->pprev ? pindexBestHeader->pprev : pindexBestHeader;
@@ -4684,24 +5052,37 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
// In case there is a block that has been in flight from this peer for (2 + 0.5 * N) times the block interval
// (with N the number of validated blocks that were in flight at the time it was requested), disconnect due to
// timeout. We compensate for in-flight blocks to prevent killing off peers due to our own downstream link
- // being saturated. We only count validated in-flight blocks so peers can't advertize nonexisting block hashes
+ // being saturated. We only count validated in-flight blocks so peers can't advertise non-existing block hashes
// to unreasonably increase our timeout.
- if (!pto->fDisconnect && state.vBlocksInFlight.size() > 0 && state.vBlocksInFlight.front().nTime < nNow - 500000 * Params().TargetSpacing() * (4 + state.vBlocksInFlight.front().nValidatedQueuedBefore)) {
- LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", state.vBlocksInFlight.front().hash.ToString(), pto->id);
- pto->fDisconnect = true;
+ // We also compare the block download timeout originally calculated against the time at which we'd disconnect
+ // if we assumed the block were being requested now (ignoring blocks we've requested from this peer, since we're
+ // only looking at this peer's oldest request). This way a large queue in the past doesn't result in a
+ // permanently large window for this block to be delivered (ie if the number of blocks in flight is decreasing
+ // more quickly than once every 5 minutes, then we'll shorten the download window for this block).
+ if (!pto->fDisconnect && state.vBlocksInFlight.size() > 0) {
+ QueuedBlock &queuedBlock = state.vBlocksInFlight.front();
+ int64_t nTimeoutIfRequestedNow = GetBlockTimeout(nNow, nQueuedValidatedHeaders - state.nBlocksInFlightValidHeaders, consensusParams);
+ if (queuedBlock.nTimeDisconnect > nTimeoutIfRequestedNow) {
+ LogPrint("net", "Reducing block download timeout for peer=%d block=%s, orig=%d new=%d\n", pto->id, queuedBlock.hash.ToString(), queuedBlock.nTimeDisconnect, nTimeoutIfRequestedNow);
+ queuedBlock.nTimeDisconnect = nTimeoutIfRequestedNow;
+ }
+ if (queuedBlock.nTimeDisconnect < nNow) {
+ LogPrintf("Timeout downloading block %s from peer=%d, disconnecting\n", queuedBlock.hash.ToString(), pto->id);
+ pto->fDisconnect = true;
+ }
}
//
// Message: getdata (blocks)
//
vector<CInv> vGetData;
- if (!pto->fDisconnect && !pto->fClient && fFetch && state.nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
+ if (!pto->fDisconnect && !pto->fClient && (fFetch || !IsInitialBlockDownload()) && state.nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
vector<CBlockIndex*> vToDownload;
NodeId staller = -1;
FindNextBlocksToDownload(pto->GetId(), MAX_BLOCKS_IN_TRANSIT_PER_PEER - state.nBlocksInFlight, vToDownload, staller);
BOOST_FOREACH(CBlockIndex *pindex, vToDownload) {
vGetData.push_back(CInv(MSG_BLOCK, pindex->GetBlockHash()));
- MarkBlockAsInFlight(pto->GetId(), pindex->GetBlockHash(), pindex);
+ MarkBlockAsInFlight(pto->GetId(), pindex->GetBlockHash(), consensusParams, pindex);
LogPrint("net", "Requesting block %s (%d) peer=%d\n", pindex->GetBlockHash().ToString(),
pindex->nHeight, pto->id);
}
diff --git a/src/main.h b/src/main.h
index bb6fd6f204..43bc4031f1 100644
--- a/src/main.h
+++ b/src/main.h
@@ -14,9 +14,10 @@
#include "chain.h"
#include "chainparams.h"
#include "coins.h"
+#include "consensus/consensus.h"
+#include "net.h"
#include "primitives/block.h"
#include "primitives/transaction.h"
-#include "net.h"
#include "script/script.h"
#include "script/sigcache.h"
#include "script/standard.h"
@@ -51,10 +52,10 @@ static const unsigned int DEFAULT_BLOCK_MAX_SIZE = 750000;
static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0;
/** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/
static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 50000;
+/** Default for accepting alerts from the P2P network. */
+static const bool DEFAULT_ALERTS = true;
/** The maximum size for transactions we're willing to relay/mine */
static const unsigned int MAX_STANDARD_TX_SIZE = 100000;
-/** The maximum allowed number of signature check operations in a block (network rule) */
-static const unsigned int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
/** Maximum number of signature check operations in an IsStandard() P2SH script */
static const unsigned int MAX_P2SH_SIGOPS = 15;
/** The maximum number of sigops we're willing to relay/mine in a single tx */
@@ -67,10 +68,6 @@ static const unsigned int MAX_BLOCKFILE_SIZE = 0x8000000; // 128 MiB
static const unsigned int BLOCKFILE_CHUNK_SIZE = 0x1000000; // 16 MiB
/** The pre-allocation chunk size for rev?????.dat files (since 0.8) */
static const unsigned int UNDOFILE_CHUNK_SIZE = 0x100000; // 1 MiB
-/** Coinbase transaction outputs can only be spent after this number of new blocks (network rule) */
-static const int COINBASE_MATURITY = 100;
-/** Threshold for nLockTime: below this value it is interpreted as block number, otherwise as UNIX timestamp. */
-static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
/** Maximum number of script-checking threads allowed */
static const int MAX_SCRIPTCHECK_THREADS = 16;
/** -par default (number of script-checking threads, 0 = auto) */
@@ -80,28 +77,20 @@ static const int MAX_BLOCKS_IN_TRANSIT_PER_PEER = 16;
/** Timeout in seconds during which a peer must stall block download progress before being disconnected. */
static const unsigned int BLOCK_STALLING_TIMEOUT = 2;
/** Number of headers sent in one getheaders result. We rely on the assumption that if a peer sends
- * less than this number, we reached their tip. Changing this value is a protocol upgrade. */
+ * less than this number, we reached its tip. Changing this value is a protocol upgrade. */
static const unsigned int MAX_HEADERS_RESULTS = 2000;
/** Size of the "block download window": how far ahead of our current height do we fetch?
* Larger windows tolerate larger download speed differences between peer, but increase the potential
* degree of disordering of blocks on disk (which make reindexing and in the future perhaps pruning
* harder). We'll probably want to make this a per-peer adaptive value at some point. */
static const unsigned int BLOCK_DOWNLOAD_WINDOW = 1024;
-/** Time to wait (in seconds) between writing blockchain state to disk. */
-static const unsigned int DATABASE_WRITE_INTERVAL = 3600;
+/** Time to wait (in seconds) between writing blocks/block index to disk. */
+static const unsigned int DATABASE_WRITE_INTERVAL = 60 * 60;
+/** Time to wait (in seconds) between flushing chainstate to disk. */
+static const unsigned int DATABASE_FLUSH_INTERVAL = 24 * 60 * 60;
/** Maximum length of reject messages. */
static const unsigned int MAX_REJECT_MESSAGE_LENGTH = 111;
-/** "reject" message codes */
-static const unsigned char REJECT_MALFORMED = 0x01;
-static const unsigned char REJECT_INVALID = 0x10;
-static const unsigned char REJECT_OBSOLETE = 0x11;
-static const unsigned char REJECT_DUPLICATE = 0x12;
-static const unsigned char REJECT_NONSTANDARD = 0x40;
-static const unsigned char REJECT_DUST = 0x41;
-static const unsigned char REJECT_INSUFFICIENTFEE = 0x42;
-static const unsigned char REJECT_CHECKPOINT = 0x43;
-
struct BlockHasher
{
size_t operator()(const uint256& hash) const { return hash.GetCheapHash(); }
@@ -123,8 +112,10 @@ extern int nScriptCheckThreads;
extern bool fTxIndex;
extern bool fIsBareMultisigStd;
extern bool fCheckBlockIndex;
-extern unsigned int nCoinCacheSize;
+extern bool fCheckpointsEnabled;
+extern size_t nCoinCacheUsage;
extern CFeeRate minRelayTxFee;
+extern bool fAlerts;
/** Best header we've seen so far (used for getheaders queries' starting points). */
extern CBlockIndex *pindexBestHeader;
@@ -132,6 +123,26 @@ extern CBlockIndex *pindexBestHeader;
/** Minimum disk space required - used in CheckDiskSpace() */
static const uint64_t nMinDiskSpace = 52428800;
+/** Pruning-related variables and constants */
+/** True if any block files have ever been pruned. */
+extern bool fHavePruned;
+/** True if we're running in -prune mode. */
+extern bool fPruneMode;
+/** Number of MiB of block files that we're trying to stay below. */
+extern uint64_t nPruneTarget;
+/** Block files containing a block-height within MIN_BLOCKS_TO_KEEP of chainActive.Tip() will not be pruned. */
+static const unsigned int MIN_BLOCKS_TO_KEEP = 288;
+
+// Require that user allocate at least 550MB for block & undo files (blk???.dat and rev???.dat)
+// At 1MB per block, 288 blocks = 288MB.
+// Add 15% for Undo data = 331MB
+// Add 20% for Orphan block rate = 397MB
+// We want the low water mark after pruning to be at least 397 MB and since we prune in
+// full block file chunks, we need the high water mark which triggers the prune to be
+// one 128MB block file + added 15% undo data = 147MB greater for a total of 545MB
+// Setting the target to > than 550MB will make it likely we can respect the target.
+static const uint64_t MIN_DISK_SPACE_FOR_BLOCK_FILES = 550 * 1024 * 1024;
+
/** Register with a network node to receive its signals */
void RegisterNodeSignals(CNodeSignals& nodeSignals);
/** Unregister a network node */
@@ -145,10 +156,11 @@ void UnregisterNodeSignals(CNodeSignals& nodeSignals);
* @param[out] state This may be set to an Error state if any error occurred processing it, including during validation/connection/etc of otherwise unrelated blocks during reorganisation; or it may be set to an Invalid state if pblock is itself invalid (but this is not guaranteed even when the block is checked). If you want to *possibly* get feedback on whether pblock is valid, you must also install a CValidationInterface (see validationinterface.h) - this will have its BlockChecked method called whenever *any* block completes validation.
* @param[in] pfrom The node which we are receiving the block from; it is added to mapBlockSource and may be penalised if the block is invalid.
* @param[in] pblock The block we want to process.
+ * @param[in] fForceProcessing Process this block even if unrequested; used for non-network block sources and whitelisted peers.
* @param[out] dbp If pblock is stored to disk (or already there), this will be set to its location.
* @return True if state.IsValid()
*/
-bool ProcessNewBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, CDiskBlockPos *dbp = NULL);
+bool ProcessNewBlock(CValidationState &state, CNode* pfrom, CBlock* pblock, bool fForceProcessing, CDiskBlockPos *dbp);
/** Check whether enough disk space is available for an incoming block */
bool CheckDiskSpace(uint64_t nAdditionalBytes = 0);
/** Open a block file (blk?????.dat) */
@@ -176,27 +188,50 @@ bool ProcessMessages(CNode* pfrom);
bool SendMessages(CNode* pto, bool fSendTrickle);
/** Run an instance of the script checking thread */
void ThreadScriptCheck();
+/** Try to detect Partition (network isolation) attacks against us */
+void PartitionCheck(bool (*initialDownloadCheck)(), CCriticalSection& cs, const CBlockIndex *const &bestHeader, int64_t nPowTargetSpacing);
/** Check whether we are doing an initial block download (synchronizing from disk or network) */
bool IsInitialBlockDownload();
/** Format a string that describes several potential problems detected by the core */
-std::string GetWarnings(std::string strFor);
+std::string GetWarnings(const std::string& strFor);
/** Retrieve a transaction (from memory pool, or from disk, if possible) */
bool GetTransaction(const uint256 &hash, CTransaction &tx, uint256 &hashBlock, bool fAllowSlow = false);
/** Find the best known block, and make it the tip of the block chain */
bool ActivateBestChain(CValidationState &state, CBlock *pblock = NULL);
-CAmount GetBlockValue(int nHeight, const CAmount& nFees);
+CAmount GetBlockSubsidy(int nHeight, const Consensus::Params& consensusParams);
+
+/**
+ * Prune block and undo files (blk???.dat and undo???.dat) so that the disk space used is less than a user-defined target.
+ * The user sets the target (in MB) on the command line or in config file. This will be run on startup and whenever new
+ * space is allocated in a block or undo file, staying below the target. Changing back to unpruned requires a reindex
+ * (which in this case means the blockchain must be re-downloaded.)
+ *
+ * Pruning functions are called from FlushStateToDisk when the global fCheckForPruning flag has been set.
+ * Block and undo files are deleted in lock-step (when blk00003.dat is deleted, so is rev00003.dat.)
+ * Pruning cannot take place until the longest chain is at least a certain length (100000 on mainnet, 1000 on testnet, 10 on regtest).
+ * Pruning will never delete a block within a defined distance (currently 288) from the active chain's tip.
+ * The block index is updated by unsetting HAVE_DATA and HAVE_UNDO for any blocks that were stored in the deleted files.
+ * A db flag records the fact that at least some block files have been pruned.
+ *
+ * @param[out] setFilesToPrune The set of file indices that can be unlinked will be returned
+ */
+void FindFilesToPrune(std::set<int>& setFilesToPrune);
+
+/**
+ * Actually unlink the specified files
+ */
+void UnlinkPrunedFiles(std::set<int>& setFilesToPrune);
/** Create a new block index entry for a given block hash */
CBlockIndex * InsertBlockIndex(uint256 hash);
-/** Abort with a message */
-bool AbortNode(const std::string &msg, const std::string &userMessage="");
/** Get statistics from node state */
bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats);
/** Increase a node's misbehavior score. */
void Misbehaving(NodeId nodeid, int howmuch);
/** Flush all state, indexes and buffers to disk. */
void FlushStateToDisk();
-
+/** Prune block files and flush state to disk. */
+void PruneAndFlush();
/** (try to) add transaction to memory pool **/
bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,
@@ -293,7 +328,18 @@ bool CheckTransaction(const CTransaction& tx, CValidationState& state);
*/
bool IsStandardTx(const CTransaction& tx, std::string& reason);
-bool IsFinalTx(const CTransaction &tx, int nBlockHeight = 0, int64_t nBlockTime = 0);
+/**
+ * Check if transaction is final and can be included in a block with the
+ * specified height and time. Consensus critical.
+ */
+bool IsFinalTx(const CTransaction &tx, int nBlockHeight, int64_t nBlockTime);
+
+/**
+ * Check if transaction will be final in the next block to be created.
+ *
+ * Calls IsFinalTx() with current block height and appropriate block time.
+ */
+bool CheckFinalTx(const CTransaction &tx);
/**
* Closure representing one script verification
@@ -331,7 +377,7 @@ public:
/** Functions for disk access for blocks */
-bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos);
+bool WriteBlockToDisk(CBlock& block, CDiskBlockPos& pos, const CMessageHeader::MessageStartChars& messageStart);
bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos);
bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex);
@@ -358,8 +404,8 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn
/** Check a block is completely valid from start to finish (only works on top of our current best block, with cs_main held) */
bool TestBlockValidity(CValidationState &state, const CBlock& block, CBlockIndex *pindexPrev, bool fCheckPOW = true, bool fCheckMerkleRoot = true);
-/** Store block on disk. If dbp is provided, the file is known to already reside on disk */
-bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex **pindex, CDiskBlockPos* dbp = NULL);
+/** Store block on disk. If dbp is non-NULL, the file is known to already reside on disk */
+bool AcceptBlock(CBlock& block, CValidationState& state, CBlockIndex **pindex, bool fRequested, CDiskBlockPos* dbp);
bool AcceptBlockHeader(const CBlockHeader& block, CValidationState& state, CBlockIndex **ppindex= NULL);
@@ -418,69 +464,6 @@ public:
}
};
-/** Capture information about block/transaction validation */
-class CValidationState {
-private:
- enum mode_state {
- MODE_VALID, //! everything ok
- MODE_INVALID, //! network rule violation (DoS value may be set)
- MODE_ERROR, //! run-time error
- } mode;
- int nDoS;
- std::string strRejectReason;
- unsigned char chRejectCode;
- bool corruptionPossible;
-public:
- CValidationState() : mode(MODE_VALID), nDoS(0), chRejectCode(0), corruptionPossible(false) {}
- bool DoS(int level, bool ret = false,
- unsigned char chRejectCodeIn=0, std::string strRejectReasonIn="",
- bool corruptionIn=false) {
- chRejectCode = chRejectCodeIn;
- strRejectReason = strRejectReasonIn;
- corruptionPossible = corruptionIn;
- if (mode == MODE_ERROR)
- return ret;
- nDoS += level;
- mode = MODE_INVALID;
- return ret;
- }
- bool Invalid(bool ret = false,
- unsigned char _chRejectCode=0, std::string _strRejectReason="") {
- return DoS(0, ret, _chRejectCode, _strRejectReason);
- }
- bool Error(std::string strRejectReasonIn="") {
- if (mode == MODE_VALID)
- strRejectReason = strRejectReasonIn;
- mode = MODE_ERROR;
- return false;
- }
- bool Abort(const std::string &msg) {
- AbortNode(msg);
- return Error(msg);
- }
- bool IsValid() const {
- return mode == MODE_VALID;
- }
- bool IsInvalid() const {
- return mode == MODE_INVALID;
- }
- bool IsError() const {
- return mode == MODE_ERROR;
- }
- bool IsInvalid(int &nDoSOut) const {
- if (IsInvalid()) {
- nDoSOut = nDoS;
- return true;
- }
- return false;
- }
- bool CorruptionPossible() const {
- return corruptionPossible;
- }
- unsigned char GetRejectCode() const { return chRejectCode; }
- std::string GetRejectReason() const { return strRejectReason; }
-};
-
/** RAII wrapper for VerifyDB: Verify consistency of the block and coin databases */
class CVerifyDB {
public:
@@ -507,4 +490,11 @@ extern CCoinsViewCache *pcoinsTip;
/** Global variable that points to the active block tree (protected by cs_main) */
extern CBlockTreeDB *pblocktree;
+/**
+ * Return the spend height, which is one more than the inputs.GetBestBlock().
+ * While checking, GetBestBlock() refers to the parent block. (protected by cs_main)
+ * This is also true for mempool checks.
+ */
+int GetSpendHeight(const CCoinsViewCache& inputs);
+
#endif // BITCOIN_MAIN_H
diff --git a/src/memusage.h b/src/memusage.h
new file mode 100644
index 0000000000..9f7de9e2e1
--- /dev/null
+++ b/src/memusage.h
@@ -0,0 +1,111 @@
+// Copyright (c) 2015 The Bitcoin developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_MEMUSAGE_H
+#define BITCOIN_MEMUSAGE_H
+
+#include <stdlib.h>
+
+#include <map>
+#include <set>
+#include <vector>
+
+#include <boost/unordered_set.hpp>
+#include <boost/unordered_map.hpp>
+
+namespace memusage
+{
+
+/** Compute the total memory used by allocating alloc bytes. */
+static size_t MallocUsage(size_t alloc);
+
+/** Compute the memory used for dynamically allocated but owned data structures.
+ * For generic data types, this is *not* recursive. DynamicUsage(vector<vector<int> >)
+ * will compute the memory used for the vector<int>'s, but not for the ints inside.
+ * This is for efficiency reasons, as these functions are intended to be fast. If
+ * application data structures require more accurate inner accounting, they should
+ * do the recursion themselves, or use more efficient caching + updating on modification.
+ */
+template<typename X> static size_t DynamicUsage(const std::vector<X>& v);
+template<typename X> static size_t DynamicUsage(const std::set<X>& s);
+template<typename X, typename Y> static size_t DynamicUsage(const std::map<X, Y>& m);
+template<typename X, typename Y> static size_t DynamicUsage(const boost::unordered_set<X, Y>& s);
+template<typename X, typename Y, typename Z> static size_t DynamicUsage(const boost::unordered_map<X, Y, Z>& s);
+template<typename X> static size_t DynamicUsage(const X& x);
+
+static inline size_t MallocUsage(size_t alloc)
+{
+ // Measured on libc6 2.19 on Linux.
+ if (sizeof(void*) == 8) {
+ return ((alloc + 31) >> 4) << 4;
+ } else if (sizeof(void*) == 4) {
+ return ((alloc + 15) >> 3) << 3;
+ } else {
+ assert(0);
+ }
+}
+
+// STL data structures
+
+template<typename X>
+struct stl_tree_node
+{
+private:
+ int color;
+ void* parent;
+ void* left;
+ void* right;
+ X x;
+};
+
+template<typename X>
+static inline size_t DynamicUsage(const std::vector<X>& v)
+{
+ return MallocUsage(v.capacity() * sizeof(X));
+}
+
+template<typename X>
+static inline size_t DynamicUsage(const std::set<X>& s)
+{
+ return MallocUsage(sizeof(stl_tree_node<X>)) * s.size();
+}
+
+template<typename X, typename Y>
+static inline size_t DynamicUsage(const std::map<X, Y>& m)
+{
+ return MallocUsage(sizeof(stl_tree_node<std::pair<const X, Y> >)) * m.size();
+}
+
+// Boost data structures
+
+template<typename X>
+struct boost_unordered_node : private X
+{
+private:
+ void* ptr;
+};
+
+template<typename X, typename Y>
+static inline size_t DynamicUsage(const boost::unordered_set<X, Y>& s)
+{
+ return MallocUsage(sizeof(boost_unordered_node<X>)) * s.size() + MallocUsage(sizeof(void*) * s.bucket_count());
+}
+
+template<typename X, typename Y, typename Z>
+static inline size_t DynamicUsage(const boost::unordered_map<X, Y, Z>& m)
+{
+ return MallocUsage(sizeof(boost_unordered_node<std::pair<const X, Y> >)) * m.size() + MallocUsage(sizeof(void*) * m.bucket_count());
+}
+
+// Dispatch to class method as fallback
+
+template<typename X>
+static inline size_t DynamicUsage(const X& x)
+{
+ return x.DynamicMemoryUsage();
+}
+
+}
+
+#endif
diff --git a/src/merkleblock.cpp b/src/merkleblock.cpp
index b51b002b95..4d90fd8cd7 100644
--- a/src/merkleblock.cpp
+++ b/src/merkleblock.cpp
@@ -6,7 +6,7 @@
#include "merkleblock.h"
#include "hash.h"
-#include "primitives/block.h" // for MAX_BLOCK_SIZE
+#include "consensus/consensus.h"
#include "utilstrencodings.h"
using namespace std;
@@ -37,6 +37,29 @@ CMerkleBlock::CMerkleBlock(const CBlock& block, CBloomFilter& filter)
txn = CPartialMerkleTree(vHashes, vMatch);
}
+CMerkleBlock::CMerkleBlock(const CBlock& block, const std::set<uint256>& txids)
+{
+ header = block.GetBlockHeader();
+
+ vector<bool> vMatch;
+ vector<uint256> vHashes;
+
+ vMatch.reserve(block.vtx.size());
+ vHashes.reserve(block.vtx.size());
+
+ for (unsigned int i = 0; i < block.vtx.size(); i++)
+ {
+ const uint256& hash = block.vtx[i].GetHash();
+ if (txids.count(hash))
+ vMatch.push_back(true);
+ else
+ vMatch.push_back(false);
+ vHashes.push_back(hash);
+ }
+
+ txn = CPartialMerkleTree(vHashes, vMatch);
+}
+
uint256 CPartialMerkleTree::CalcHash(int height, unsigned int pos, const std::vector<uint256> &vTxid) {
if (height == 0) {
// hash at height 0 is the txids themself
@@ -96,8 +119,8 @@ uint256 CPartialMerkleTree::TraverseAndExtract(int height, unsigned int pos, uns
if (pos*2+1 < CalcTreeWidth(height-1)) {
right = TraverseAndExtract(height-1, pos*2+1, nBitsUsed, nHashUsed, vMatch);
if (right == left) {
- // If the left and right branch should never be identical as the transaction
- // hashes covered by them must be unique.
+ // The left and right branches should never be identical, as the transaction
+ // hashes covered by them must each be unique.
fBad = true;
}
} else {
diff --git a/src/merkleblock.h b/src/merkleblock.h
index 52c914967f..904c22abc2 100644
--- a/src/merkleblock.h
+++ b/src/merkleblock.h
@@ -104,7 +104,7 @@ public:
}
}
- /** Construct a partial merkle tree from a list of transaction id's, and a mask that selects a subset of them */
+ /** Construct a partial merkle tree from a list of transaction ids, and a mask that selects a subset of them */
CPartialMerkleTree(const std::vector<uint256> &vTxid, const std::vector<bool> &vMatch);
CPartialMerkleTree();
@@ -139,6 +139,11 @@ public:
*/
CMerkleBlock(const CBlock& block, CBloomFilter& filter);
+ // Create from a CBlock, matching the txids in the set
+ CMerkleBlock(const CBlock& block, const std::set<uint256>& txids);
+
+ CMerkleBlock() {}
+
ADD_SERIALIZE_METHODS;
template <typename Stream, typename Operation>
diff --git a/src/miner.cpp b/src/miner.cpp
index cf08b78229..2c5cba742c 100644
--- a/src/miner.cpp
+++ b/src/miner.cpp
@@ -6,17 +6,18 @@
#include "miner.h"
#include "amount.h"
-#include "primitives/transaction.h"
+#include "chainparams.h"
+#include "consensus/consensus.h"
+#include "consensus/validation.h"
#include "hash.h"
#include "main.h"
#include "net.h"
#include "pow.h"
+#include "primitives/transaction.h"
#include "timedata.h"
#include "util.h"
#include "utilmoneystr.h"
-#ifdef ENABLE_WALLET
-#include "wallet/wallet.h"
-#endif
+#include "validationinterface.h"
#include <boost/thread.hpp>
#include <boost/tuple/tuple.hpp>
@@ -78,17 +79,18 @@ public:
}
};
-void UpdateTime(CBlockHeader* pblock, const CBlockIndex* pindexPrev)
+void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
{
pblock->nTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
// Updating time can change work required on testnet:
- if (Params().AllowMinDifficultyBlocks())
- pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus());
+ if (consensusParams.fPowAllowMinDifficultyBlocks)
+ pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, consensusParams);
}
CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn)
{
+ const CChainParams& chainparams = Params();
// Create new block
auto_ptr<CBlockTemplate> pblocktemplate(new CBlockTemplate());
if(!pblocktemplate.get())
@@ -134,6 +136,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn)
LOCK2(cs_main, mempool.cs);
CBlockIndex* pindexPrev = chainActive.Tip();
const int nHeight = pindexPrev->nHeight + 1;
+ pblock->nTime = GetAdjustedTime();
CCoinsViewCache view(pcoinsTip);
// Priority order to process transactions
@@ -148,7 +151,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn)
mi != mempool.mapTx.end(); ++mi)
{
const CTransaction& tx = mi->second.GetTx();
- if (tx.IsCoinBase() || !IsFinalTx(tx, nHeight))
+ if (tx.IsCoinBase() || !IsFinalTx(tx, nHeight, pblock->nTime))
continue;
COrphan* porphan = NULL;
@@ -318,14 +321,14 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn)
LogPrintf("CreateNewBlock(): total size %u\n", nBlockSize);
// Compute final coinbase transaction.
- txNew.vout[0].nValue = GetBlockValue(nHeight, nFees);
+ txNew.vout[0].nValue = nFees + GetBlockSubsidy(nHeight, chainparams.GetConsensus());
txNew.vin[0].scriptSig = CScript() << nHeight << OP_0;
pblock->vtx[0] = txNew;
pblocktemplate->vTxFees[0] = -nFees;
// Fill in header
pblock->hashPrevBlock = pindexPrev->GetBlockHash();
- UpdateTime(pblock, pindexPrev);
+ UpdateTime(pblock, Params().GetConsensus(), pindexPrev);
pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus());
pblock->nNonce = 0;
pblocktemplate->vTxSigOps[0] = GetLegacySigOpCount(pblock->vtx[0]);
@@ -357,7 +360,6 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int&
pblock->hashMerkleRoot = pblock->BuildMerkleTree();
}
-#ifdef ENABLE_WALLET
//////////////////////////////////////////////////////////////////////////////
//
// Internal miner
@@ -396,17 +398,7 @@ bool static ScanHash(const CBlockHeader *pblock, uint32_t& nNonce, uint256 *phas
}
}
-CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey)
-{
- CPubKey pubkey;
- if (!reservekey.GetReservedKey(pubkey))
- return NULL;
-
- CScript scriptPubKey = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
- return CreateNewBlock(scriptPubKey);
-}
-
-static bool ProcessBlockFound(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey)
+static bool ProcessBlockFound(CBlock* pblock, const CChainParams& chainparams)
{
LogPrintf("%s\n", pblock->ToString());
LogPrintf("generated %s\n", FormatMoney(pblock->vtx[0].vout[0].nValue));
@@ -418,40 +410,47 @@ static bool ProcessBlockFound(CBlock* pblock, CWallet& wallet, CReserveKey& rese
return error("BitcoinMiner: generated block is stale");
}
- // Remove key from key pool
- reservekey.KeepKey();
-
- // Track how many getdata requests this block gets
- {
- LOCK(wallet.cs_wallet);
- wallet.mapRequestCount[pblock->GetHash()] = 0;
- }
+ // Inform about the new block
+ GetMainSignals().BlockFound(pblock->GetHash());
// Process this block the same as if we had received it from another node
CValidationState state;
- if (!ProcessNewBlock(state, NULL, pblock))
+ if (!ProcessNewBlock(state, NULL, pblock, true, NULL))
return error("BitcoinMiner: ProcessNewBlock, block not accepted");
return true;
}
-void static BitcoinMiner(CWallet *pwallet)
+void static BitcoinMiner(const CChainParams& chainparams)
{
LogPrintf("BitcoinMiner started\n");
SetThreadPriority(THREAD_PRIORITY_LOWEST);
RenameThread("bitcoin-miner");
- // Each thread has its own key and counter
- CReserveKey reservekey(pwallet);
unsigned int nExtraNonce = 0;
+ boost::shared_ptr<CReserveScript> coinbaseScript;
+ GetMainSignals().ScriptForMining(coinbaseScript);
+
try {
+ //throw an error if no script was provided
+ if (!coinbaseScript->reserveScript.size())
+ throw std::runtime_error("No coinbase script available (mining requires a wallet)");
+
while (true) {
- if (Params().MiningRequiresPeers()) {
+ if (chainparams.MiningRequiresPeers()) {
// Busy-wait for the network to come online so we don't waste time mining
// on an obsolete chain. In regtest mode we expect to fly solo.
- while (vNodes.empty())
+ do {
+ bool fvNodesEmpty;
+ {
+ LOCK(cs_vNodes);
+ fvNodesEmpty = vNodes.empty();
+ }
+ if (!fvNodesEmpty && !IsInitialBlockDownload())
+ break;
MilliSleep(1000);
+ } while (true);
}
//
@@ -460,7 +459,7 @@ void static BitcoinMiner(CWallet *pwallet)
unsigned int nTransactionsUpdatedLast = mempool.GetTransactionsUpdated();
CBlockIndex* pindexPrev = chainActive.Tip();
- auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlockWithKey(reservekey));
+ auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlock(coinbaseScript->reserveScript));
if (!pblocktemplate.get())
{
LogPrintf("Error in BitcoinMiner: Keypool ran out, please call keypoolrefill before restarting the mining thread\n");
@@ -492,11 +491,12 @@ void static BitcoinMiner(CWallet *pwallet)
SetThreadPriority(THREAD_PRIORITY_NORMAL);
LogPrintf("BitcoinMiner:\n");
LogPrintf("proof-of-work found \n hash: %s \ntarget: %s\n", hash.GetHex(), hashTarget.GetHex());
- ProcessBlockFound(pblock, *pwallet, reservekey);
+ ProcessBlockFound(pblock, chainparams);
SetThreadPriority(THREAD_PRIORITY_LOWEST);
+ coinbaseScript->KeepScript();
// In regression test mode, stop mining after a block is found.
- if (Params().MineBlocksOnDemand())
+ if (chainparams.MineBlocksOnDemand())
throw boost::thread_interrupted();
break;
@@ -506,7 +506,7 @@ void static BitcoinMiner(CWallet *pwallet)
// Check for stop or if block needs to be rebuilt
boost::this_thread::interruption_point();
// Regtest mode doesn't require peers
- if (vNodes.empty() && Params().MiningRequiresPeers())
+ if (vNodes.empty() && chainparams.MiningRequiresPeers())
break;
if (nNonce >= 0xffff0000)
break;
@@ -516,8 +516,8 @@ void static BitcoinMiner(CWallet *pwallet)
break;
// Update nTime every few seconds
- UpdateTime(pblock, pindexPrev);
- if (Params().AllowMinDifficultyBlocks())
+ UpdateTime(pblock, chainparams.GetConsensus(), pindexPrev);
+ if (chainparams.GetConsensus().fPowAllowMinDifficultyBlocks)
{
// Changing pblock->nTime can change work required on testnet:
hashTarget.SetCompact(pblock->nBits);
@@ -530,9 +530,14 @@ void static BitcoinMiner(CWallet *pwallet)
LogPrintf("BitcoinMiner terminated\n");
throw;
}
+ catch (const std::runtime_error &e)
+ {
+ LogPrintf("BitcoinMiner runtime error: %s\n", e.what());
+ return;
+ }
}
-void GenerateBitcoins(bool fGenerate, CWallet* pwallet, int nThreads)
+void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainparams)
{
static boost::thread_group* minerThreads = NULL;
@@ -556,7 +561,5 @@ void GenerateBitcoins(bool fGenerate, CWallet* pwallet, int nThreads)
minerThreads = new boost::thread_group();
for (int i = 0; i < nThreads; i++)
- minerThreads->create_thread(boost::bind(&BitcoinMiner, pwallet));
+ minerThreads->create_thread(boost::bind(&BitcoinMiner, boost::cref(chainparams)));
}
-
-#endif // ENABLE_WALLET
diff --git a/src/miner.h b/src/miner.h
index 5d5c9c86c7..777a091967 100644
--- a/src/miner.h
+++ b/src/miner.h
@@ -11,9 +11,11 @@
#include <stdint.h>
class CBlockIndex;
+class CChainParams;
class CReserveKey;
class CScript;
class CWallet;
+namespace Consensus { struct Params; };
struct CBlockTemplate
{
@@ -23,12 +25,11 @@ struct CBlockTemplate
};
/** Run the miner threads */
-void GenerateBitcoins(bool fGenerate, CWallet* pwallet, int nThreads);
+void GenerateBitcoins(bool fGenerate, int nThreads, const CChainParams& chainparams);
/** Generate a new block, without valid proof-of-work */
CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn);
-CBlockTemplate* CreateNewBlockWithKey(CReserveKey& reservekey);
/** Modify the extranonce in a block */
void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& nExtraNonce);
-void UpdateTime(CBlockHeader* block, const CBlockIndex* pindexPrev);
+void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev);
#endif // BITCOIN_MINER_H
diff --git a/src/mruset.h b/src/mruset.h
index 1969f419cb..398aa173bf 100644
--- a/src/mruset.h
+++ b/src/mruset.h
@@ -1,12 +1,12 @@
-// Copyright (c) 2012 The Bitcoin Core developers
+// Copyright (c) 2012-2015 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_MRUSET_H
#define BITCOIN_MRUSET_H
-#include <deque>
#include <set>
+#include <vector>
#include <utility>
/** STL-like set container that only keeps the most recent N elements. */
@@ -22,11 +22,13 @@ public:
protected:
std::set<T> set;
- std::deque<T> queue;
- size_type nMaxSize;
+ std::vector<iterator> order;
+ size_type first_used;
+ size_type first_unused;
+ const size_type nMaxSize;
public:
- mruset(size_type nMaxSizeIn = 0) { nMaxSize = nMaxSizeIn; }
+ mruset(size_type nMaxSizeIn = 1) : nMaxSize(nMaxSizeIn) { clear(); }
iterator begin() const { return set.begin(); }
iterator end() const { return set.end(); }
size_type size() const { return set.size(); }
@@ -36,7 +38,9 @@ public:
void clear()
{
set.clear();
- queue.clear();
+ order.assign(nMaxSize, set.end());
+ first_used = 0;
+ first_unused = 0;
}
bool inline friend operator==(const mruset<T>& a, const mruset<T>& b) { return a.set == b.set; }
bool inline friend operator==(const mruset<T>& a, const std::set<T>& b) { return a.set == b; }
@@ -45,25 +49,17 @@ public:
{
std::pair<iterator, bool> ret = set.insert(x);
if (ret.second) {
- if (nMaxSize && queue.size() == nMaxSize) {
- set.erase(queue.front());
- queue.pop_front();
+ if (set.size() == nMaxSize + 1) {
+ set.erase(order[first_used]);
+ order[first_used] = set.end();
+ if (++first_used == nMaxSize) first_used = 0;
}
- queue.push_back(x);
+ order[first_unused] = ret.first;
+ if (++first_unused == nMaxSize) first_unused = 0;
}
return ret;
}
size_type max_size() const { return nMaxSize; }
- size_type max_size(size_type s)
- {
- if (s)
- while (queue.size() > s) {
- set.erase(queue.front());
- queue.pop_front();
- }
- nMaxSize = s;
- return nMaxSize;
- }
};
#endif // BITCOIN_MRUSET_H
diff --git a/src/net.cpp b/src/net.cpp
index 48e6367f20..0511256e55 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -13,6 +13,7 @@
#include "chainparams.h"
#include "clientversion.h"
#include "primitives/transaction.h"
+#include "scheduler.h"
#include "ui_interface.h"
#include "crypto/common.h"
@@ -100,12 +101,13 @@ NodeId nLastNodeId = 0;
CCriticalSection cs_nLastNodeId;
static CSemaphore *semOutbound = NULL;
+boost::condition_variable messageHandlerCondition;
// Signals for message handling
static CNodeSignals g_signals;
CNodeSignals& GetNodeSignals() { return g_signals; }
-void AddOneShot(string strDest)
+void AddOneShot(const std::string& strDest)
{
LOCK(cs_vOneShots);
vOneShots.push_back(strDest);
@@ -141,6 +143,27 @@ bool GetLocal(CService& addr, const CNetAddr *paddrPeer)
return nBestScore >= 0;
}
+//! Convert the pnSeeds6 array into usable address objects.
+static std::vector<CAddress> convertSeed6(const std::vector<SeedSpec6> &vSeedsIn)
+{
+ // It'll only connect to one or two seed nodes because once it connects,
+ // it'll get a pile of addresses with newer timestamps.
+ // Seed nodes are given a random 'last seen time' of between one and two
+ // weeks ago.
+ const int64_t nOneWeek = 7*24*60*60;
+ std::vector<CAddress> vSeedsOut;
+ vSeedsOut.reserve(vSeedsIn.size());
+ for (std::vector<SeedSpec6>::const_iterator i(vSeedsIn.begin()); i != vSeedsIn.end(); ++i)
+ {
+ struct in6_addr ip;
+ memcpy(&ip, i->addr, sizeof(ip));
+ CAddress addr(CService(ip, i->port));
+ addr.nTime = GetTime() - GetRand(nOneWeek) - nOneWeek;
+ vSeedsOut.push_back(addr);
+ }
+ return vSeedsOut;
+}
+
// get best local address for a particular peer as a CAddress
// Otherwise, return the unroutable 0.0.0.0 but filled in with
// the normal parameters, since the IP may be changed to a useful
@@ -309,6 +332,15 @@ CNode* FindNode(const CNetAddr& ip)
return NULL;
}
+CNode* FindNode(const CSubNet& subNet)
+{
+ LOCK(cs_vNodes);
+ BOOST_FOREACH(CNode* pnode, vNodes)
+ if (subNet.Match((CNetAddr)pnode->addr))
+ return (pnode);
+ return NULL;
+}
+
CNode* FindNode(const std::string& addrName)
{
LOCK(cs_vNodes);
@@ -411,11 +443,12 @@ void CNode::PushVersion()
-std::map<CNetAddr, int64_t> CNode::setBanned;
+std::map<CSubNet, int64_t> CNode::setBanned;
CCriticalSection CNode::cs_setBanned;
void CNode::ClearBanned()
{
+ LOCK(cs_setBanned);
setBanned.clear();
}
@@ -424,7 +457,24 @@ bool CNode::IsBanned(CNetAddr ip)
bool fResult = false;
{
LOCK(cs_setBanned);
- std::map<CNetAddr, int64_t>::iterator i = setBanned.find(ip);
+ for (std::map<CSubNet, int64_t>::iterator it = setBanned.begin(); it != setBanned.end(); it++)
+ {
+ CSubNet subNet = (*it).first;
+ int64_t t = (*it).second;
+
+ if(subNet.Match(ip) && GetTime() < t)
+ fResult = true;
+ }
+ }
+ return fResult;
+}
+
+bool CNode::IsBanned(CSubNet subnet)
+{
+ bool fResult = false;
+ {
+ LOCK(cs_setBanned);
+ std::map<CSubNet, int64_t>::iterator i = setBanned.find(subnet);
if (i != setBanned.end())
{
int64_t t = (*i).second;
@@ -435,14 +485,37 @@ bool CNode::IsBanned(CNetAddr ip)
return fResult;
}
-bool CNode::Ban(const CNetAddr &addr) {
+void CNode::Ban(const CNetAddr& addr, int64_t bantimeoffset, bool sinceUnixEpoch) {
+ CSubNet subNet(addr.ToString()+(addr.IsIPv4() ? "/32" : "/128"));
+ Ban(subNet, bantimeoffset, sinceUnixEpoch);
+}
+
+void CNode::Ban(const CSubNet& subNet, int64_t bantimeoffset, bool sinceUnixEpoch) {
int64_t banTime = GetTime()+GetArg("-bantime", 60*60*24); // Default 24-hour ban
- {
- LOCK(cs_setBanned);
- if (setBanned[addr] < banTime)
- setBanned[addr] = banTime;
- }
- return true;
+ if (bantimeoffset > 0)
+ banTime = (sinceUnixEpoch ? 0 : GetTime() )+bantimeoffset;
+
+ LOCK(cs_setBanned);
+ if (setBanned[subNet] < banTime)
+ setBanned[subNet] = banTime;
+}
+
+bool CNode::Unban(const CNetAddr &addr) {
+ CSubNet subNet(addr.ToString()+(addr.IsIPv4() ? "/32" : "/128"));
+ return Unban(subNet);
+}
+
+bool CNode::Unban(const CSubNet &subNet) {
+ LOCK(cs_setBanned);
+ if (setBanned.erase(subNet))
+ return true;
+ return false;
+}
+
+void CNode::GetBanned(std::map<CSubNet, int64_t> &banMap)
+{
+ LOCK(cs_setBanned);
+ banMap = setBanned; //create a thread safe copy
}
@@ -532,8 +605,10 @@ bool CNode::ReceiveMsgBytes(const char *pch, unsigned int nBytes)
pch += handled;
nBytes -= handled;
- if (msg.complete())
+ if (msg.complete()) {
msg.nTime = GetTimeMicros();
+ messageHandlerCondition.notify_one();
+ }
}
return true;
@@ -1099,7 +1174,7 @@ void ThreadDNSAddressSeed()
vector<CAddress> vAdd;
if (LookupHost(seed.host.c_str(), vIPs))
{
- BOOST_FOREACH(CNetAddr& ip, vIPs)
+ BOOST_FOREACH(const CNetAddr& ip, vIPs)
{
int nOneDay = 24*3600;
CAddress addr = CAddress(CService(ip, Params().GetDefaultPort()));
@@ -1163,7 +1238,7 @@ void ThreadOpenConnections()
for (int64_t nLoop = 0;; nLoop++)
{
ProcessOneShot();
- BOOST_FOREACH(string strAddr, mapMultiArgs["-connect"])
+ BOOST_FOREACH(const std::string& strAddr, mapMultiArgs["-connect"])
{
CAddress addr;
OpenNetworkConnection(addr, NULL, strAddr.c_str());
@@ -1192,7 +1267,7 @@ void ThreadOpenConnections()
static bool done = false;
if (!done) {
LogPrintf("Adding fixed seed nodes as DNS doesn't seem to be available.\n");
- addrman.Add(Params().FixedSeeds(), CNetAddr("127.0.0.1"));
+ addrman.Add(convertSeed6(Params().FixedSeeds()), CNetAddr("127.0.0.1"));
done = true;
}
}
@@ -1221,7 +1296,7 @@ void ThreadOpenConnections()
int nTries = 0;
while (true)
{
- CAddress addr = addrman.Select();
+ CAddrInfo addr = addrman.Select();
// if we selected an invalid address, restart
if (!addr.IsValid() || setConnected.count(addr.GetGroup()) || IsLocal(addr))
@@ -1266,10 +1341,10 @@ void ThreadOpenAddedConnections()
list<string> lAddresses(0);
{
LOCK(cs_vAddedNodes);
- BOOST_FOREACH(string& strAddNode, vAddedNodes)
+ BOOST_FOREACH(const std::string& strAddNode, vAddedNodes)
lAddresses.push_back(strAddNode);
}
- BOOST_FOREACH(string& strAddNode, lAddresses) {
+ BOOST_FOREACH(const std::string& strAddNode, lAddresses) {
CAddress addr;
CSemaphoreGrant grant(*semOutbound);
OpenNetworkConnection(addr, &grant, strAddNode.c_str());
@@ -1284,20 +1359,19 @@ void ThreadOpenAddedConnections()
list<string> lAddresses(0);
{
LOCK(cs_vAddedNodes);
- BOOST_FOREACH(string& strAddNode, vAddedNodes)
+ BOOST_FOREACH(const std::string& strAddNode, vAddedNodes)
lAddresses.push_back(strAddNode);
}
list<vector<CService> > lservAddressesToAdd(0);
- BOOST_FOREACH(string& strAddNode, lAddresses)
- {
+ BOOST_FOREACH(const std::string& strAddNode, lAddresses) {
vector<CService> vservNode(0);
if(Lookup(strAddNode.c_str(), vservNode, Params().GetDefaultPort(), fNameLookup, 0))
{
lservAddressesToAdd.push_back(vservNode);
{
LOCK(cs_setservAddNodeAddresses);
- BOOST_FOREACH(CService& serv, vservNode)
+ BOOST_FOREACH(const CService& serv, vservNode)
setservAddNodeAddresses.insert(serv);
}
}
@@ -1308,7 +1382,7 @@ void ThreadOpenAddedConnections()
LOCK(cs_vNodes);
BOOST_FOREACH(CNode* pnode, vNodes)
for (list<vector<CService> >::iterator it = lservAddressesToAdd.begin(); it != lservAddressesToAdd.end(); it++)
- BOOST_FOREACH(CService& addrNode, *(it))
+ BOOST_FOREACH(const CService& addrNode, *(it))
if (pnode->addr == addrNode)
{
it = lservAddressesToAdd.erase(it);
@@ -1338,7 +1412,7 @@ bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOu
FindNode((CNetAddr)addrConnect) || CNode::IsBanned(addrConnect) ||
FindNode(addrConnect.ToStringIPPort()))
return false;
- } else if (FindNode(pszDest))
+ } else if (FindNode(std::string(pszDest)))
return false;
CNode* pnode = ConnectNode(addrConnect, pszDest);
@@ -1358,6 +1432,9 @@ bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOu
void ThreadMessageHandler()
{
+ boost::mutex condition_mutex;
+ boost::unique_lock<boost::mutex> lock(condition_mutex);
+
SetThreadPriority(THREAD_PRIORITY_BELOW_NORMAL);
while (true)
{
@@ -1417,7 +1494,7 @@ void ThreadMessageHandler()
}
if (fSleep)
- MilliSleep(100);
+ messageHandlerCondition.timed_wait(lock, boost::posix_time::microsec_clock::universal_time() + boost::posix_time::milliseconds(100));
}
}
@@ -1563,7 +1640,7 @@ void static Discover(boost::thread_group& threadGroup)
#endif
}
-void StartNode(boost::thread_group& threadGroup)
+void StartNode(boost::thread_group& threadGroup, CScheduler& scheduler)
{
uiInterface.InitMessage(_("Loading addresses..."));
// Load addresses for peers.dat
@@ -1613,7 +1690,7 @@ void StartNode(boost::thread_group& threadGroup)
threadGroup.create_thread(boost::bind(&TraceThread<void (*)()>, "msghand", &ThreadMessageHandler));
// Dump network addresses
- threadGroup.create_thread(boost::bind(&LoopForever<void (*)()>, "dumpaddr", &DumpAddresses, DUMP_ADDRESSES_INTERVAL * 1000));
+ scheduler.scheduleEvery(&DumpAddresses, DUMP_ADDRESSES_INTERVAL);
}
bool StopNode()
@@ -1878,7 +1955,10 @@ bool CAddrDB::Read(CAddrMan& addr)
unsigned int ReceiveFloodSize() { return 1000*GetArg("-maxreceivebuffer", 5*1000); }
unsigned int SendBufferSize() { return 1000*GetArg("-maxsendbuffer", 1*1000); }
-CNode::CNode(SOCKET hSocketIn, CAddress addrIn, std::string addrNameIn, bool fInboundIn) : ssSend(SER_NETWORK, INIT_PROTO_VERSION), setAddrKnown(5000)
+CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNameIn, bool fInboundIn) :
+ ssSend(SER_NETWORK, INIT_PROTO_VERSION),
+ addrKnown(5000, 0.001, insecure_rand()),
+ setInventoryKnown(SendBufferSize() / 1000)
{
nServices = 0;
hSocket = hSocketIn;
@@ -1907,7 +1987,6 @@ CNode::CNode(SOCKET hSocketIn, CAddress addrIn, std::string addrNameIn, bool fIn
nStartingHeight = -1;
fGetAddr = false;
fRelayTxes = false;
- setInventoryKnown.max_size(SendBufferSize() / 1000);
pfilter = new CBloomFilter();
nPingNonceSent = 0;
nPingUsecStart = 0;
diff --git a/src/net.h b/src/net.h
index 9fc6ce68d0..69e4c592a9 100644
--- a/src/net.h
+++ b/src/net.h
@@ -32,6 +32,7 @@
class CAddrMan;
class CBlockIndex;
+class CScheduler;
class CNode;
namespace boost {
@@ -62,9 +63,10 @@ static const size_t MAPASKFOR_MAX_SZ = MAX_INV_SZ;
unsigned int ReceiveFloodSize();
unsigned int SendBufferSize();
-void AddOneShot(std::string strDest);
+void AddOneShot(const std::string& strDest);
void AddressCurrentlyConnected(const CService& addr);
CNode* FindNode(const CNetAddr& ip);
+CNode* FindNode(const CSubNet& subNet);
CNode* FindNode(const std::string& addrName);
CNode* FindNode(const CService& ip);
CNode* ConnectNode(CAddress addrConnect, const char *pszDest = NULL);
@@ -72,7 +74,7 @@ bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOu
void MapPort(bool fUseUPnP);
unsigned short GetListenPort();
bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false);
-void StartNode(boost::thread_group& threadGroup);
+void StartNode(boost::thread_group& threadGroup, CScheduler& scheduler);
bool StopNode();
void SocketSendData(CNode *pnode);
@@ -271,8 +273,8 @@ public:
bool fDisconnect;
// We use fRelayTxes for two purposes -
// a) it allows us to not relay tx invs before receiving the peer's version message
- // b) the peer may tell us in their version message that we should not relay tx invs
- // until they have initialized their bloom filter.
+ // b) the peer may tell us in its version message that we should not relay tx invs
+ // until it has initialized its bloom filter.
bool fRelayTxes;
CSemaphoreGrant grantOutbound;
CCriticalSection cs_filter;
@@ -283,7 +285,7 @@ protected:
// Denial-of-service detection/prevention
// Key is IP address, value is banned-until-time
- static std::map<CNetAddr, int64_t> setBanned;
+ static std::map<CSubNet, int64_t> setBanned;
static CCriticalSection cs_setBanned;
// Whitelisted ranges. Any node connecting from these is automatically
@@ -300,7 +302,7 @@ public:
// flood relay
std::vector<CAddress> vAddrToSend;
- mruset<CAddress> setAddrKnown;
+ CRollingBloomFilter addrKnown;
bool fGetAddr;
std::set<uint256> setKnown;
@@ -320,7 +322,7 @@ public:
// Whether a ping is requested.
bool fPingQueued;
- CNode(SOCKET hSocketIn, CAddress addrIn, std::string addrNameIn = "", bool fInboundIn=false);
+ CNode(SOCKET hSocketIn, const CAddress &addrIn, const std::string &addrNameIn = "", bool fInboundIn = false);
~CNode();
private:
@@ -380,7 +382,7 @@ public:
void AddAddressKnown(const CAddress& addr)
{
- setAddrKnown.insert(addr);
+ addrKnown.insert(addr.GetKey());
}
void PushAddress(const CAddress& addr)
@@ -388,7 +390,7 @@ public:
// Known checking here is only to save space from duplicates.
// SendMessages will filter it again for knowns that were added
// after addresses were pushed.
- if (addr.IsValid() && !setAddrKnown.count(addr)) {
+ if (addr.IsValid() && !addrKnown.contains(addr.GetKey())) {
if (vAddrToSend.size() >= MAX_ADDR_TO_SEND) {
vAddrToSend[insecure_rand() % vAddrToSend.size()] = addr;
} else {
@@ -605,7 +607,13 @@ public:
// new code.
static void ClearBanned(); // needed for unit testing
static bool IsBanned(CNetAddr ip);
- static bool Ban(const CNetAddr &ip);
+ static bool IsBanned(CSubNet subnet);
+ static void Ban(const CNetAddr &ip, int64_t bantimeoffset = 0, bool sinceUnixEpoch = false);
+ static void Ban(const CSubNet &subNet, int64_t bantimeoffset = 0, bool sinceUnixEpoch = false);
+ static bool Unban(const CNetAddr &ip);
+ static bool Unban(const CSubNet &ip);
+ static void GetBanned(std::map<CSubNet, int64_t> &banmap);
+
void copyStats(CNodeStats &stats);
static bool IsWhitelistedRange(const CNetAddr &ip);
diff --git a/src/netbase.cpp b/src/netbase.cpp
index a2ac6575bc..adac5c2d07 100644
--- a/src/netbase.cpp
+++ b/src/netbase.cpp
@@ -12,6 +12,7 @@
#include "hash.h"
#include "sync.h"
#include "uint256.h"
+#include "random.h"
#include "util.h"
#include "utilstrencodings.h"
@@ -34,11 +35,9 @@
#define MSG_NOSIGNAL 0
#endif
-using namespace std;
-
// Settings
static proxyType proxyInfo[NET_MAX];
-static CService nameProxy;
+static proxyType nameProxy;
static CCriticalSection cs_proxyInfos;
int nConnectTimeout = DEFAULT_CONNECT_TIMEOUT;
bool fNameLookup = false;
@@ -285,59 +284,100 @@ bool static InterruptibleRecv(char* data, size_t len, int timeout, SOCKET& hSock
return len == 0;
}
-bool static Socks5(string strDest, int port, SOCKET& hSocket)
+struct ProxyCredentials
+{
+ std::string username;
+ std::string password;
+};
+
+/** Connect using SOCKS5 (as described in RFC1928) */
+static bool Socks5(const std::string& strDest, int port, const ProxyCredentials *auth, SOCKET& hSocket)
{
LogPrintf("SOCKS5 connecting %s\n", strDest);
- if (strDest.size() > 255)
- {
+ if (strDest.size() > 255) {
CloseSocket(hSocket);
return error("Hostname too long");
}
- char pszSocks5Init[] = "\5\1\0";
- ssize_t nSize = sizeof(pszSocks5Init) - 1;
-
- ssize_t ret = send(hSocket, pszSocks5Init, nSize, MSG_NOSIGNAL);
- if (ret != nSize)
- {
+ // Accepted authentication methods
+ std::vector<uint8_t> vSocks5Init;
+ vSocks5Init.push_back(0x05);
+ if (auth) {
+ vSocks5Init.push_back(0x02); // # METHODS
+ vSocks5Init.push_back(0x00); // X'00' NO AUTHENTICATION REQUIRED
+ vSocks5Init.push_back(0x02); // X'02' USERNAME/PASSWORD (RFC1929)
+ } else {
+ vSocks5Init.push_back(0x01); // # METHODS
+ vSocks5Init.push_back(0x00); // X'00' NO AUTHENTICATION REQUIRED
+ }
+ ssize_t ret = send(hSocket, (const char*)begin_ptr(vSocks5Init), vSocks5Init.size(), MSG_NOSIGNAL);
+ if (ret != (ssize_t)vSocks5Init.size()) {
CloseSocket(hSocket);
return error("Error sending to proxy");
}
char pchRet1[2];
- if (!InterruptibleRecv(pchRet1, 2, SOCKS5_RECV_TIMEOUT, hSocket))
- {
+ if (!InterruptibleRecv(pchRet1, 2, SOCKS5_RECV_TIMEOUT, hSocket)) {
CloseSocket(hSocket);
return error("Error reading proxy response");
}
- if (pchRet1[0] != 0x05 || pchRet1[1] != 0x00)
- {
+ if (pchRet1[0] != 0x05) {
CloseSocket(hSocket);
return error("Proxy failed to initialize");
}
- string strSocks5("\5\1");
- strSocks5 += '\000'; strSocks5 += '\003';
- strSocks5 += static_cast<char>(std::min((int)strDest.size(), 255));
- strSocks5 += strDest;
- strSocks5 += static_cast<char>((port >> 8) & 0xFF);
- strSocks5 += static_cast<char>((port >> 0) & 0xFF);
- ret = send(hSocket, strSocks5.data(), strSocks5.size(), MSG_NOSIGNAL);
- if (ret != (ssize_t)strSocks5.size())
- {
+ if (pchRet1[1] == 0x02 && auth) {
+ // Perform username/password authentication (as described in RFC1929)
+ std::vector<uint8_t> vAuth;
+ vAuth.push_back(0x01);
+ if (auth->username.size() > 255 || auth->password.size() > 255)
+ return error("Proxy username or password too long");
+ vAuth.push_back(auth->username.size());
+ vAuth.insert(vAuth.end(), auth->username.begin(), auth->username.end());
+ vAuth.push_back(auth->password.size());
+ vAuth.insert(vAuth.end(), auth->password.begin(), auth->password.end());
+ ret = send(hSocket, (const char*)begin_ptr(vAuth), vAuth.size(), MSG_NOSIGNAL);
+ if (ret != (ssize_t)vAuth.size()) {
+ CloseSocket(hSocket);
+ return error("Error sending authentication to proxy");
+ }
+ LogPrint("proxy", "SOCKS5 sending proxy authentication %s:%s\n", auth->username, auth->password);
+ char pchRetA[2];
+ if (!InterruptibleRecv(pchRetA, 2, SOCKS5_RECV_TIMEOUT, hSocket)) {
+ CloseSocket(hSocket);
+ return error("Error reading proxy authentication response");
+ }
+ if (pchRetA[0] != 0x01 || pchRetA[1] != 0x00) {
+ CloseSocket(hSocket);
+ return error("Proxy authentication unsuccesful");
+ }
+ } else if (pchRet1[1] == 0x00) {
+ // Perform no authentication
+ } else {
+ CloseSocket(hSocket);
+ return error("Proxy requested wrong authentication method %02x", pchRet1[1]);
+ }
+ std::vector<uint8_t> vSocks5;
+ vSocks5.push_back(0x05); // VER protocol version
+ vSocks5.push_back(0x01); // CMD CONNECT
+ vSocks5.push_back(0x00); // RSV Reserved
+ vSocks5.push_back(0x03); // ATYP DOMAINNAME
+ vSocks5.push_back(strDest.size()); // Length<=255 is checked at beginning of function
+ vSocks5.insert(vSocks5.end(), strDest.begin(), strDest.end());
+ vSocks5.push_back((port >> 8) & 0xFF);
+ vSocks5.push_back((port >> 0) & 0xFF);
+ ret = send(hSocket, (const char*)begin_ptr(vSocks5), vSocks5.size(), MSG_NOSIGNAL);
+ if (ret != (ssize_t)vSocks5.size()) {
CloseSocket(hSocket);
return error("Error sending to proxy");
}
char pchRet2[4];
- if (!InterruptibleRecv(pchRet2, 4, SOCKS5_RECV_TIMEOUT, hSocket))
- {
+ if (!InterruptibleRecv(pchRet2, 4, SOCKS5_RECV_TIMEOUT, hSocket)) {
CloseSocket(hSocket);
return error("Error reading proxy response");
}
- if (pchRet2[0] != 0x05)
- {
+ if (pchRet2[0] != 0x05) {
CloseSocket(hSocket);
return error("Proxy failed to accept request");
}
- if (pchRet2[1] != 0x00)
- {
+ if (pchRet2[1] != 0x00) {
CloseSocket(hSocket);
switch (pchRet2[1])
{
@@ -352,8 +392,7 @@ bool static Socks5(string strDest, int port, SOCKET& hSocket)
default: return error("Proxy error: unknown");
}
}
- if (pchRet2[2] != 0x00)
- {
+ if (pchRet2[2] != 0x00) {
CloseSocket(hSocket);
return error("Error: malformed proxy response");
}
@@ -375,13 +414,11 @@ bool static Socks5(string strDest, int port, SOCKET& hSocket)
}
default: CloseSocket(hSocket); return error("Error: malformed proxy response");
}
- if (!ret)
- {
+ if (!ret) {
CloseSocket(hSocket);
return error("Error reading from proxy");
}
- if (!InterruptibleRecv(pchRet3, 2, SOCKS5_RECV_TIMEOUT, hSocket))
- {
+ if (!InterruptibleRecv(pchRet3, 2, SOCKS5_RECV_TIMEOUT, hSocket)) {
CloseSocket(hSocket);
return error("Error reading from proxy");
}
@@ -471,7 +508,7 @@ bool static ConnectSocketDirectly(const CService &addrConnect, SOCKET& hSocketRe
return true;
}
-bool SetProxy(enum Network net, CService addrProxy) {
+bool SetProxy(enum Network net, const proxyType &addrProxy) {
assert(net >= 0 && net < NET_MAX);
if (!addrProxy.IsValid())
return false;
@@ -489,7 +526,7 @@ bool GetProxy(enum Network net, proxyType &proxyInfoOut) {
return true;
}
-bool SetNameProxy(CService addrProxy) {
+bool SetNameProxy(const proxyType &addrProxy) {
if (!addrProxy.IsValid())
return false;
LOCK(cs_proxyInfos);
@@ -497,7 +534,7 @@ bool SetNameProxy(CService addrProxy) {
return true;
}
-bool GetNameProxy(CService &nameProxyOut) {
+bool GetNameProxy(proxyType &nameProxyOut) {
LOCK(cs_proxyInfos);
if(!nameProxy.IsValid())
return false;
@@ -513,50 +550,60 @@ bool HaveNameProxy() {
bool IsProxy(const CNetAddr &addr) {
LOCK(cs_proxyInfos);
for (int i = 0; i < NET_MAX; i++) {
- if (addr == (CNetAddr)proxyInfo[i])
+ if (addr == (CNetAddr)proxyInfo[i].proxy)
return true;
}
return false;
}
-bool ConnectSocket(const CService &addrDest, SOCKET& hSocketRet, int nTimeout, bool *outProxyConnectionFailed)
+static bool ConnectThroughProxy(const proxyType &proxy, const std::string& strDest, int port, SOCKET& hSocketRet, int nTimeout, bool *outProxyConnectionFailed)
{
- proxyType proxy;
- if (outProxyConnectionFailed)
- *outProxyConnectionFailed = false;
- // no proxy needed (none set for target network)
- if (!GetProxy(addrDest.GetNetwork(), proxy))
- return ConnectSocketDirectly(addrDest, hSocketRet, nTimeout);
-
SOCKET hSocket = INVALID_SOCKET;
-
// first connect to proxy server
- if (!ConnectSocketDirectly(proxy, hSocket, nTimeout)) {
+ if (!ConnectSocketDirectly(proxy.proxy, hSocket, nTimeout)) {
if (outProxyConnectionFailed)
*outProxyConnectionFailed = true;
return false;
}
// do socks negotiation
- if (!Socks5(addrDest.ToStringIP(), addrDest.GetPort(), hSocket))
- return false;
+ if (proxy.randomize_credentials) {
+ ProxyCredentials random_auth;
+ random_auth.username = strprintf("%i", insecure_rand());
+ random_auth.password = strprintf("%i", insecure_rand());
+ if (!Socks5(strDest, (unsigned short)port, &random_auth, hSocket))
+ return false;
+ } else {
+ if (!Socks5(strDest, (unsigned short)port, 0, hSocket))
+ return false;
+ }
hSocketRet = hSocket;
return true;
}
+bool ConnectSocket(const CService &addrDest, SOCKET& hSocketRet, int nTimeout, bool *outProxyConnectionFailed)
+{
+ proxyType proxy;
+ if (outProxyConnectionFailed)
+ *outProxyConnectionFailed = false;
+
+ if (GetProxy(addrDest.GetNetwork(), proxy))
+ return ConnectThroughProxy(proxy, addrDest.ToStringIP(), addrDest.GetPort(), hSocketRet, nTimeout, outProxyConnectionFailed);
+ else // no proxy needed (none set for target network)
+ return ConnectSocketDirectly(addrDest, hSocketRet, nTimeout);
+}
+
bool ConnectSocketByName(CService &addr, SOCKET& hSocketRet, const char *pszDest, int portDefault, int nTimeout, bool *outProxyConnectionFailed)
{
- string strDest;
+ std::string strDest;
int port = portDefault;
if (outProxyConnectionFailed)
*outProxyConnectionFailed = false;
- SplitHostPort(string(pszDest), port, strDest);
+ SplitHostPort(std::string(pszDest), port, strDest);
- SOCKET hSocket = INVALID_SOCKET;
-
- CService nameProxy;
+ proxyType nameProxy;
GetNameProxy(nameProxy);
CService addrResolved(CNetAddr(strDest, fNameLookup && !HaveNameProxy()), port);
@@ -569,18 +616,7 @@ bool ConnectSocketByName(CService &addr, SOCKET& hSocketRet, const char *pszDest
if (!HaveNameProxy())
return false;
- // first connect to name proxy server
- if (!ConnectSocketDirectly(nameProxy, hSocket, nTimeout)) {
- if (outProxyConnectionFailed)
- *outProxyConnectionFailed = true;
- return false;
- }
- // do socks negotiation
- if (!Socks5(strDest, (unsigned short)port, hSocket))
- return false;
-
- hSocketRet = hSocket;
- return true;
+ return ConnectThroughProxy(nameProxy, strDest, port, hSocketRet, nTimeout, outProxyConnectionFailed);
}
void CNetAddr::Init()
@@ -1214,15 +1250,15 @@ CSubNet::CSubNet(const std::string &strSubnet, bool fAllowLookup)
std::string strNetmask = strSubnet.substr(slash + 1);
int32_t n;
// IPv4 addresses start at offset 12, and first 12 bytes must match, so just offset n
- int noffset = network.IsIPv4() ? (12 * 8) : 0;
+ const int astartofs = network.IsIPv4() ? 12 : 0;
if (ParseInt32(strNetmask, &n)) // If valid number, assume /24 symtex
{
- if(n >= 0 && n <= (128 - noffset)) // Only valid if in range of bits of address
+ if(n >= 0 && n <= (128 - astartofs*8)) // Only valid if in range of bits of address
{
- n += noffset;
+ n += astartofs*8;
// Clear bits [n..127]
for (; n < 128; ++n)
- netmask[n>>3] &= ~(1<<(n&7));
+ netmask[n>>3] &= ~(1<<(7-(n&7)));
}
else
{
@@ -1233,12 +1269,10 @@ CSubNet::CSubNet(const std::string &strSubnet, bool fAllowLookup)
{
if (LookupHost(strNetmask.c_str(), vIP, 1, false)) // Never allow lookup for netmask
{
- // Remember: GetByte returns bytes in reversed order
// Copy only the *last* four bytes in case of IPv4, the rest of the mask should stay 1's as
// we don't want pchIPv4 to be part of the mask.
- int asize = network.IsIPv4() ? 4 : 16;
- for(int x=0; x<asize; ++x)
- netmask[15-x] = vIP[0].GetByte(x);
+ for(int x=astartofs; x<16; ++x)
+ netmask[x] = vIP[0].ip[x];
}
else
{
@@ -1251,6 +1285,10 @@ CSubNet::CSubNet(const std::string &strSubnet, bool fAllowLookup)
{
valid = false;
}
+
+ // Normalize network according to netmask
+ for(int x=0; x<16; ++x)
+ network.ip[x] &= netmask[x];
}
bool CSubNet::Match(const CNetAddr &addr) const
@@ -1258,7 +1296,7 @@ bool CSubNet::Match(const CNetAddr &addr) const
if (!valid || !addr.IsValid())
return false;
for(int x=0; x<16; ++x)
- if ((addr.GetByte(x) & netmask[15-x]) != network.GetByte(x))
+ if ((addr.ip[x] & netmask[x]) != network.ip[x])
return false;
return true;
}
@@ -1292,6 +1330,11 @@ bool operator!=(const CSubNet& a, const CSubNet& b)
return !(a==b);
}
+bool operator<(const CSubNet& a, const CSubNet& b)
+{
+ return (a.network < b.network || (a.network == b.network && memcmp(a.netmask, b.netmask, 16) < 0));
+}
+
#ifdef WIN32
std::string NetworkErrorString(int err)
{
diff --git a/src/netbase.h b/src/netbase.h
index b42c2dffa4..27f0eac2a2 100644
--- a/src/netbase.h
+++ b/src/netbase.h
@@ -100,6 +100,8 @@ class CNetAddr
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
READWRITE(FLATDATA(ip));
}
+
+ friend class CSubNet;
};
class CSubNet
@@ -123,6 +125,7 @@ class CSubNet
friend bool operator==(const CSubNet& a, const CSubNet& b);
friend bool operator!=(const CSubNet& a, const CSubNet& b);
+ friend bool operator<(const CSubNet& a, const CSubNet& b);
};
/** A combination of a network address (CNetAddr) and a (TCP) port */
@@ -168,15 +171,25 @@ class CService : public CNetAddr
}
};
-typedef CService proxyType;
+class proxyType
+{
+public:
+ proxyType(): randomize_credentials(false) {}
+ proxyType(const CService &proxy, bool randomize_credentials=false): proxy(proxy), randomize_credentials(randomize_credentials) {}
+
+ bool IsValid() const { return proxy.IsValid(); }
+
+ CService proxy;
+ bool randomize_credentials;
+};
enum Network ParseNetwork(std::string net);
std::string GetNetworkName(enum Network net);
void SplitHostPort(std::string in, int &portOut, std::string &hostOut);
-bool SetProxy(enum Network net, CService addrProxy);
+bool SetProxy(enum Network net, const proxyType &addrProxy);
bool GetProxy(enum Network net, proxyType &proxyInfoOut);
bool IsProxy(const CNetAddr &addr);
-bool SetNameProxy(CService addrProxy);
+bool SetNameProxy(const proxyType &addrProxy);
bool HaveNameProxy();
bool LookupHost(const char *pszName, std::vector<CNetAddr>& vIP, unsigned int nMaxSolutions = 0, bool fAllowLookup = true);
bool Lookup(const char *pszName, CService& addr, int portDefault = 0, bool fAllowLookup = true);
diff --git a/src/policy/fees.cpp b/src/policy/fees.cpp
new file mode 100644
index 0000000000..b1491cec01
--- /dev/null
+++ b/src/policy/fees.cpp
@@ -0,0 +1,529 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// Copyright (c) 2009-2015 The Bitcoin 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 "amount.h"
+#include "primitives/transaction.h"
+#include "streams.h"
+#include "txmempool.h"
+#include "util.h"
+
+void TxConfirmStats::Initialize(std::vector<double>& defaultBuckets,
+ unsigned int maxConfirms, double _decay, std::string _dataTypeString)
+{
+ decay = _decay;
+ dataTypeString = _dataTypeString;
+ for (unsigned int i = 0; i < defaultBuckets.size(); i++) {
+ buckets.push_back(defaultBuckets[i]);
+ bucketMap[defaultBuckets[i]] = i;
+ }
+ confAvg.resize(maxConfirms);
+ curBlockConf.resize(maxConfirms);
+ unconfTxs.resize(maxConfirms);
+ for (unsigned int i = 0; i < maxConfirms; i++) {
+ confAvg[i].resize(buckets.size());
+ curBlockConf[i].resize(buckets.size());
+ unconfTxs[i].resize(buckets.size());
+ }
+
+ oldUnconfTxs.resize(buckets.size());
+ curBlockTxCt.resize(buckets.size());
+ txCtAvg.resize(buckets.size());
+ curBlockVal.resize(buckets.size());
+ avg.resize(buckets.size());
+}
+
+// Zero out the data for the current block
+void TxConfirmStats::ClearCurrent(unsigned int nBlockHeight)
+{
+ for (unsigned int j = 0; j < buckets.size(); j++) {
+ oldUnconfTxs[j] += unconfTxs[nBlockHeight%unconfTxs.size()][j];
+ unconfTxs[nBlockHeight%unconfTxs.size()][j] = 0;
+ for (unsigned int i = 0; i < curBlockConf.size(); i++)
+ curBlockConf[i][j] = 0;
+ curBlockTxCt[j] = 0;
+ curBlockVal[j] = 0;
+ }
+}
+
+
+void TxConfirmStats::Record(int blocksToConfirm, double val)
+{
+ // blocksToConfirm is 1-based
+ if (blocksToConfirm < 1)
+ return;
+ unsigned int bucketindex = bucketMap.lower_bound(val)->second;
+ for (size_t i = blocksToConfirm; i <= curBlockConf.size(); i++) {
+ curBlockConf[i - 1][bucketindex]++;
+ }
+ curBlockTxCt[bucketindex]++;
+ curBlockVal[bucketindex] += val;
+}
+
+void TxConfirmStats::UpdateMovingAverages()
+{
+ for (unsigned int j = 0; j < buckets.size(); j++) {
+ for (unsigned int i = 0; i < confAvg.size(); i++)
+ confAvg[i][j] = confAvg[i][j] * decay + curBlockConf[i][j];
+ avg[j] = avg[j] * decay + curBlockVal[j];
+ txCtAvg[j] = txCtAvg[j] * decay + curBlockTxCt[j];
+ }
+}
+
+// returns -1 on error conditions
+double TxConfirmStats::EstimateMedianVal(int confTarget, double sufficientTxVal,
+ double successBreakPoint, bool requireGreater,
+ unsigned int nBlockHeight)
+{
+ // Counters for a bucket (or range of buckets)
+ double nConf = 0; // Number of tx's confirmed within the confTarget
+ double totalNum = 0; // Total number of tx's that were ever confirmed
+ int extraNum = 0; // Number of tx's still in mempool for confTarget or longer
+
+ int maxbucketindex = buckets.size() - 1;
+
+ // requireGreater means we are looking for the lowest fee/priority such that all higher
+ // values pass, so we start at maxbucketindex (highest fee) and look at succesively
+ // smaller buckets until we reach failure. Otherwise, we are looking for the highest
+ // fee/priority such that all lower values fail, and we go in the opposite direction.
+ unsigned int startbucket = requireGreater ? maxbucketindex : 0;
+ int step = requireGreater ? -1 : 1;
+
+ // We'll combine buckets until we have enough samples.
+ // The near and far variables will define the range we've combined
+ // The best variables are the last range we saw which still had a high
+ // enough confirmation rate to count as success.
+ // The cur variables are the current range we're counting.
+ unsigned int curNearBucket = startbucket;
+ unsigned int bestNearBucket = startbucket;
+ unsigned int curFarBucket = startbucket;
+ unsigned int bestFarBucket = startbucket;
+
+ bool foundAnswer = false;
+ unsigned int bins = unconfTxs.size();
+
+ // Start counting from highest(default) or lowest fee/pri transactions
+ for (int bucket = startbucket; bucket >= 0 && bucket <= maxbucketindex; bucket += step) {
+ curFarBucket = bucket;
+ nConf += confAvg[confTarget - 1][bucket];
+ totalNum += txCtAvg[bucket];
+ for (unsigned int confct = confTarget; confct < GetMaxConfirms(); confct++)
+ extraNum += unconfTxs[(nBlockHeight - confct)%bins][bucket];
+ extraNum += oldUnconfTxs[bucket];
+ // If we have enough transaction data points in this range of buckets,
+ // we can test for success
+ // (Only count the confirmed data points, so that each confirmation count
+ // will be looking at the same amount of data and same bucket breaks)
+ if (totalNum >= sufficientTxVal / (1 - decay)) {
+ double curPct = nConf / (totalNum + extraNum);
+
+ // Check to see if we are no longer getting confirmed at the success rate
+ if (requireGreater && curPct < successBreakPoint)
+ break;
+ if (!requireGreater && curPct > successBreakPoint)
+ break;
+
+ // Otherwise update the cumulative stats, and the bucket variables
+ // and reset the counters
+ else {
+ foundAnswer = true;
+ nConf = 0;
+ totalNum = 0;
+ extraNum = 0;
+ bestNearBucket = curNearBucket;
+ bestFarBucket = curFarBucket;
+ curNearBucket = bucket + step;
+ }
+ }
+ }
+
+ double median = -1;
+ double txSum = 0;
+
+ // Calculate the "average" fee of the best bucket range that met success conditions
+ // Find the bucket with the median transaction and then report the average fee from that bucket
+ // This is a compromise between finding the median which we can't since we don't save all tx's
+ // and reporting the average which is less accurate
+ unsigned int minBucket = bestNearBucket < bestFarBucket ? bestNearBucket : bestFarBucket;
+ unsigned int maxBucket = bestNearBucket > bestFarBucket ? bestNearBucket : bestFarBucket;
+ for (unsigned int j = minBucket; j <= maxBucket; j++) {
+ txSum += txCtAvg[j];
+ }
+ if (foundAnswer && txSum != 0) {
+ txSum = txSum / 2;
+ for (unsigned int j = minBucket; j <= maxBucket; j++) {
+ if (txCtAvg[j] < txSum)
+ txSum -= txCtAvg[j];
+ else { // we're in the right bucket
+ median = avg[j] / txCtAvg[j];
+ break;
+ }
+ }
+ }
+
+ LogPrint("estimatefee", "%3d: For conf success %s %4.2f need %s %s: %12.5g from buckets %8g - %8g Cur Bucket stats %6.2f%% %8.1f/(%.1f+%d mempool)\n",
+ confTarget, requireGreater ? ">" : "<", successBreakPoint, dataTypeString,
+ requireGreater ? ">" : "<", median, buckets[minBucket], buckets[maxBucket],
+ 100 * nConf / (totalNum + extraNum), nConf, totalNum, extraNum);
+
+ return median;
+}
+
+void TxConfirmStats::Write(CAutoFile& fileout)
+{
+ fileout << decay;
+ fileout << buckets;
+ fileout << avg;
+ fileout << txCtAvg;
+ fileout << confAvg;
+}
+
+void TxConfirmStats::Read(CAutoFile& filein)
+{
+ // Read data file into temporary variables and do some very basic sanity checking
+ std::vector<double> fileBuckets;
+ std::vector<double> fileAvg;
+ std::vector<std::vector<double> > fileConfAvg;
+ std::vector<double> fileTxCtAvg;
+ double fileDecay;
+ size_t maxConfirms;
+ size_t numBuckets;
+
+ filein >> fileDecay;
+ if (fileDecay <= 0 || fileDecay >= 1)
+ throw std::runtime_error("Corrupt estimates file. Decay must be between 0 and 1 (non-inclusive)");
+ filein >> fileBuckets;
+ numBuckets = fileBuckets.size();
+ if (numBuckets <= 1 || numBuckets > 1000)
+ throw std::runtime_error("Corrupt estimates file. Must have between 2 and 1000 fee/pri buckets");
+ filein >> fileAvg;
+ if (fileAvg.size() != numBuckets)
+ throw std::runtime_error("Corrupt estimates file. Mismatch in fee/pri average bucket count");
+ filein >> fileTxCtAvg;
+ if (fileTxCtAvg.size() != numBuckets)
+ throw std::runtime_error("Corrupt estimates file. Mismatch in tx count bucket count");
+ filein >> fileConfAvg;
+ maxConfirms = fileConfAvg.size();
+ if (maxConfirms <= 0 || maxConfirms > 6 * 24 * 7) // one week
+ throw std::runtime_error("Corrupt estimates file. Must maintain estimates for between 1 and 1008 (one week) confirms");
+ for (unsigned int i = 0; i < maxConfirms; i++) {
+ if (fileConfAvg[i].size() != numBuckets)
+ throw std::runtime_error("Corrupt estimates file. Mismatch in fee/pri conf average bucket count");
+ }
+ // Now that we've processed the entire fee estimate data file and not
+ // thrown any errors, we can copy it to our data structures
+ decay = fileDecay;
+ buckets = fileBuckets;
+ avg = fileAvg;
+ confAvg = fileConfAvg;
+ txCtAvg = fileTxCtAvg;
+ bucketMap.clear();
+
+ // Resize the current block variables which aren't stored in the data file
+ // to match the number of confirms and buckets
+ curBlockConf.resize(maxConfirms);
+ for (unsigned int i = 0; i < maxConfirms; i++) {
+ curBlockConf[i].resize(buckets.size());
+ }
+ curBlockTxCt.resize(buckets.size());
+ curBlockVal.resize(buckets.size());
+
+ unconfTxs.resize(maxConfirms);
+ for (unsigned int i = 0; i < maxConfirms; i++) {
+ unconfTxs[i].resize(buckets.size());
+ }
+ oldUnconfTxs.resize(buckets.size());
+
+ for (unsigned int i = 0; i < buckets.size(); i++)
+ bucketMap[buckets[i]] = i;
+
+ LogPrint("estimatefee", "Reading estimates: %u %s buckets counting confirms up to %u blocks\n",
+ numBuckets, dataTypeString, maxConfirms);
+}
+
+unsigned int TxConfirmStats::NewTx(unsigned int nBlockHeight, double val)
+{
+ unsigned int bucketindex = bucketMap.lower_bound(val)->second;
+ unsigned int blockIndex = nBlockHeight % unconfTxs.size();
+ unconfTxs[blockIndex][bucketindex]++;
+ LogPrint("estimatefee", "adding to %s\n", dataTypeString);
+ return bucketindex;
+}
+
+void TxConfirmStats::removeTx(unsigned int entryHeight, unsigned int nBestSeenHeight, unsigned int bucketindex)
+{
+ //nBestSeenHeight is not updated yet for the new block
+ int blocksAgo = nBestSeenHeight - entryHeight;
+ if (nBestSeenHeight == 0) // the BlockPolicyEstimator hasn't seen any blocks yet
+ blocksAgo = 0;
+ if (blocksAgo < 0) {
+ LogPrint("estimatefee", "Blockpolicy error, blocks ago is negative for mempool tx\n");
+ return; //This can't happen becasue we call this with our best seen height, no entries can have higher
+ }
+
+ if (blocksAgo >= (int)unconfTxs.size()) {
+ if (oldUnconfTxs[bucketindex] > 0)
+ oldUnconfTxs[bucketindex]--;
+ else
+ LogPrint("estimatefee", "Blockpolicy error, mempool tx removed from >25 blocks,bucketIndex=%u already\n",
+ bucketindex);
+ }
+ else {
+ unsigned int blockIndex = entryHeight % unconfTxs.size();
+ if (unconfTxs[blockIndex][bucketindex] > 0)
+ unconfTxs[blockIndex][bucketindex]--;
+ else
+ LogPrint("estimatefee", "Blockpolicy error, mempool tx removed from blockIndex=%u,bucketIndex=%u already\n",
+ blockIndex, bucketindex);
+ }
+}
+
+void CBlockPolicyEstimator::removeTx(uint256 hash)
+{
+ std::map<uint256, TxStatsInfo>::iterator pos = mapMemPoolTxs.find(hash);
+ if (pos == mapMemPoolTxs.end()) {
+ LogPrint("estimatefee", "Blockpolicy error mempool tx %s not found for removeTx\n",
+ hash.ToString().c_str());
+ return;
+ }
+ TxConfirmStats *stats = pos->second.stats;
+ unsigned int entryHeight = pos->second.blockHeight;
+ unsigned int bucketIndex = pos->second.bucketIndex;
+
+ if (stats != NULL)
+ stats->removeTx(entryHeight, nBestSeenHeight, bucketIndex);
+ mapMemPoolTxs.erase(hash);
+}
+
+CBlockPolicyEstimator::CBlockPolicyEstimator(const CFeeRate& _minRelayFee)
+ : nBestSeenHeight(0)
+{
+ minTrackedFee = _minRelayFee < CFeeRate(MIN_FEERATE) ? CFeeRate(MIN_FEERATE) : _minRelayFee;
+ std::vector<double> vfeelist;
+ for (double bucketBoundary = minTrackedFee.GetFeePerK(); bucketBoundary <= MAX_FEERATE; bucketBoundary *= FEE_SPACING) {
+ vfeelist.push_back(bucketBoundary);
+ }
+ vfeelist.push_back(INF_FEERATE);
+ feeStats.Initialize(vfeelist, MAX_BLOCK_CONFIRMS, DEFAULT_DECAY, "FeeRate");
+
+ minTrackedPriority = AllowFreeThreshold() < MIN_PRIORITY ? MIN_PRIORITY : AllowFreeThreshold();
+ std::vector<double> vprilist;
+ for (double bucketBoundary = minTrackedPriority; bucketBoundary <= MAX_PRIORITY; bucketBoundary *= PRI_SPACING) {
+ vprilist.push_back(bucketBoundary);
+ }
+ vprilist.push_back(INF_PRIORITY);
+ priStats.Initialize(vprilist, MAX_BLOCK_CONFIRMS, DEFAULT_DECAY, "Priority");
+
+ feeUnlikely = CFeeRate(0);
+ feeLikely = CFeeRate(INF_FEERATE);
+ priUnlikely = 0;
+ priLikely = INF_PRIORITY;
+}
+
+bool CBlockPolicyEstimator::isFeeDataPoint(const CFeeRate &fee, double pri)
+{
+ if ((pri < minTrackedPriority && fee >= minTrackedFee) ||
+ (pri < priUnlikely && fee > feeLikely)) {
+ return true;
+ }
+ return false;
+}
+
+bool CBlockPolicyEstimator::isPriDataPoint(const CFeeRate &fee, double pri)
+{
+ if ((fee < minTrackedFee && pri >= minTrackedPriority) ||
+ (fee < feeUnlikely && pri > priLikely)) {
+ return true;
+ }
+ return false;
+}
+
+void CBlockPolicyEstimator::processTransaction(const CTxMemPoolEntry& entry, bool fCurrentEstimate)
+{
+ unsigned int txHeight = entry.GetHeight();
+ uint256 hash = entry.GetTx().GetHash();
+ if (mapMemPoolTxs[hash].stats != NULL) {
+ LogPrint("estimatefee", "Blockpolicy error mempool tx %s already being tracked\n",
+ hash.ToString().c_str());
+ return;
+ }
+
+ if (txHeight < nBestSeenHeight) {
+ // Ignore side chains and re-orgs; assuming they are random they don't
+ // affect the estimate. We'll potentially double count transactions in 1-block reorgs.
+ return;
+ }
+
+ // Only want to be updating estimates when our blockchain is synced,
+ // otherwise we'll miscalculate how many blocks its taking to get included.
+ if (!fCurrentEstimate)
+ return;
+
+ if (!entry.WasClearAtEntry()) {
+ // This transaction depends on other transactions in the mempool to
+ // be included in a block before it will be able to be included, so
+ // we shouldn't include it in our calculations
+ return;
+ }
+
+ // Fees are stored and reported as BTC-per-kb:
+ CFeeRate feeRate(entry.GetFee(), entry.GetTxSize());
+
+ // Want the priority of the tx at confirmation. However we don't know
+ // what that will be and its too hard to continue updating it
+ // so use starting priority as a proxy
+ double curPri = entry.GetPriority(txHeight);
+ mapMemPoolTxs[hash].blockHeight = txHeight;
+
+ LogPrint("estimatefee", "Blockpolicy mempool tx %s ", hash.ToString().substr(0,10));
+ // Record this as a priority estimate
+ if (entry.GetFee() == 0 || isPriDataPoint(feeRate, curPri)) {
+ mapMemPoolTxs[hash].stats = &priStats;
+ mapMemPoolTxs[hash].bucketIndex = priStats.NewTx(txHeight, curPri);
+ }
+ // Record this as a fee estimate
+ else if (isFeeDataPoint(feeRate, curPri)) {
+ mapMemPoolTxs[hash].stats = &feeStats;
+ mapMemPoolTxs[hash].bucketIndex = feeStats.NewTx(txHeight, (double)feeRate.GetFeePerK());
+ }
+ else {
+ LogPrint("estimatefee", "not adding\n");
+ }
+}
+
+void CBlockPolicyEstimator::processBlockTx(unsigned int nBlockHeight, const CTxMemPoolEntry& entry)
+{
+ if (!entry.WasClearAtEntry()) {
+ // This transaction depended on other transactions in the mempool to
+ // be included in a block before it was able to be included, so
+ // we shouldn't include it in our calculations
+ return;
+ }
+
+ // How many blocks did it take for miners to include this transaction?
+ // blocksToConfirm is 1-based, so a transaction included in the earliest
+ // possible block has confirmation count of 1
+ int blocksToConfirm = nBlockHeight - entry.GetHeight();
+ 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("estimatefee", "Blockpolicy error Transaction had negative blocksToConfirm\n");
+ return;
+ }
+
+ // Fees are stored and reported as BTC-per-kb:
+ CFeeRate feeRate(entry.GetFee(), entry.GetTxSize());
+
+ // Want the priority of the tx at confirmation. The priority when it
+ // entered the mempool could easily be very small and change quickly
+ double curPri = entry.GetPriority(nBlockHeight);
+
+ // Record this as a priority estimate
+ if (entry.GetFee() == 0 || isPriDataPoint(feeRate, curPri)) {
+ priStats.Record(blocksToConfirm, curPri);
+ }
+ // Record this as a fee estimate
+ else if (isFeeDataPoint(feeRate, curPri)) {
+ feeStats.Record(blocksToConfirm, (double)feeRate.GetFeePerK());
+ }
+}
+
+void CBlockPolicyEstimator::processBlock(unsigned int nBlockHeight,
+ std::vector<CTxMemPoolEntry>& entries, bool fCurrentEstimate)
+{
+ if (nBlockHeight <= nBestSeenHeight) {
+ // Ignore side chains and re-orgs; assuming they are random
+ // they don't affect the estimate.
+ // And if an attacker can re-org the chain at will, then
+ // you've got much bigger problems than "attacker can influence
+ // transaction fees."
+ return;
+ }
+ nBestSeenHeight = nBlockHeight;
+
+ // Only want to be updating estimates when our blockchain is synced,
+ // otherwise we'll miscalculate how many blocks its taking to get included.
+ if (!fCurrentEstimate)
+ return;
+
+ // Update the dynamic cutoffs
+ // a fee/priority is "likely" the reason your tx was included in a block if >85% of such tx's
+ // were confirmed in 2 blocks and is "unlikely" if <50% were confirmed in 10 blocks
+ LogPrint("estimatefee", "Blockpolicy recalculating dynamic cutoffs:\n");
+ priLikely = priStats.EstimateMedianVal(2, SUFFICIENT_PRITXS, MIN_SUCCESS_PCT, true, nBlockHeight);
+ if (priLikely == -1)
+ priLikely = INF_PRIORITY;
+
+ double feeLikelyEst = feeStats.EstimateMedianVal(2, SUFFICIENT_FEETXS, MIN_SUCCESS_PCT, true, nBlockHeight);
+ if (feeLikelyEst == -1)
+ feeLikely = CFeeRate(INF_FEERATE);
+ else
+ feeLikely = CFeeRate(feeLikelyEst);
+
+ priUnlikely = priStats.EstimateMedianVal(10, SUFFICIENT_PRITXS, UNLIKELY_PCT, false, nBlockHeight);
+ if (priUnlikely == -1)
+ priUnlikely = 0;
+
+ double feeUnlikelyEst = feeStats.EstimateMedianVal(10, SUFFICIENT_FEETXS, UNLIKELY_PCT, false, nBlockHeight);
+ if (feeUnlikelyEst == -1)
+ feeUnlikely = CFeeRate(0);
+ else
+ feeUnlikely = CFeeRate(feeUnlikelyEst);
+
+ // Clear the current block states
+ feeStats.ClearCurrent(nBlockHeight);
+ priStats.ClearCurrent(nBlockHeight);
+
+ // Repopulate the current block states
+ for (unsigned int i = 0; i < entries.size(); i++)
+ processBlockTx(nBlockHeight, entries[i]);
+
+ // Update all exponential averages with the current block states
+ feeStats.UpdateMovingAverages();
+ priStats.UpdateMovingAverages();
+
+ LogPrint("estimatefee", "Blockpolicy after updating estimates for %u confirmed entries, new mempool map size %u\n",
+ entries.size(), mapMemPoolTxs.size());
+}
+
+CFeeRate CBlockPolicyEstimator::estimateFee(int confTarget)
+{
+ // Return failure if trying to analyze a target we're not tracking
+ if (confTarget <= 0 || (unsigned int)confTarget > feeStats.GetMaxConfirms())
+ return CFeeRate(0);
+
+ double median = feeStats.EstimateMedianVal(confTarget, SUFFICIENT_FEETXS, MIN_SUCCESS_PCT, true, nBestSeenHeight);
+
+ if (median < 0)
+ return CFeeRate(0);
+
+ return CFeeRate(median);
+}
+
+double CBlockPolicyEstimator::estimatePriority(int confTarget)
+{
+ // Return failure if trying to analyze a target we're not tracking
+ if (confTarget <= 0 || (unsigned int)confTarget > priStats.GetMaxConfirms())
+ return -1;
+
+ return priStats.EstimateMedianVal(confTarget, SUFFICIENT_PRITXS, MIN_SUCCESS_PCT, true, nBestSeenHeight);
+}
+
+void CBlockPolicyEstimator::Write(CAutoFile& fileout)
+{
+ fileout << nBestSeenHeight;
+ feeStats.Write(fileout);
+ priStats.Write(fileout);
+}
+
+void CBlockPolicyEstimator::Read(CAutoFile& filein)
+{
+ int nFileBestSeenHeight;
+ filein >> nFileBestSeenHeight;
+ feeStats.Read(filein);
+ priStats.Read(filein);
+ nBestSeenHeight = nFileBestSeenHeight;
+}
diff --git a/src/policy/fees.h b/src/policy/fees.h
new file mode 100644
index 0000000000..ce4d782566
--- /dev/null
+++ b/src/policy/fees.h
@@ -0,0 +1,276 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// Copyright (c) 2009-2015 The Bitcoin developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#ifndef BITCOIN_POLICYESTIMATOR_H
+#define BITCOIN_POLICYESTIMATOR_H
+
+#include "amount.h"
+#include "uint256.h"
+
+#include <map>
+#include <string>
+#include <vector>
+
+class CAutoFile;
+class CFeeRate;
+class CTxMemPoolEntry;
+
+/** \class CBlockPolicyEstimator
+ * The BlockPolicyEstimator is used for estimating the fee or priority needed
+ * for a transaction to be included in a block within a certain number of
+ * blocks.
+ *
+ * At a high level the algorithm works by grouping transactions into buckets
+ * based on having similar priorities or fees and then tracking how long it
+ * takes transactions in the various buckets to be mined. It operates under
+ * the assumption that in general transactions of higher fee/priority will be
+ * included in blocks before transactions of lower fee/priority. So for
+ * example if you wanted to know what fee you should put on a transaction to
+ * be included in a block within the next 5 blocks, you would start by looking
+ * at the bucket with with the highest fee transactions and verifying that a
+ * sufficiently high percentage of them were confirmed within 5 blocks and
+ * then you would look at the next highest fee bucket, and so on, stopping at
+ * the last bucket to pass the test. The average fee of transactions in this
+ * bucket will give you an indication of the lowest fee you can put on a
+ * transaction and still have a sufficiently high chance of being confirmed
+ * within your desired 5 blocks.
+ *
+ * When a transaction enters the mempool or is included within a block we
+ * decide whether it can be used as a data point for fee estimation, priority
+ * estimation or neither. If the value of exactly one of those properties was
+ * below the required minimum it can be used to estimate the other. In
+ * addition, if a priori our estimation code would indicate that the
+ * transaction would be much more quickly included in a block because of one
+ * of the properties compared to the other, we can also decide to use it as
+ * an estimate for that property.
+ *
+ * Here is a brief description of the implementation for fee estimation.
+ * When a transaction that counts for fee estimation enters the mempool, we
+ * track the height of the block chain at entry. Whenever a block comes in,
+ * we count the number of transactions in each bucket and the total amount of fee
+ * paid in each bucket. Then we calculate how many blocks Y it took each
+ * transaction to be mined and we track an array of counters in each bucket
+ * for how long it to took transactions to get confirmed from 1 to a max of 25
+ * and we increment all the counters from Y up to 25. This is because for any
+ * number Z>=Y the transaction was successfully mined within Z blocks. We
+ * want to save a history of this information, so at any time we have a
+ * counter of the total number of transactions that happened in a given fee
+ * bucket and the total number that were confirmed in each number 1-25 blocks
+ * or less for any bucket. We save this history by keeping an exponentially
+ * decaying moving average of each one of these stats. Furthermore we also
+ * keep track of the number unmined (in mempool) transactions in each bucket
+ * and for how many blocks they have been outstanding and use that to increase
+ * the number of transactions we've seen in that fee bucket when calculating
+ * an estimate for any number of confirmations below the number of blocks
+ * they've been outstanding.
+ */
+
+/**
+ * We will instantiate two instances of this class, one to track transactions
+ * that were included in a block due to fee, and one for tx's included due to
+ * priority. We will lump transactions into a bucket according to their approximate
+ * fee or priority and then track how long it took for those txs to be included in a block
+ *
+ * The tracking of unconfirmed (mempool) transactions is completely independent of the
+ * historical tracking of transactions that have been confirmed in a block.
+ */
+class TxConfirmStats
+{
+private:
+ //Define the buckets we will group transactions into (both fee buckets and priority buckets)
+ std::vector<double> buckets; // The upper-bound of the range for the bucket (inclusive)
+ std::map<double, unsigned int> bucketMap; // Map of bucket upper-bound to index into all vectors by bucket
+
+ // For each bucket X:
+ // Count the total # of txs in each bucket
+ // Track the historical moving average of this total over blocks
+ std::vector<double> txCtAvg;
+ // and calcuate the total for the current block to update the moving average
+ std::vector<int> curBlockTxCt;
+
+ // Count the total # of txs confirmed within Y blocks in each bucket
+ // Track the historical moving average of theses totals over blocks
+ std::vector<std::vector<double> > confAvg; // confAvg[Y][X]
+ // and calcuate the totals for the current block to update the moving averages
+ std::vector<std::vector<int> > curBlockConf; // curBlockConf[Y][X]
+
+ // Sum the total priority/fee of all tx's in each bucket
+ // Track the historical moving average of this total over blocks
+ std::vector<double> avg;
+ // and calculate the total for the current block to update the moving average
+ std::vector<double> curBlockVal;
+
+ // Combine the conf counts with tx counts to calculate the confirmation % for each Y,X
+ // Combine the total value with the tx counts to calculate the avg fee/priority per bucket
+
+ std::string dataTypeString;
+ double decay;
+
+ // Mempool counts of outstanding transactions
+ // For each bucket X, track the number of transactions in the mempool
+ // that are unconfirmed for each possible confirmation value Y
+ std::vector<std::vector<int> > unconfTxs; //unconfTxs[Y][X]
+ // transactions still unconfirmed after MAX_CONFIRMS for each bucket
+ std::vector<int> oldUnconfTxs;
+
+public:
+ /**
+ * Initialize the data structures. This is called by BlockPolicyEstimator's
+ * constructor with default values.
+ * @param defaultBuckets contains the upper limits for the bucket boundries
+ * @param maxConfirms max number of confirms to track
+ * @param decay how much to decay the historical moving average per block
+ * @param dataTypeString for logging purposes
+ */
+ void Initialize(std::vector<double>& defaultBuckets, unsigned int maxConfirms, double decay, std::string dataTypeString);
+
+ /** Clear the state of the curBlock variables to start counting for the new block */
+ void ClearCurrent(unsigned int nBlockHeight);
+
+ /**
+ * Record a new transaction data point in the current block stats
+ * @param blocksToConfirm the number of blocks it took this transaction to confirm
+ * @param val either the fee or the priority when entered of the transaction
+ * @warning blocksToConfirm is 1-based and has to be >= 1
+ */
+ void Record(int blocksToConfirm, double val);
+
+ /** Record a new transaction entering the mempool*/
+ unsigned int NewTx(unsigned int nBlockHeight, double val);
+
+ /** Remove a transaction from mempool tracking stats*/
+ void removeTx(unsigned int entryHeight, unsigned int nBestSeenHeight,
+ unsigned int bucketIndex);
+
+ /** Update our estimates by decaying our historical moving average and updating
+ with the data gathered from the current block */
+ void UpdateMovingAverages();
+
+ /**
+ * Calculate a fee or priority estimate. Find the lowest value bucket (or range of buckets
+ * to make sure we have enough data points) whose transactions still have sufficient likelihood
+ * of being confirmed within the target number of confirmations
+ * @param confTarget target number of confirmations
+ * @param sufficientTxVal required average number of transactions per block in a bucket range
+ * @param minSuccess the success probability we require
+ * @param requireGreater return the lowest fee/pri such that all higher values pass minSuccess OR
+ * return the highest fee/pri such that all lower values fail minSuccess
+ * @param nBlockHeight the current block height
+ */
+ double EstimateMedianVal(int confTarget, double sufficientTxVal,
+ double minSuccess, bool requireGreater, unsigned int nBlockHeight);
+
+ /** Return the max number of confirms we're tracking */
+ unsigned int GetMaxConfirms() { return confAvg.size(); }
+
+ /** Write state of estimation data to a file*/
+ void Write(CAutoFile& fileout);
+
+ /**
+ * Read saved state of estimation data from a file and replace all internal data structures and
+ * variables with this state.
+ */
+ void Read(CAutoFile& filein);
+};
+
+
+
+/** Track confirm delays up to 25 blocks, can't estimate beyond that */
+static const unsigned int MAX_BLOCK_CONFIRMS = 25;
+
+/** Decay of .998 is a half-life of 346 blocks or about 2.4 days */
+static const double DEFAULT_DECAY = .998;
+
+/** Require greater than 85% of X fee transactions to be confirmed within Y blocks for X to be big enough */
+static const double MIN_SUCCESS_PCT = .85;
+static const double UNLIKELY_PCT = .5;
+
+/** Require an avg of 1 tx in the combined fee bucket per block to have stat significance */
+static const double SUFFICIENT_FEETXS = 1;
+
+/** Require only an avg of 1 tx every 5 blocks in the combined pri bucket (way less pri txs) */
+static const double SUFFICIENT_PRITXS = .2;
+
+// Minimum and Maximum values for tracking fees and priorities
+static const double MIN_FEERATE = 10;
+static const double MAX_FEERATE = 1e7;
+static const double INF_FEERATE = MAX_MONEY;
+static const double MIN_PRIORITY = 10;
+static const double MAX_PRIORITY = 1e16;
+static const double INF_PRIORITY = 1e9 * MAX_MONEY;
+
+// We have to lump transactions into buckets based on fee or priority, but we want to be able
+// to give accurate estimates over a large range of potential fees and priorities
+// Therefore it makes sense to exponentially space the buckets
+/** Spacing of FeeRate buckets */
+static const double FEE_SPACING = 1.1;
+
+/** Spacing of Priority buckets */
+static const double PRI_SPACING = 2;
+
+/**
+ * We want to be able to estimate fees or priorities that are needed on tx's to be included in
+ * a certain number of blocks. Every time a block is added to the best chain, this class records
+ * stats on the transactions included in that block
+ */
+class CBlockPolicyEstimator
+{
+public:
+ /** Create new BlockPolicyEstimator and initialize stats tracking classes with default values */
+ CBlockPolicyEstimator(const CFeeRate& minRelayFee);
+
+ /** Process all the transactions that have been included in a block */
+ void processBlock(unsigned int nBlockHeight,
+ std::vector<CTxMemPoolEntry>& entries, bool fCurrentEstimate);
+
+ /** Process a transaction confirmed in a block*/
+ void processBlockTx(unsigned int nBlockHeight, const CTxMemPoolEntry& entry);
+
+ /** Process a transaction accepted to the mempool*/
+ void processTransaction(const CTxMemPoolEntry& entry, bool fCurrentEstimate);
+
+ /** Remove a transaction from the mempool tracking stats*/
+ void removeTx(uint256 hash);
+
+ /** Is this transaction likely included in a block because of its fee?*/
+ bool isFeeDataPoint(const CFeeRate &fee, double pri);
+
+ /** Is this transaction likely included in a block because of its priority?*/
+ bool isPriDataPoint(const CFeeRate &fee, double pri);
+
+ /** Return a fee estimate */
+ CFeeRate estimateFee(int confTarget);
+
+ /** Return a priority estimate */
+ double estimatePriority(int confTarget);
+
+ /** Write estimation data to a file */
+ void Write(CAutoFile& fileout);
+
+ /** Read estimation data from a file */
+ void Read(CAutoFile& filein);
+
+private:
+ CFeeRate minTrackedFee; //! Passed to constructor to avoid dependency on main
+ double minTrackedPriority; //! Set to AllowFreeThreshold
+ unsigned int nBestSeenHeight;
+ struct TxStatsInfo
+ {
+ TxConfirmStats *stats;
+ unsigned int blockHeight;
+ unsigned int bucketIndex;
+ TxStatsInfo() : stats(NULL), blockHeight(0), bucketIndex(0) {}
+ };
+
+ // map of txids to information about that transaction
+ std::map<uint256, TxStatsInfo> mapMemPoolTxs;
+
+ /** Classes to track historical data on transaction confirmations */
+ TxConfirmStats feeStats, priStats;
+
+ /** Breakpoints to help determine whether a transaction was confirmed by priority or Fee */
+ CFeeRate feeLikely, feeUnlikely;
+ double priLikely, priUnlikely;
+};
+#endif /*BITCOIN_POLICYESTIMATOR_H */
diff --git a/src/pow.cpp b/src/pow.cpp
index cf7ac387f2..bb53ad204b 100644
--- a/src/pow.cpp
+++ b/src/pow.cpp
@@ -13,7 +13,7 @@
unsigned int GetNextWorkRequired(const CBlockIndex* pindexLast, const CBlockHeader *pblock, const Consensus::Params& params)
{
- unsigned int nProofOfWorkLimit = params.powLimit.GetCompact();
+ unsigned int nProofOfWorkLimit = UintToArith256(params.powLimit).GetCompact();
// Genesis block
if (pindexLast == NULL)
@@ -61,6 +61,7 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF
nActualTimespan = params.nPowTargetTimespan*4;
// Retarget
+ const arith_uint256 bnPowLimit = UintToArith256(params.powLimit);
arith_uint256 bnNew;
arith_uint256 bnOld;
bnNew.SetCompact(pindexLast->nBits);
@@ -68,8 +69,8 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF
bnNew *= nActualTimespan;
bnNew /= params.nPowTargetTimespan;
- if (bnNew > params.powLimit)
- bnNew = params.powLimit;
+ if (bnNew > bnPowLimit)
+ bnNew = bnPowLimit;
/// debug print
LogPrintf("GetNextWorkRequired RETARGET\n");
@@ -89,7 +90,7 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&
bnTarget.SetCompact(nBits, &fNegative, &fOverflow);
// Check range
- if (fNegative || bnTarget == 0 || fOverflow || bnTarget > params.powLimit)
+ if (fNegative || bnTarget == 0 || fOverflow || bnTarget > UintToArith256(params.powLimit))
return error("CheckProofOfWork(): nBits below minimum work");
// Check proof of work matches claimed amount
@@ -113,3 +114,20 @@ arith_uint256 GetBlockProof(const CBlockIndex& block)
// or ~bnTarget / (nTarget+1) + 1.
return (~bnTarget / (bnTarget + 1)) + 1;
}
+
+int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& from, const CBlockIndex& tip, const Consensus::Params& params)
+{
+ arith_uint256 r;
+ int sign = 1;
+ if (to.nChainWork > from.nChainWork) {
+ r = to.nChainWork - from.nChainWork;
+ } else {
+ r = from.nChainWork - to.nChainWork;
+ sign = -1;
+ }
+ r = r * arith_uint256(params.nPowTargetSpacing) / GetBlockProof(tip);
+ if (r.bits() > 63) {
+ return sign * std::numeric_limits<int64_t>::max();
+ }
+ return sign * r.GetLow64();
+}
diff --git a/src/pow.h b/src/pow.h
index a5d32db178..e864a474cc 100644
--- a/src/pow.h
+++ b/src/pow.h
@@ -22,4 +22,7 @@ unsigned int CalculateNextWorkRequired(const CBlockIndex* pindexLast, int64_t nF
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params&);
arith_uint256 GetBlockProof(const CBlockIndex& block);
+/** Return the time it would take to redo the work difference between from and to, assuming the current hashrate corresponds to the difficulty at tip, in seconds. */
+int64_t GetBlockProofEquivalentTime(const CBlockIndex& to, const CBlockIndex& from, const CBlockIndex& tip, const Consensus::Params&);
+
#endif // BITCOIN_POW_H
diff --git a/src/primitives/block.h b/src/primitives/block.h
index c7ed6f723a..59f46deb1c 100644
--- a/src/primitives/block.h
+++ b/src/primitives/block.h
@@ -10,9 +10,6 @@
#include "serialize.h"
#include "uint256.h"
-/** The maximum allowed size for a serialized block, in bytes (network rule) */
-static const unsigned int MAX_BLOCK_SIZE = 1000000;
-
/** Nodes collect new transactions into a block, hash them into a hash tree,
* and scan through nonce values to make the block's hash satisfy proof-of-work
* requirements. When they solve the proof-of-work, they broadcast the block
diff --git a/src/protocol.cpp b/src/protocol.cpp
index 568580a595..dd855aa33a 100644
--- a/src/protocol.cpp
+++ b/src/protocol.cpp
@@ -89,7 +89,6 @@ void CAddress::Init()
{
nServices = NODE_NETWORK;
nTime = 100000000;
- nLastTry = 0;
}
CInv::CInv()
diff --git a/src/protocol.h b/src/protocol.h
index fd23eae1fc..b5e65032a2 100644
--- a/src/protocol.h
+++ b/src/protocol.h
@@ -116,9 +116,6 @@ public:
// disk and network only
unsigned int nTime;
-
- // memory only
- int64_t nLastTry;
};
/** inv message data */
diff --git a/src/pubkey.cpp b/src/pubkey.cpp
index a4c046bff5..bdab137600 100644
--- a/src/pubkey.cpp
+++ b/src/pubkey.cpp
@@ -54,13 +54,13 @@ bool CPubKey::Decompress() {
return true;
}
-bool CPubKey::Derive(CPubKey& pubkeyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const {
+bool CPubKey::Derive(CPubKey& pubkeyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode& cc) const {
assert(IsValid());
assert((nChild >> 31) == 0);
assert(begin() + 33 == end());
unsigned char out[64];
BIP32Hash(cc, nChild, *begin(), begin()+1, out);
- memcpy(ccChild, out+32, 32);
+ memcpy(ccChild.begin(), out+32, 32);
CECKey key;
bool ret = key.SetPubKey(begin(), size());
ret &= key.TweakPublic(out);
@@ -75,7 +75,7 @@ void CExtPubKey::Encode(unsigned char code[74]) const {
memcpy(code+1, vchFingerprint, 4);
code[5] = (nChild >> 24) & 0xFF; code[6] = (nChild >> 16) & 0xFF;
code[7] = (nChild >> 8) & 0xFF; code[8] = (nChild >> 0) & 0xFF;
- memcpy(code+9, vchChainCode, 32);
+ memcpy(code+9, chaincode.begin(), 32);
assert(pubkey.size() == 33);
memcpy(code+41, pubkey.begin(), 33);
}
@@ -84,7 +84,7 @@ void CExtPubKey::Decode(const unsigned char code[74]) {
nDepth = code[0];
memcpy(vchFingerprint, code+1, 4);
nChild = (code[5] << 24) | (code[6] << 16) | (code[7] << 8) | code[8];
- memcpy(vchChainCode, code+9, 32);
+ memcpy(chaincode.begin(), code+9, 32);
pubkey.Set(code+41, code+74);
}
@@ -93,5 +93,5 @@ bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const {
CKeyID id = pubkey.GetID();
memcpy(&out.vchFingerprint[0], &id, 4);
out.nChild = nChild;
- return pubkey.Derive(out.pubkey, out.vchChainCode, nChild, vchChainCode);
+ return pubkey.Derive(out.pubkey, out.chaincode, nChild, chaincode);
}
diff --git a/src/pubkey.h b/src/pubkey.h
index b0768d4f47..cce9c826e5 100644
--- a/src/pubkey.h
+++ b/src/pubkey.h
@@ -31,6 +31,8 @@ public:
CKeyID(const uint160& in) : uint160(in) {}
};
+typedef uint256 ChainCode;
+
/** An encapsulated public key. */
class CPubKey
{
@@ -182,20 +184,20 @@ public:
bool Decompress();
//! Derive BIP32 child pubkey.
- bool Derive(CPubKey& pubkeyChild, unsigned char ccChild[32], unsigned int nChild, const unsigned char cc[32]) const;
+ bool Derive(CPubKey& pubkeyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode& cc) const;
};
struct CExtPubKey {
unsigned char nDepth;
unsigned char vchFingerprint[4];
unsigned int nChild;
- unsigned char vchChainCode[32];
+ ChainCode chaincode;
CPubKey pubkey;
- friend bool operator==(const CExtPubKey& a, const CExtPubKey& b)
+ friend bool operator==(const CExtPubKey &a, const CExtPubKey &b)
{
return a.nDepth == b.nDepth && memcmp(&a.vchFingerprint[0], &b.vchFingerprint[0], 4) == 0 && a.nChild == b.nChild &&
- memcmp(&a.vchChainCode[0], &b.vchChainCode[0], 32) == 0 && a.pubkey == b.pubkey;
+ a.chaincode == b.chaincode && a.pubkey == b.pubkey;
}
void Encode(unsigned char code[74]) const;
diff --git a/src/qt/askpassphrasedialog.cpp b/src/qt/askpassphrasedialog.cpp
index 229139e65c..441814ff07 100644
--- a/src/qt/askpassphrasedialog.cpp
+++ b/src/qt/askpassphrasedialog.cpp
@@ -62,7 +62,7 @@ AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) :
break;
case ChangePass: // Ask old passphrase + new passphrase x2
setWindowTitle(tr("Change passphrase"));
- ui->warningLabel->setText(tr("Enter the old and new passphrase to the wallet."));
+ ui->warningLabel->setText(tr("Enter the old passphrase and new passphrase to the wallet."));
break;
}
textChanged();
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 3ae780abfd..8740b98b70 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -26,6 +26,7 @@
#include "init.h"
#include "main.h"
#include "rpcserver.h"
+#include "scheduler.h"
#include "ui_interface.h"
#include "util.h"
@@ -107,7 +108,6 @@ static QString GetLangTerritory()
/** Set up translations */
static void initTranslations(QTranslator &qtTranslatorBase, QTranslator &qtTranslator, QTranslator &translatorBase, QTranslator &translator)
{
-
// Remove old translators
QApplication::removeTranslator(&qtTranslatorBase);
QApplication::removeTranslator(&qtTranslator);
@@ -179,6 +179,7 @@ signals:
private:
boost::thread_group threadGroup;
+ CScheduler scheduler;
/// Pass fatal exception message to UI thread
void handleRunawayException(const std::exception *e);
@@ -259,7 +260,7 @@ void BitcoinCore::initialize()
try
{
qDebug() << __func__ << ": Running AppInit2 in thread";
- int rv = AppInit2(threadGroup);
+ int rv = AppInit2(threadGroup, scheduler);
if(rv)
{
/* Start a dummy RPC thread if no RPC thread is active yet
@@ -533,7 +534,7 @@ int main(int argc, char *argv[])
// Now that QSettings are accessible, initialize translations
QTranslator qtTranslatorBase, qtTranslator, translatorBase, translator;
initTranslations(qtTranslatorBase, qtTranslator, translatorBase, translator);
- uiInterface.Translate.connect(Translate);
+ translationInterface.Translate.connect(Translate);
// Show help message immediately after parsing command-line options (for "-lang") and setting locale,
// but before showing splash screen.
diff --git a/src/qt/bitcoin.qrc b/src/qt/bitcoin.qrc
index 63af146fd0..c899e95506 100644
--- a/src/qt/bitcoin.qrc
+++ b/src/qt/bitcoin.qrc
@@ -45,6 +45,7 @@
<file alias="about">res/icons/about.png</file>
<file alias="about_qt">res/icons/about_qt.png</file>
<file alias="verify">res/icons/verify.png</file>
+ <file alias="warning">res/icons/warning.png</file>
</qresource>
<qresource prefix="/movies">
<file alias="spinner-000">res/movies/spinner-000.png</file>
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index 198dd1fdf9..efba0f5e18 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -164,7 +164,7 @@ BitcoinGUI::BitcoinGUI(const NetworkStyle *networkStyle, QWidget *parent) :
// Create status bar
statusBar();
-
+
// Disable size grip because it looks ugly and nobody needs it
statusBar()->setSizeGripEnabled(false);
@@ -414,6 +414,7 @@ void BitcoinGUI::createToolBars()
if(walletFrame)
{
QToolBar *toolbar = addToolBar(tr("Tabs toolbar"));
+ toolbar->setMovable(false);
toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
toolbar->addAction(overviewAction);
toolbar->addAction(sendCoinsAction);
@@ -684,7 +685,7 @@ void BitcoinGUI::setNumBlocks(int count, const QDateTime& blockDate)
QDateTime currentDate = QDateTime::currentDateTime();
qint64 secs = blockDate.secsTo(currentDate);
- tooltip = tr("Processed %n blocks of transaction history.", "", count);
+ tooltip = tr("Processed %n block(s) of transaction history.", "", count);
// Set icon state: spinning if catching up, tick otherwise
if(secs < 90*60)
diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp
index 548529865a..b259d038f2 100644
--- a/src/qt/bitcoinstrings.cpp
+++ b/src/qt/bitcoinstrings.cpp
@@ -10,18 +10,6 @@
#endif
static const char UNUSED *bitcoin_strings[] = {
QT_TRANSLATE_NOOP("bitcoin-core", ""
-"%s, you must set a rpcpassword in the configuration file:\n"
-"%s\n"
-"It is recommended you use the following random password:\n"
-"rpcuser=bitcoinrpc\n"
-"rpcpassword=%s\n"
-"(you do not need to remember this password)\n"
-"The username and password MUST NOT be the same.\n"
-"If the file does not exist, create it with owner-readable-only file "
-"permissions.\n"
-"It is also recommended to set alertnotify so you are notified of problems;\n"
-"for example: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com\n"),
-QT_TRANSLATE_NOOP("bitcoin-core", ""
"(1 = keep tx meta data e.g. account owner and payment request information, 2 "
"= drop tx meta data)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -46,7 +34,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"running."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Continuously rate-limit free transactions to <n>*1000 bytes per minute "
-"(default:%u)"),
+"(default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Create new files with system default permissions, instead of umask 077 (only "
"effective with disabled wallet functionality)"),
@@ -54,6 +42,9 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Delete all wallet transactions and only recover those parts of the "
"blockchain through -rescan on startup"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Discover own IP addresses (default: 1 when listening and no -externalip or -"
+"proxy)"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Distributed under the MIT software license, see the accompanying file "
"COPYING or <http://www.opensource.org/licenses/mit-license.php>."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -62,13 +53,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Error: Listening for incoming connections failed (listen returned error %s)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
-"Error: The transaction was rejected! This might happen if some of the coins "
-"in your wallet were already spent, such as if you used a copy of wallet.dat "
-"and coins were spent in the copy but not marked as spent here."),
-QT_TRANSLATE_NOOP("bitcoin-core", ""
-"Error: This transaction requires a transaction fee of at least %s because of "
-"its amount, complexity, or use of recently received funds!"),
-QT_TRANSLATE_NOOP("bitcoin-core", ""
"Error: Unsupported argument -socks found. Setting SOCKS version isn't "
"possible anymore, only SOCKS5 proxies are supported."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -92,12 +76,15 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
QT_TRANSLATE_NOOP("bitcoin-core", ""
"How thorough the block verification of -checkblocks is (0-4, default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
-"If paytxfee is not set, include enough fee so transactions are confirmed on "
-"average within n blocks (default: %u)"),
+"If paytxfee is not set, include enough fee so transactions begin "
+"confirmation on average within n blocks (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"In this mode -genproclimit controls how many blocks are generated "
"immediately."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay "
+"fee of %s to prevent stuck transactions)"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Log transaction priority and fee per kB when mining blocks (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Maintain a full transaction index, used by the getrawtransaction rpc call "
@@ -106,13 +93,29 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Maximum size of data in data carrier transactions we relay and mine "
"(default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Maximum total fees to use in a single wallet transaction; setting this too "
+"low may abort large transactions (default: %s)"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Number of seconds to keep misbehaving peers from reconnecting (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Output debugging information (default: %u, supplying <category> is optional)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Prune configured below the minimum of %d MB. Please use a higher number."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Query for peer addresses via DNS lookup, if low on addresses (default: 1 "
"unless -connect)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Randomize credentials for every proxy connection. This enables Tor stream "
+"isolation (default: %u)"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Reduce storage requirements by pruning (deleting) old blocks. This mode "
+"disables wallet support and is incompatible with -txindex. Warning: "
+"Reverting this setting requires re-downloading the entire blockchain. "
+"(default: 0 = disable pruning blocks, >%u = target size in MiB to use for "
+"block files)"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Require high priority for relaying free or low-fee transactions (default: %u)"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Set maximum size of high-priority/low-fee transactions in bytes (default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Set the number of script verification threads (%u to %d, 0 = auto, <0 = "
@@ -121,6 +124,8 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"Set the number of threads for coin generation if enabled (-1 = all cores, "
"default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"The transaction amount is too small to send after the fee has been deducted"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"This is a pre-release test build - use at your own risk - do not use for "
"mining or merchant applications"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -128,12 +133,28 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
"the OpenSSL Toolkit <https://www.openssl.org/> and cryptographic software "
"written by Eric Young and UPnP software written by Thomas Bernard."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"To use bitcoind, or the -server option to bitcoin-qt, you must set an "
+"rpcpassword in the configuration file:\n"
+"%s\n"
+"It is recommended you use the following random password:\n"
+"rpcuser=bitcoinrpc\n"
+"rpcpassword=%s\n"
+"(you do not need to remember this password)\n"
+"The username and password MUST NOT be the same.\n"
+"If the file does not exist, create it with owner-readable-only file "
+"permissions.\n"
+"It is also recommended to set alertnotify so you are notified of problems;\n"
+"for example: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com\n"),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Unable to bind to %s on this computer. Bitcoin Core is probably already "
"running."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: "
"%s)"),
QT_TRANSLATE_NOOP("bitcoin-core", ""
+"Warning: -maxtxfee is set very high! Fees this large could be paid on a "
+"single transaction."),
+QT_TRANSLATE_NOOP("bitcoin-core", ""
"Warning: -paytxfee is set very high! This is the transaction fee you will "
"pay if you send a transaction."),
QT_TRANSLATE_NOOP("bitcoin-core", ""
@@ -158,22 +179,31 @@ QT_TRANSLATE_NOOP("bitcoin-core", ""
QT_TRANSLATE_NOOP("bitcoin-core", ""
"Whitelisted peers cannot be DoS banned and their transactions are always "
"relayed, even if they are already in the mempool, useful e.g. for a gateway"),
+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", "(default: %s)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "(default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "(default: 1)"),
QT_TRANSLATE_NOOP("bitcoin-core", "<category> can be:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Accept command line and JSON-RPC commands"),
QT_TRANSLATE_NOOP("bitcoin-core", "Accept connections from outside (default: 1 if no -proxy or -connect)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Accept public REST requests (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Acceptable ciphers (default: %s)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Activating best chain..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Add a node to connect to and attempt to keep the connection open"),
QT_TRANSLATE_NOOP("bitcoin-core", "Allow DNS lookups for -addnode, -seednode and -connect"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Allow self signed root certificates (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Always query for peer addresses via DNS lookup (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Attempt to recover private keys from a corrupt wallet.dat"),
QT_TRANSLATE_NOOP("bitcoin-core", "Block creation options:"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Can't run with a wallet in prune mode."),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot downgrade wallet"),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -bind address: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -externalip address: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -whitebind address: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Cannot write default address"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Choose data directory on startup (default: 0)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Connect only to the specified node(s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Connect through SOCKS5 proxy"),
QT_TRANSLATE_NOOP("bitcoin-core", "Connect to a node to retrieve peer addresses, and disconnect"),
@@ -183,7 +213,6 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Corrupted block database detected"),
QT_TRANSLATE_NOOP("bitcoin-core", "Could not parse -rpcbind value %s as network address"),
QT_TRANSLATE_NOOP("bitcoin-core", "Debugging/Testing options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Disable safemode, override a real safe mode event (default: %u)"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Discover own IP address (default: 1 when listening and no -externalip)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Do not load the wallet and disable wallet RPC calls"),
QT_TRANSLATE_NOOP("bitcoin-core", "Do you want to rebuild the block database now?"),
QT_TRANSLATE_NOOP("bitcoin-core", "Done loading"),
@@ -194,11 +223,11 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat: Wallet corrupted"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat: Wallet requires newer version of Bitcoin Core"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error opening block database"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error reading from database, shutting down."),
QT_TRANSLATE_NOOP("bitcoin-core", "Error"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: A fatal internal error occured, see debug.log for details"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Disk space is low!"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unsupported argument -tor found, use -onion."),
-QT_TRANSLATE_NOOP("bitcoin-core", "Error: Wallet locked, unable to create transaction!"),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to listen on any port. Use -listen=0 if you want this."),
QT_TRANSLATE_NOOP("bitcoin-core", "Fee (in BTC/kB) to add to transactions you send (default: %s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Force safe mode (default: %u)"),
@@ -214,13 +243,12 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Initialization sanity check failed. Bitcoin C
QT_TRANSLATE_NOOP("bitcoin-core", "Insufficient funds"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid -onion address: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid -proxy address: '%s'"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -maxtxfee=<amount>: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -minrelaytxfee=<amount>: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -mintxfee=<amount>: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -paytxfee=<amount>: '%s'"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount"),
QT_TRANSLATE_NOOP("bitcoin-core", "Invalid netmask specified in -whitelist: '%s'"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Keep at most <n> unconnectable blocks in memory (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Keep at most <n> unconnectable transactions in memory (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Limit size of signature cache to <n> entries (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Listen for JSON-RPC connections on <port> (default: %u or testnet: %u)"),
@@ -229,6 +257,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Loading addresses..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Loading block index..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Loading wallet..."),
QT_TRANSLATE_NOOP("bitcoin-core", "Maintain at most <n> connections to peers (default: %u)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Make the wallet broadcast transactions"),
QT_TRANSLATE_NOOP("bitcoin-core", "Maximum per-connection receive buffer, <n>*1000 bytes (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Maximum per-connection send buffer, <n>*1000 bytes (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Need to specify a port with -whitebind: '%s'"),
@@ -239,13 +268,14 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Only connect to nodes in network <net> (ipv4,
QT_TRANSLATE_NOOP("bitcoin-core", "Options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Password for JSON-RPC connections"),
QT_TRANSLATE_NOOP("bitcoin-core", "Prepend debug output with timestamp (default: %u)"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Print block on startup, if found in block index"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Print block tree on startup (default: %u)"),
+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", "RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)"),
QT_TRANSLATE_NOOP("bitcoin-core", "RPC server options:"),
+QT_TRANSLATE_NOOP("bitcoin-core", "RPC support for HTTP persistent connections (default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Randomly drop 1 of every <n> network messages"),
QT_TRANSLATE_NOOP("bitcoin-core", "Randomly fuzz 1 of every <n> network messages"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Rebuild block chain index from current blk000??.dat files"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Rebuild block chain index from current blk000??.dat files on startup"),
QT_TRANSLATE_NOOP("bitcoin-core", "Relay and mine data carrier transactions (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Relay non-P2SH multisig (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Rescan the block chain for missing wallet transactions"),
@@ -256,13 +286,16 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Send trace/debug info to console instead of d
QT_TRANSLATE_NOOP("bitcoin-core", "Send transactions as zero-fee transactions if possible (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Server certificate file (default: %s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Server private key (default: %s)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Set SSL root certificates for payment request (default: -system-)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Set database cache size in megabytes (%d to %d, default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Set key pool size to <n> (default: %u)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Set language, for example \"de_DE\" (default: system locale)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Set maximum block size in bytes (default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Set minimum block size in bytes (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Set the number of threads to service RPC calls (default: %d)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Sets the DB_PRIVATE flag in the wallet db environment (default: %u)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Show all debugging options (usage: --help -help-debug)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Show splash screen on startup (default: 1)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Shrink debug.log file on client startup (default: 1 when no -debug)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Signing transaction failed"),
QT_TRANSLATE_NOOP("bitcoin-core", "Specify configuration file (default: %s)"),
@@ -272,15 +305,18 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Specify pid file (default: %s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Specify wallet file (within data directory)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Specify your own public address"),
QT_TRANSLATE_NOOP("bitcoin-core", "Spend unconfirmed change when sending transactions (default: %u)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Start minimized"),
QT_TRANSLATE_NOOP("bitcoin-core", "Stop running after importing blocks from disk (default: %u)"),
+QT_TRANSLATE_NOOP("bitcoin-core", "The transaction amount is too small to pay the fee"),
QT_TRANSLATE_NOOP("bitcoin-core", "This help message"),
QT_TRANSLATE_NOOP("bitcoin-core", "This is experimental software."),
QT_TRANSLATE_NOOP("bitcoin-core", "This is intended for regression testing tools and app development."),
QT_TRANSLATE_NOOP("bitcoin-core", "Threshold for disconnecting misbehaving peers (default: %u)"),
-QT_TRANSLATE_NOOP("bitcoin-core", "To use the %s option"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction amount too small"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction amounts must be positive"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Transaction too large for fee policy"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction too large"),
+QT_TRANSLATE_NOOP("bitcoin-core", "UI Options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Unable to bind to %s on this computer (bind returned error %s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Unknown network specified in -onlynet: '%s'"),
QT_TRANSLATE_NOOP("bitcoin-core", "Upgrade wallet to latest format"),
@@ -295,7 +331,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Wallet %s resides outside data directory %s")
QT_TRANSLATE_NOOP("bitcoin-core", "Wallet needed to be rewritten: restart Bitcoin Core to complete"),
QT_TRANSLATE_NOOP("bitcoin-core", "Wallet options:"),
QT_TRANSLATE_NOOP("bitcoin-core", "Warning"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Warning: This version is obsolete, upgrade required!"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Warning: This version is obsolete; upgrade required!"),
QT_TRANSLATE_NOOP("bitcoin-core", "Warning: Unsupported argument -benchmark ignored, use -debug=bench."),
QT_TRANSLATE_NOOP("bitcoin-core", "Warning: Unsupported argument -debugnet ignored, use -debug=net."),
QT_TRANSLATE_NOOP("bitcoin-core", "You need to rebuild the database using -reindex to change -txindex"),
diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp
index dc32f81571..8e29cdeb06 100644
--- a/src/qt/clientmodel.cpp
+++ b/src/qt/clientmodel.cpp
@@ -89,7 +89,7 @@ QDateTime ClientModel::getLastBlockDate() const
double ClientModel::getVerificationProgress() const
{
LOCK(cs_main);
- return Checkpoints::GuessVerificationProgress(chainActive.Tip());
+ return Checkpoints::GuessVerificationProgress(Params().Checkpoints(), chainActive.Tip());
}
void ClientModel::updateTimer()
diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp
index e4e9015c85..7531fbddcb 100644
--- a/src/qt/coincontroldialog.cpp
+++ b/src/qt/coincontroldialog.cpp
@@ -8,12 +8,12 @@
#include "addresstablemodel.h"
#include "bitcoinunits.h"
#include "guiutil.h"
-#include "init.h"
#include "optionsmodel.h"
#include "scicon.h"
#include "walletmodel.h"
#include "coincontrol.h"
+#include "init.h"
#include "main.h"
#include "wallet/wallet.h"
@@ -129,11 +129,11 @@ CoinControlDialog::CoinControlDialog(QWidget *parent) :
ui->treeWidget->setColumnWidth(COLUMN_DATE, 110);
ui->treeWidget->setColumnWidth(COLUMN_CONFIRMATIONS, 100);
ui->treeWidget->setColumnWidth(COLUMN_PRIORITY, 100);
- ui->treeWidget->setColumnHidden(COLUMN_TXHASH, true); // store transacton hash in this column, but dont show it
- ui->treeWidget->setColumnHidden(COLUMN_VOUT_INDEX, true); // store vout index in this column, but dont show it
- ui->treeWidget->setColumnHidden(COLUMN_AMOUNT_INT64, true); // store amount int64 in this column, but dont show it
- ui->treeWidget->setColumnHidden(COLUMN_PRIORITY_INT64, true); // store priority int64 in this column, but dont show it
- ui->treeWidget->setColumnHidden(COLUMN_DATE_INT64, true); // store date int64 in this column, but dont show it
+ ui->treeWidget->setColumnHidden(COLUMN_TXHASH, true); // store transacton hash in this column, but don't show it
+ ui->treeWidget->setColumnHidden(COLUMN_VOUT_INDEX, true); // store vout index in this column, but don't show it
+ ui->treeWidget->setColumnHidden(COLUMN_AMOUNT_INT64, true); // store amount int64 in this column, but don't show it
+ ui->treeWidget->setColumnHidden(COLUMN_PRIORITY_INT64, true); // store priority int64 in this column, but don't show it
+ ui->treeWidget->setColumnHidden(COLUMN_DATE_INT64, true); // store date int64 in this column, but don't show it
// default view is sorted by amount desc
sortView(COLUMN_AMOUNT_INT64, Qt::DescendingOrder);
@@ -408,8 +408,8 @@ void CoinControlDialog::viewItemChanged(QTreeWidgetItem* item, int column)
}
// todo: this is a temporary qt5 fix: when clicking a parent node in tree mode, the parent node
- // including all childs are partially selected. But the parent node should be fully selected
- // as well as the childs. Childs should never be partially selected in the first place.
+ // including all children are partially selected. But the parent node should be fully selected
+ // as well as the children. Children should never be partially selected in the first place.
// Please remove this ugly fix, once the bug is solved upstream.
#if QT_VERSION >= 0x050000
else if (column == COLUMN_CHECKBOX && item->childCount() > 0)
@@ -635,15 +635,15 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog)
l7->setStyleSheet((fDust) ? "color:red;" : ""); // Dust = "yes"
// tool tips
- QString toolTip1 = tr("This label turns red, if the transaction size is greater than 1000 bytes.") + "<br /><br />";
+ QString toolTip1 = tr("This label turns red if the transaction size is greater than 1000 bytes.") + "<br /><br />";
toolTip1 += tr("This means a fee of at least %1 per kB is required.").arg(BitcoinUnits::formatWithUnit(nDisplayUnit, CWallet::minTxFee.GetFeePerK())) + "<br /><br />";
toolTip1 += tr("Can vary +/- 1 byte per input.");
QString toolTip2 = tr("Transactions with higher priority are more likely to get included into a block.") + "<br /><br />";
- toolTip2 += tr("This label turns red, if the priority is smaller than \"medium\".") + "<br /><br />";
+ toolTip2 += tr("This label turns red if the priority is smaller than \"medium\".") + "<br /><br />";
toolTip2 += tr("This means a fee of at least %1 per kB is required.").arg(BitcoinUnits::formatWithUnit(nDisplayUnit, CWallet::minTxFee.GetFeePerK()));
- QString toolTip3 = tr("This label turns red, if any recipient receives an amount smaller than %1.").arg(BitcoinUnits::formatWithUnit(nDisplayUnit, ::minRelayTxFee.GetFee(546)));
+ QString toolTip3 = tr("This label turns red if any recipient receives an amount smaller than %1.").arg(BitcoinUnits::formatWithUnit(nDisplayUnit, ::minRelayTxFee.GetFee(546)));
// how many satoshis the estimated fee can vary per byte we guess wrong
double dFeeVary;
diff --git a/src/qt/forms/overviewpage.ui b/src/qt/forms/overviewpage.ui
index 53d416ef38..6d792d1475 100644
--- a/src/qt/forms/overviewpage.ui
+++ b/src/qt/forms/overviewpage.ui
@@ -59,21 +59,35 @@
</widget>
</item>
<item>
- <widget class="QLabel" name="labelWalletStatus">
- <property name="cursor">
- <cursorShape>WhatsThisCursor</cursorShape>
+ <widget class="QPushButton" name="labelWalletStatus">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>16777215</height>
+ </size>
</property>
<property name="toolTip">
<string>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.</string>
</property>
- <property name="styleSheet">
- <string notr="true">QLabel { color: red; }</string>
- </property>
<property name="text">
- <string notr="true">(out of sync)</string>
+ <string/>
</property>
- <property name="alignment">
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/warning</normaloff>
+ <disabledoff>:/icons/warning</disabledoff>:/icons/warning</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
</property>
</widget>
</item>
@@ -431,21 +445,35 @@
</widget>
</item>
<item>
- <widget class="QLabel" name="labelTransactionsStatus">
- <property name="cursor">
- <cursorShape>WhatsThisCursor</cursorShape>
+ <widget class="QPushButton" name="labelTransactionsStatus">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>30</width>
+ <height>16777215</height>
+ </size>
</property>
<property name="toolTip">
<string>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.</string>
</property>
- <property name="styleSheet">
- <string notr="true">QLabel { color: red; }</string>
- </property>
<property name="text">
- <string notr="true">(out of sync)</string>
+ <string/>
</property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ <property name="icon">
+ <iconset resource="../bitcoin.qrc">
+ <normaloff>:/icons/warning</normaloff>
+ <disabledoff>:/icons/warning</disabledoff>:/icons/warning</iconset>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>24</width>
+ <height>24</height>
+ </size>
+ </property>
+ <property name="flat">
+ <bool>true</bool>
</property>
</widget>
</item>
diff --git a/src/qt/forms/rpcconsole.ui b/src/qt/forms/rpcconsole.ui
index c1eb185501..7ae8237476 100644
--- a/src/qt/forms/rpcconsole.ui
+++ b/src/qt/forms/rpcconsole.ui
@@ -745,13 +745,36 @@
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
+ <widget class="QLabel" name="label_30">
+ <property name="text">
+ <string>Whitelisted</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="peerWhitelisted">
+ <property name="cursor">
+ <cursorShape>IBeamCursor</cursorShape>
+ </property>
+ <property name="text">
+ <string>N/A</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>Direction</string>
</property>
</widget>
</item>
- <item row="0" column="2">
+ <item row="1" column="2">
<widget class="QLabel" name="peerDirection">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -767,14 +790,14 @@
</property>
</widget>
</item>
- <item row="1" column="0">
+ <item row="2" column="0">
<widget class="QLabel" name="label_21">
<property name="text">
<string>Version</string>
</property>
</widget>
</item>
- <item row="1" column="2">
+ <item row="2" column="2">
<widget class="QLabel" name="peerVersion">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -790,14 +813,14 @@
</property>
</widget>
</item>
- <item row="2" column="0">
+ <item row="3" column="0">
<widget class="QLabel" name="label_28">
<property name="text">
<string>User Agent</string>
</property>
</widget>
</item>
- <item row="2" column="2">
+ <item row="3" column="2">
<widget class="QLabel" name="peerSubversion">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -813,14 +836,14 @@
</property>
</widget>
</item>
- <item row="3" column="0">
+ <item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Services</string>
</property>
</widget>
</item>
- <item row="3" column="2">
+ <item row="4" column="2">
<widget class="QLabel" name="peerServices">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -839,7 +862,7 @@
<item row="5" column="0">
<widget class="QLabel" name="label_29">
<property name="text">
- <string>Starting Height</string>
+ <string>Starting Block</string>
</property>
</widget>
</item>
@@ -862,7 +885,7 @@
<item row="6" column="0">
<widget class="QLabel" name="label_27">
<property name="text">
- <string>Sync Height</string>
+ <string>Synced Headers</string>
</property>
</widget>
</item>
@@ -883,13 +906,36 @@
</widget>
</item>
<item row="7" column="0">
+ <widget class="QLabel" name="label_25">
+ <property name="text">
+ <string>Synced Blocks</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="2">
+ <widget class="QLabel" name="peerCommonHeight">
+ <property name="cursor">
+ <cursorShape>IBeamCursor</cursorShape>
+ </property>
+ <property name="text">
+ <string>N/A</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
<widget class="QLabel" name="label_24">
<property name="text">
<string>Ban Score</string>
</property>
</widget>
</item>
- <item row="7" column="2">
+ <item row="8" column="2">
<widget class="QLabel" name="peerBanScore">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -905,14 +951,14 @@
</property>
</widget>
</item>
- <item row="8" column="0">
+ <item row="9" column="0">
<widget class="QLabel" name="label_22">
<property name="text">
<string>Connection Time</string>
</property>
</widget>
</item>
- <item row="8" column="2">
+ <item row="9" column="2">
<widget class="QLabel" name="peerConnTime">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -928,14 +974,14 @@
</property>
</widget>
</item>
- <item row="9" column="0">
+ <item row="10" column="0">
<widget class="QLabel" name="label_15">
<property name="text">
<string>Last Send</string>
</property>
</widget>
</item>
- <item row="9" column="2">
+ <item row="10" column="2">
<widget class="QLabel" name="peerLastSend">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -951,14 +997,14 @@
</property>
</widget>
</item>
- <item row="10" column="0">
+ <item row="11" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Last Receive</string>
</property>
</widget>
</item>
- <item row="10" column="2">
+ <item row="11" column="2">
<widget class="QLabel" name="peerLastRecv">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -974,14 +1020,14 @@
</property>
</widget>
</item>
- <item row="11" column="0">
+ <item row="12" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>Bytes Sent</string>
</property>
</widget>
</item>
- <item row="11" column="2">
+ <item row="12" column="2">
<widget class="QLabel" name="peerBytesSent">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -997,14 +1043,14 @@
</property>
</widget>
</item>
- <item row="12" column="0">
+ <item row="13" column="0">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Bytes Received</string>
</property>
</widget>
</item>
- <item row="12" column="2">
+ <item row="13" column="2">
<widget class="QLabel" name="peerBytesRecv">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -1020,14 +1066,14 @@
</property>
</widget>
</item>
- <item row="13" column="0">
+ <item row="14" column="0">
<widget class="QLabel" name="label_26">
<property name="text">
<string>Ping Time</string>
</property>
</widget>
</item>
- <item row="13" column="2">
+ <item row="14" column="2">
<widget class="QLabel" name="peerPingTime">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -1043,14 +1089,40 @@
</property>
</widget>
</item>
- <item row="14" column="0">
+ <item row="15" column="0">
+ <widget class="QLabel" name="peerPingWaitLabel">
+ <property name="toolTip">
+ <string>The duration of a currently outstanding ping.</string>
+ </property>
+ <property name="text">
+ <string>Ping Wait</string>
+ </property>
+ </widget>
+ </item>
+ <item row="15" column="2">
+ <widget class="QLabel" name="peerPingWait">
+ <property name="cursor">
+ <cursorShape>IBeamCursor</cursorShape>
+ </property>
+ <property name="text">
+ <string>N/A</string>
+ </property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="16" column="0">
<widget class="QLabel" name="label_timeoffset">
<property name="text">
<string>Time Offset</string>
</property>
</widget>
</item>
- <item row="14" column="2">
+ <item row="16" column="2">
<widget class="QLabel" name="timeoffset">
<property name="cursor">
<cursorShape>IBeamCursor</cursorShape>
@@ -1066,7 +1138,7 @@
</property>
</widget>
</item>
- <item row="15" column="1">
+ <item row="17" column="1">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
diff --git a/src/qt/forms/sendcoinsentry.ui b/src/qt/forms/sendcoinsentry.ui
index b362928438..df06f36833 100644
--- a/src/qt/forms/sendcoinsentry.ui
+++ b/src/qt/forms/sendcoinsentry.ui
@@ -21,15 +21,21 @@
<string>This is a normal payment.</string>
</property>
<property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
+ <enum>QFrame::NoFrame</enum>
</property>
<layout class="QGridLayout" name="gridLayout">
- <property name="spacing">
+ <property name="topMargin">
+ <number>8</number>
+ </property>
+ <property name="bottomMargin">
+ <number>4</number>
+ </property>
+ <property name="horizontalSpacing">
<number>12</number>
</property>
+ <property name="verticalSpacing">
+ <number>8</number>
+ </property>
<item row="0" column="0">
<widget class="QLabel" name="payToLabel">
<property name="text">
@@ -193,9 +199,16 @@
</property>
</widget>
</item>
+ <item row="4" column="0" colspan="2">
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
- <widget class="QFrame" name="SendCoins_InsecurePaymentRequest">
+ <widget class="QFrame" name="SendCoins_UnauthenticatedPaymentRequest">
<property name="palette">
<palette>
<active>
@@ -612,16 +625,13 @@
</palette>
</property>
<property name="toolTip">
- <string>This is an unverified payment request.</string>
+ <string>This is an unauthenticated payment request.</string>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
+ <enum>QFrame::NoFrame</enum>
</property>
<layout class="QGridLayout" name="gridLayout_is">
<property name="spacing">
@@ -700,7 +710,7 @@
</item>
</layout>
</widget>
- <widget class="QFrame" name="SendCoins_SecurePaymentRequest">
+ <widget class="QFrame" name="SendCoins_AuthenticatedPaymentRequest">
<property name="palette">
<palette>
<active>
@@ -1144,16 +1154,13 @@
</palette>
</property>
<property name="toolTip">
- <string>This is a verified payment request.</string>
+ <string>This is an authenticated payment request.</string>
</property>
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="frameShape">
- <enum>QFrame::StyledPanel</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
+ <enum>QFrame::NoFrame</enum>
</property>
<layout class="QGridLayout" name="gridLayout_s">
<property name="spacing">
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index a5ee81db6c..581d2321bc 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -265,6 +265,19 @@ void copyEntryData(QAbstractItemView *view, int column, int role)
}
}
+QString getEntryData(QAbstractItemView *view, int column, int role)
+{
+ if(!view || !view->selectionModel())
+ return QString();
+ QModelIndexList selection = view->selectionModel()->selectedRows(column);
+
+ if(!selection.isEmpty()) {
+ // Return first item
+ return (selection.at(0).data(role).toString());
+ }
+ return QString();
+}
+
QString getSaveFileName(QWidget *parent, const QString &caption, const QString &dir,
const QString &filter,
QString *selectedSuffixOut)
@@ -741,14 +754,14 @@ LSSharedFileListItemRef findStartupItemInList(LSSharedFileListRef list, CFURLRef
CFURLRef currentItemURL = NULL;
#if defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED >= 10100
- if(&LSSharedFileListItemCopyResolvedURL)
- currentItemURL = LSSharedFileListItemCopyResolvedURL(item, resolutionFlags, NULL);
+ if(&LSSharedFileListItemCopyResolvedURL)
+ currentItemURL = LSSharedFileListItemCopyResolvedURL(item, resolutionFlags, NULL);
#if defined(MAC_OS_X_VERSION_MIN_REQUIRED) && MAC_OS_X_VERSION_MIN_REQUIRED < 10100
- else
- LSSharedFileListItemResolve(item, resolutionFlags, &currentItemURL, NULL);
+ else
+ LSSharedFileListItemResolve(item, resolutionFlags, &currentItemURL, NULL);
#endif
#else
- LSSharedFileListItemResolve(item, resolutionFlags, &currentItemURL, NULL);
+ LSSharedFileListItemResolve(item, resolutionFlags, &currentItemURL, NULL);
#endif
if(currentItemURL && CFEqual(currentItemURL, findUrl)) {
diff --git a/src/qt/guiutil.h b/src/qt/guiutil.h
index bcbb540c37..55df64a256 100644
--- a/src/qt/guiutil.h
+++ b/src/qt/guiutil.h
@@ -64,6 +64,14 @@ namespace GUIUtil
*/
void copyEntryData(QAbstractItemView *view, int column, int role=Qt::EditRole);
+ /** Return a field of the currently selected entry as a QString. Does nothing if nothing
+ is selected.
+ @param[in] column Data column to extract from the model
+ @param[in] role Data role to extract from the model
+ @see TransactionView::copyLabel, TransactionView::copyAmount, TransactionView::copyAddress
+ */
+ QString getEntryData(QAbstractItemView *view, int column, int role);
+
void setClipboard(const QString& str);
/** Get save filename, mimics QFileDialog::getSaveFileName, except that it appends a default suffix
@@ -205,7 +213,7 @@ namespace GUIUtil
#else
typedef QProgressBar ProgressBar;
#endif
-
+
} // namespace GUIUtil
#endif // BITCOIN_QT_GUIUTIL_H
diff --git a/src/qt/locale/bitcoin_ach.ts b/src/qt/locale/bitcoin_ach.ts
index ddb9fb85ce..835ddb8eaa 100644
--- a/src/qt/locale/bitcoin_ach.ts
+++ b/src/qt/locale/bitcoin_ach.ts
@@ -1,4 +1,4 @@
-<TS language="ach" version="2.0">
+<TS language="ach" version="2.1">
<context>
<name>AddressBookPage</name>
</context>
diff --git a/src/qt/locale/bitcoin_af_ZA.ts b/src/qt/locale/bitcoin_af_ZA.ts
index c369c3c68f..5ef7d3fd37 100644
--- a/src/qt/locale/bitcoin_af_ZA.ts
+++ b/src/qt/locale/bitcoin_af_ZA.ts
@@ -1,11 +1,7 @@
-<TS language="af_ZA" version="2.0">
+<TS language="af_ZA" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dubbel-klik om die adres of etiket te wysig</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Skep 'n nuwe adres</translation>
</message>
@@ -72,10 +68,6 @@
<translation>Verander wagwoord</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Tik asseblief die ou en nuwe wagwoord vir die beursie in.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Bevestig beursie enkripsie.</translation>
</message>
@@ -489,8 +481,8 @@
<translation>Tipe</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adres</translation>
+ <source>Label</source>
+ <translation>Etiket</translation>
</message>
<message>
<source>Received with</source>
@@ -659,10 +651,6 @@
<translation>Laai adresse...</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Ongeldige bedrag</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Onvoldoende fondse</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ar.ts b/src/qt/locale/bitcoin_ar.ts
index 101f51f8dc..235b22cd1f 100644
--- a/src/qt/locale/bitcoin_ar.ts
+++ b/src/qt/locale/bitcoin_ar.ts
@@ -1,9 +1,9 @@
-<TS language="ar" version="2.0">
+<TS language="ar" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>أنقر بالماوس مرتين لتعديل العنوان او الوصف</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>انقر بالزر الايمن لتعديل العنوان</translation>
</message>
<message>
<source>Create a new address</source>
@@ -152,10 +152,6 @@
<translation>تغيير كلمة المرور</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>أدخل كلمة المرور القديمة والجديدة للمحفظة.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>تأكيد تشفير المحفظة</translation>
</message>
@@ -184,10 +180,6 @@
<translation>أدخل عبارة مرور جديدة إلى المحفظة. الرجاء استخدام عبارة مرور تتكون من10 حروف عشوائية على الاقل, أو أكثر من 7 كلمات</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>بتكوين سوف يغلق الآن لإنهاء عملية التشفير. تذكر أن التشفير لا يستطيع حماية محفظتك تمامًا من السرقة من خلال البرمجيات الخبيثة التي تصيب جهازك </translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>فشل تشفير المحفظة</translation>
</message>
@@ -295,12 +287,16 @@
<translation>عميل bitcion core</translation>
</message>
<message>
- <source>Send coins to a Bitcoin address</source>
- <translation>ارسل عملات الى عنوان بيتكوين</translation>
+ <source>Importing blocks from disk...</source>
+ <translation>استيراد كتل من القرص ...</translation>
+ </message>
+ <message>
+ <source>Reindexing blocks on disk...</source>
+ <translation>إعادة الفهرسة الكتل على القرص ...</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>تعديل إعدادات bitcoin</translation>
+ <source>Send coins to a Bitcoin address</source>
+ <translation>ارسل عملات الى عنوان بيتكوين</translation>
</message>
<message>
<source>Backup wallet to another location</source>
@@ -344,7 +340,7 @@
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation>تشفير المفتاح الخاص لمحفظتك</translation>
+ <translation>تشفير المفتاح الخاص بمحفظتك</translation>
</message>
<message>
<source>&amp;File</source>
@@ -370,18 +366,6 @@
<source>&amp;About Bitcoin Core</source>
<translation>حول bitcoin core</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n ساعة</numerusform><numerusform>%n ساعة</numerusform><numerusform>%n ساعة</numerusform><numerusform>%n ساعات</numerusform><numerusform>%n ساعات</numerusform><numerusform>%n ساعات</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n يوم</numerusform><numerusform>%n يوم</numerusform><numerusform>%n يوم</numerusform><numerusform>%n أيام</numerusform><numerusform>%n أيام</numerusform><numerusform>%n ايام</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n اسبوع</numerusform><numerusform>%n اسبوع</numerusform><numerusform>%n اسبوع</numerusform><numerusform>%n اسابيع</numerusform><numerusform>%n اسابيع</numerusform><numerusform>%n اسابيع</numerusform></translation>
- </message>
<message>
<source>Error</source>
<translation>خطأ</translation>
@@ -430,11 +414,11 @@
<name>CoinControlDialog</name>
<message>
<source>Quantity:</source>
- <translation>الكمية:</translation>
+ <translation>الكمية :</translation>
</message>
<message>
<source>Amount:</source>
- <translation>القيمة</translation>
+ <translation>القيمة :</translation>
</message>
<message>
<source>Priority:</source>
@@ -474,7 +458,7 @@
</message>
<message>
<source>Copy address</source>
- <translation> انسخ العنوان</translation>
+ <translation> انسخ عنوان</translation>
</message>
<message>
<source>Copy label</source>
@@ -482,15 +466,15 @@
</message>
<message>
<source>Copy amount</source>
- <translation>نسخ القيمة</translation>
+ <translation>نسخ الكمية</translation>
</message>
<message>
<source>Copy transaction ID</source>
- <translation>نسخ رقم المعاملة</translation>
+ <translation>نسخ رقم العملية</translation>
</message>
<message>
<source>Copy quantity</source>
- <translation>نسخ الكمية</translation>
+ <translation>نسخ الكمية </translation>
</message>
<message>
<source>Copy fee</source>
@@ -506,7 +490,7 @@
</message>
<message>
<source>Copy change</source>
- <translation>نسخ التغييرات</translation>
+ <translation>نسخ التعديل</translation>
</message>
<message>
<source>highest</source>
@@ -633,10 +617,6 @@
<source>Usage:</source>
<translation>المستخدم</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>خيارات UI</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -785,11 +765,7 @@
<source>Your current total balance</source>
<translation>رصيدك الكلي الحالي</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>خارج المزامنه</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
</context>
@@ -803,10 +779,6 @@
<translation>المبلغ</translation>
</message>
<message>
- <source>UNKNOWN</source>
- <translation>غير معروف</translation>
- </message>
- <message>
<source>N/A</source>
<translation>غير معروف</translation>
</message>
@@ -941,7 +913,7 @@
</message>
<message>
<source>&amp;Label:</source>
- <translation>&amp;الوصف:</translation>
+ <translation>&amp;وصف :</translation>
</message>
<message>
<source>&amp;Message:</source>
@@ -977,7 +949,7 @@
</message>
<message>
<source>Copy amount</source>
- <translation>نسخ القيمة</translation>
+ <translation>نسخ الكمية</translation>
</message>
</context>
<context>
@@ -1020,7 +992,7 @@
</message>
<message>
<source>Message</source>
- <translation>رسالة</translation>
+ <translation>رسالة </translation>
</message>
</context>
<context>
@@ -1035,7 +1007,7 @@
</message>
<message>
<source>Message</source>
- <translation>رسالة</translation>
+ <translation>رسالة </translation>
</message>
<message>
<source>Amount</source>
@@ -1126,7 +1098,7 @@
</message>
<message>
<source>Copy amount</source>
- <translation>نسخ القيمة</translation>
+ <translation>نسخ الكمية</translation>
</message>
<message>
<source>Copy fee</source>
@@ -1185,7 +1157,7 @@
</message>
<message>
<source>Paste address from clipboard</source>
- <translation>الصق العنوان من لوحة المفاتيح</translation>
+ <translation>انسخ العنوان من لوحة المفاتيح</translation>
</message>
<message>
<source>Alt+P</source>
@@ -1429,10 +1401,6 @@
<translation>النوع</translation>
</message>
<message>
- <source>Address</source>
- <translation>عنوان</translation>
- </message>
- <message>
<source>This block was not received by any other nodes and will probably not be accepted!</source>
<translation>لم يتم تلقى هذه الكتلة (Block) من قبل أي العقد الأخرى وربما لن تكون مقبولة!</translation>
</message>
@@ -1445,6 +1413,10 @@
<translation>غير متصل</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>وصف</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>استقبل مع</translation>
</message>
@@ -1481,10 +1453,6 @@
<translation>نوع المعاملات</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>عنوان وجهة المعاملة</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>المبلغ الذي أزيل أو أضيف الى الرصيد</translation>
</message>
@@ -1675,10 +1643,6 @@
<translation>تحذير: مساحة القرص منخفضة</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>تحذير: المحفظة مغلقة , لا تستطيع تنفيذ المعاملة</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>فشل في الاستماع على أي منفذ. استخدام الاستماع = 0 إذا كنت تريد هذا.</translation>
</message>
@@ -1719,10 +1683,6 @@
<translation>تحذير</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>تحذير : هذا الاصدار قديم , يتطلب التحديث</translation>
- </message>
- <message>
<source>Upgrade wallet to latest format</source>
<translation>تحديث المحفظة للنسخة الاخيرة</translation>
</message>
@@ -1747,10 +1707,6 @@
<translation>عنوان البروكسي غير صحيح : '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>قيمة غير صحيحة</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>اموال غير كافية</translation>
</message>
@@ -1771,10 +1727,6 @@
<translation>انتهاء التحميل</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>لاستخدام %s الخيار</translation>
- </message>
- <message>
<source>Error</source>
<translation>خطأ</translation>
</message>
diff --git a/src/qt/locale/bitcoin_be_BY.ts b/src/qt/locale/bitcoin_be_BY.ts
index e63628396c..b727b75566 100644
--- a/src/qt/locale/bitcoin_be_BY.ts
+++ b/src/qt/locale/bitcoin_be_BY.ts
@@ -1,9 +1,9 @@
-<TS language="be_BY" version="2.0">
+<TS language="be_BY" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Двайны клік для рэдагавання адрасу ці пазнакі</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Правы клік, каб рэдагаваць адрас ці метку</translation>
</message>
<message>
<source>Create a new address</source>
@@ -66,10 +66,26 @@
<translation>адрасы Прымання</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>Тут знаходзяцца Біткойн-адрасы для высылання плацяжоў. Заўсёды спраўджвайце колькасць і адрас прызначэння перад здзяйсненнем транзакцыі.</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
+ <translation>Тут знаходзяцца Біткойн-адрасы для прымання плацяжоў. Пажадана выкарыстоўваць новы адрас для кожнай транзакцыі.</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Label</source>
+ <translation>Капіяваць Метку</translation>
+ </message>
+ <message>
<source>&amp;Edit</source>
<translation>Рэдагаваць</translation>
</message>
<message>
+ <source>Export Address List</source>
+ <translation>Экспартаваць Спіс Адрасоў</translation>
+ </message>
+ <message>
<source>Comma separated file (*.csv)</source>
<translation>Коскамі падзелены файл (*.csv)</translation>
</message>
@@ -77,12 +93,16 @@
<source>Exporting Failed</source>
<translation>Экспартаванне няўдалае</translation>
</message>
- </context>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <translation>Адбылася памылка падчас спробы захаваць адрас у %1. Паспрабуйце зноў.</translation>
+ </message>
+</context>
<context>
<name>AddressTableModel</name>
<message>
<source>Label</source>
- <translation>Пазнака</translation>
+ <translation>Метка</translation>
</message>
<message>
<source>Address</source>
@@ -96,6 +116,10 @@
<context>
<name>AskPassphraseDialog</name>
<message>
+ <source>Passphrase Dialog</source>
+ <translation>Дыялог сакрэтнай фразы</translation>
+ </message>
+ <message>
<source>Enter passphrase</source>
<translation>Увядзіце кодавую фразу</translation>
</message>
@@ -132,10 +156,6 @@
<translation>Змяніць пароль</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Увядзіце стары і новы пароль да гаманца.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Пацвердзіце шыфраванне гаманца</translation>
</message>
@@ -148,6 +168,14 @@
<translation>Ці ўпэўненыя вы, што жадаеце зашыфраваць свой гаманец?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Bitcoin Core зараз будзе зачынены, каб фіналізаваць працэс шыфравання. Памятайце, што шыфраванне вашага гаманца не гарантуе абсалютную абарону ад магчымасці крадзяжу біткойнаў шкоднымі праграмамі, якія могуць інфікаваць ваш камп'ютар.</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>ВАЖНА: Усе папярэднія копіі гаманца варта замяніць новым зашыфраваным файлам. У мэтах бяспекі папярэднія копіі незашыфраванага файла-гаманца стануць неўжывальнымі, калі вы станеце карыстацца новым зашыфраваным гаманцом.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation>Увага: Caps Lock уключаны!</translation>
</message>
@@ -156,8 +184,12 @@
<translation>Гаманец зашыфраваны</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin зачыняецца дзеля завяршэння працэсса шыфравання. Памятайце, што шыфраванне гаманца цалкам абараняе вашыя сродкі ад скрадання шкоднымі праграмамі якія могуць пранікнуць у ваш камп'ютар.</translation>
+ <source>Enter the new passphrase to 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>Увядзіце новы пароль для гаманца.&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 to the wallet.</source>
+ <translation>Увядзіце стары пароль і новы пароль для гаманца.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -177,7 +209,7 @@
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Уведзена пароль дзеля расшыфравання гаманца памылковы</translation>
+ <translation>Уведзены пароль для расшыфравання гаманца памылковы</translation>
</message>
<message>
<source>Wallet decryption failed</source>
@@ -243,10 +275,42 @@
<translation>Зашыфраваць Гаманец...</translation>
</message>
<message>
+ <source>&amp;Backup Wallet...</source>
+ <translation>Стварыць копію гаманца...</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase...</source>
+ <translation>&amp;Change Passphrase...</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses...</source>
+ <translation>Адрасы дасылання...</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>Адрасы прымання...</translation>
+ </message>
+ <message>
<source>Open &amp;URI...</source>
<translation>Адчыниць &amp;URI...</translation>
</message>
<message>
+ <source>Bitcoin Core client</source>
+ <translation>Bitcoin Core кліент</translation>
+ </message>
+ <message>
+ <source>Importing blocks from disk...</source>
+ <translation>Імпартуюцца блокі з дыску...</translation>
+ </message>
+ <message>
+ <source>Reindexing blocks on disk...</source>
+ <translation>Пераіндэксацыя блокаў на дыску...</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation>Даслаць манеты на Біткойн-адрас</translation>
+ </message>
+ <message>
<source>Backup wallet to another location</source>
<translation>Зрабіце копію гаманца ў іншае месца</translation>
</message>
@@ -259,6 +323,18 @@
<translation>Вакно адладкі</translation>
</message>
<message>
+ <source>Open debugging and diagnostic console</source>
+ <translation>Адкрыць кансоль дыягностыкі і адладкі</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message...</source>
+ <translation>Праверыць паведамленне...</translation>
+ </message>
+ <message>
+ <source>Bitcoin</source>
+ <translation>Біткойн</translation>
+ </message>
+ <message>
<source>Wallet</source>
<translation>Гаманец</translation>
</message>
@@ -271,6 +347,10 @@
<translation>Атрымаць</translation>
</message>
<message>
+ <source>Show information about Bitcoin Core</source>
+ <translation>Паказаць інфармацыю аб Bitcoin Core</translation>
+ </message>
+ <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Паказаць / Схаваць</translation>
</message>
@@ -283,6 +363,14 @@
<translation>Зашыфраваць прыватныя ключы, якия належаць вашаму гаманцу</translation>
</message>
<message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation>Падпісаць паведамленне з дапамогай Біткойн-адраса каб даказаць, што яно належыць вам</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation>Спраўдзіць паведамленне з дапамогай Біткойн-адраса каб даказаць, што яно належыць вам</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation>Ф&amp;айл</translation>
</message>
@@ -294,15 +382,99 @@
<source>&amp;Help</source>
<translation>Дапамога</translation>
</message>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation>Запатрабаваць плацёж (генеруецца QR-код для біткойн URI)</translation>
+ </message>
+ <message>
+ <source>&amp;About Bitcoin Core</source>
+ <translation>Аб Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Мадыфікаваць опцыі канфігурацыі Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation>Паказаць спіс адрасоў і метак для дасылання</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation>Паказаць спіс адрасоў і метак для прымання</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI or payment request</source>
+ <translation>Адкрыць біткойн: URI ці запыт плацяжу</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation>Опцыі каманднага радка</translation>
+ </message>
+ <message>
+ <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Паказваць даведку Bitcoin Core каб атрымаць спіс магчымых опцый каманднага радка</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n актыўнае злучэнне з Bitcoin-сецівам</numerusform><numerusform>%n актыўных злучэнняў з Bitcoin-сецівам</numerusform></translation>
+ <translation><numerusform>%n актыўнае злучэнне з сецівам Bitcoin</numerusform><numerusform>%n актыўных злучэнняў з сецівам Bitcoin</numerusform><numerusform>%n актыўных злучэнняў з сецівам Bitcoin</numerusform><numerusform>%n актыўных злучэнняў з сецівам Bitcoin</numerusform></translation>
+ </message>
+ <message>
+ <source>No block source available...</source>
+ <translation>Крыніца блокаў недасяжная...</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>Апрацаваны %n блок гісторыі транзакцый.</numerusform><numerusform>Апрацавана %n блокі гісторыі транзакцый.</numerusform><numerusform>Апрацавана %n блокаў гісторыі транзакцый.</numerusform><numerusform>Апрацавана %n блокаў гісторыі транзакцый.</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation><numerusform>%n гадзіна</numerusform><numerusform>%n гадзіны</numerusform><numerusform>%n гадзін</numerusform><numerusform>%n гадзін</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation><numerusform>%n дзень</numerusform><numerusform>%n дні</numerusform><numerusform>%n дзён</numerusform><numerusform>%n дзён</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation><numerusform>%n тыдзень</numerusform><numerusform>%n тыдні</numerusform><numerusform>%n тыдняў</numerusform><numerusform>%n тыдняў</numerusform></translation>
+ </message>
+ <message>
+ <source>%1 and %2</source>
+ <translation>%1 і %2</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation><numerusform>%n год</numerusform><numerusform>%n гады</numerusform><numerusform>%n гадоў</numerusform><numerusform>%n гадоў</numerusform></translation>
+ </message>
+ <message>
+ <source>%1 behind</source>
+ <translation>%1 таму</translation>
+ </message>
+ <message>
+ <source>Last received block was generated %1 ago.</source>
+ <translation>Апошні прыняты блок генераваны %1 таму.</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation>Транзакцыи пасля гэтай не будуць бачныя.</translation>
</message>
<message>
<source>Error</source>
<translation>Памылка</translation>
</message>
<message>
+ <source>Warning</source>
+ <translation>Увага</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Інфармацыя</translation>
+ </message>
+ <message>
<source>Up to date</source>
<translation>Сінхранізавана</translation>
</message>
@@ -311,26 +483,44 @@
<translation>Наганяем...</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>Дасланыя транзакцыі</translation>
+ <source>Date: %1
+</source>
+ <translation>Дата: %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>Прынятыя транзакцыі</translation>
+ <source>Amount: %1
+</source>
+ <translation>Колькасць: %1
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Type: %1
</source>
- <translation>Дата: %1
-Колькасць: %2
-Тып: %3
-Адрас: %4
+ <translation>Тып: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>Метка: %1
</translation>
</message>
<message>
+ <source>Address: %1
+</source>
+ <translation>Адрас: %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation>Дасланыя транзакцыі</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Прынятыя транзакцыі</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Гаманец &lt;b&gt;зашыфраваны&lt;/b&gt; і зараз &lt;b&gt;разблакаваны&lt;/b&gt;</translation>
</message>
@@ -341,26 +531,82 @@ Address: %4
</context>
<context>
<name>ClientModel</name>
- </context>
+ <message>
+ <source>Network Alert</source>
+ <translation>Трывога Сеціва</translation>
+ </message>
+</context>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Quantity:</source>
+ <translation>Колькасць:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation>Байтаў:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>Колькасць:</translation>
</message>
<message>
+ <source>Priority:</source>
+ <translation>Прыярытэт:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>Камісія:</translation>
+ </message>
+ <message>
+ <source>Dust:</source>
+ <translation>Пыл:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation>Пасля камісіі:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation>(не)выбраць ўсё</translation>
+ </message>
+ <message>
+ <source>Tree mode</source>
+ <translation>Рэжым дрэва</translation>
+ </message>
+ <message>
+ <source>List mode</source>
+ <translation>Рэжым спіса</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation>Колькасць</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>Прыняць праз метку</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Прыняць праз адрас</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>Дата</translation>
</message>
<message>
+ <source>Confirmations</source>
+ <translation>Пацверджанняў</translation>
+ </message>
+ <message>
<source>Confirmed</source>
<translation>Пацверджана</translation>
</message>
<message>
+ <source>Priority</source>
+ <translation>Прыярытэт</translation>
+ </message>
+ <message>
<source>Copy address</source>
<translation>Капіяваць адрас</translation>
</message>
@@ -377,6 +623,90 @@ Address: %4
<translation>Капіяваць ID транзакцыі</translation>
</message>
<message>
+ <source>Lock unspent</source>
+ <translation>Замкнуць непатрачанае</translation>
+ </message>
+ <message>
+ <source>Unlock unspent</source>
+ <translation>Адамкнуць непатрачанае</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation>Капіяваць колькасць</translation>
+ </message>
+ <message>
+ <source>Copy fee</source>
+ <translation>Капіяваць камісію</translation>
+ </message>
+ <message>
+ <source>Copy after fee</source>
+ <translation>Капіяваць з выняткам камісіі</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation>Капіяваць байты</translation>
+ </message>
+ <message>
+ <source>Copy priority</source>
+ <translation>Капіяваць прыярытэт</translation>
+ </message>
+ <message>
+ <source>Copy dust</source>
+ <translation>Капіяваць пыл</translation>
+ </message>
+ <message>
+ <source>highest</source>
+ <translation>найвышэйшы</translation>
+ </message>
+ <message>
+ <source>higher</source>
+ <translation>вышэйшы</translation>
+ </message>
+ <message>
+ <source>high</source>
+ <translation>высокі</translation>
+ </message>
+ <message>
+ <source>medium-high</source>
+ <translation>вышэй сярэдняга</translation>
+ </message>
+ <message>
+ <source>medium</source>
+ <translation>сярэдні</translation>
+ </message>
+ <message>
+ <source>low-medium</source>
+ <translation>ніжэй сярэдняга</translation>
+ </message>
+ <message>
+ <source>low</source>
+ <translation>нізкі</translation>
+ </message>
+ <message>
+ <source>lower</source>
+ <translation>ніжэйшы</translation>
+ </message>
+ <message>
+ <source>lowest</source>
+ <translation>найніжэйшы</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>так</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>не</translation>
+ </message>
+ <message>
+ <source>This means a fee of at least %1 per kB is required.</source>
+ <translation>Гэта значыць патрэбную камісію мінімум %1 на Кб.</translation>
+ </message>
+ <message>
+ <source>Transactions with higher priority are more likely to get included into a block.</source>
+ <translation>Транзакцыя большага прыярытэту больш прываблівая для ўключэння ў блок.</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation>непазначаны</translation>
</message>
@@ -389,7 +719,7 @@ Address: %4
</message>
<message>
<source>&amp;Label</source>
- <translation>Пазнака</translation>
+ <translation>Метка</translation>
</message>
<message>
<source>&amp;Address</source>
@@ -426,10 +756,26 @@ Address: %4
</context>
<context>
<name>FreespaceChecker</name>
+ <message>
+ <source>A new data directory will be created.</source>
+ <translation>Будзе створаны новы каталог з данымі.</translation>
+ </message>
+ <message>
+ <source>name</source>
+ <translation>імя</translation>
+ </message>
+ <message>
+ <source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
+ <translation>Каталог ужо існуе. Дадайце %1 калі вы збіраецеся стварыць тут новы каталог.</translation>
+ </message>
</context>
<context>
<name>HelpMessageDialog</name>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>(%1-bit)</source>
<translation>(%1-біт)</translation>
</message>
@@ -438,19 +784,51 @@ Address: %4
<translation>Аб Bitcoin Core</translation>
</message>
<message>
+ <source>Command-line options</source>
+ <translation>Опцыі каманднага радка</translation>
+ </message>
+ <message>
<source>Usage:</source>
<translation>Ужыванне:</translation>
</message>
- </context>
+ <message>
+ <source>command-line options</source>
+ <translation>опцыі каманднага радка</translation>
+ </message>
+</context>
<context>
<name>Intro</name>
<message>
+ <source>Welcome</source>
+ <translation>Вітаем</translation>
+ </message>
+ <message>
+ <source>Welcome to Bitcoin Core.</source>
+ <translation>Вітаем у Bitcoin Core.</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>Error</source>
<translation>Памылка</translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>%n Гб вольнага месца даступна</numerusform><numerusform>%n Гб вольнага месца даступна</numerusform><numerusform>%n Гб вольнага месца даступна</numerusform><numerusform>%n Гб вольнага месца даступна</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(з %n Гб патрэбна)</numerusform><numerusform>(з %n Гб патрэбна)</numerusform><numerusform>(з %n Гб патрэбна)</numerusform><numerusform>(з %n Гб патрэбна)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
+ <message>
+ <source>Open URI</source>
+ <translation>Адкрыць URI</translation>
+ </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -458,6 +836,10 @@ Address: %4
<source>Options</source>
<translation>Опцыі</translation>
</message>
+ <message>
+ <source>MB</source>
+ <translation>Мб</translation>
+ </message>
</context>
<context>
<name>OverviewPage</name>
@@ -489,7 +871,7 @@ Address: %4
<name>ReceiveCoinsDialog</name>
<message>
<source>&amp;Label:</source>
- <translation>Пазнака:</translation>
+ <translation>Метка:</translation>
</message>
<message>
<source>Copy label</source>
@@ -512,7 +894,11 @@ Address: %4
</message>
<message>
<source>Label</source>
- <translation>Пазнака</translation>
+ <translation>Метка</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation>Паведамленне</translation>
</message>
</context>
<context>
@@ -523,7 +909,11 @@ Address: %4
</message>
<message>
<source>Label</source>
- <translation>Пазнака</translation>
+ <translation>Метка</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation>Паведамленне</translation>
</message>
<message>
<source>Amount</source>
@@ -541,14 +931,38 @@ Address: %4
<translation>Даслаць Манеты</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation>Колькасць:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation>Байтаў:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>Колькасць:</translation>
</message>
<message>
+ <source>Priority:</source>
+ <translation>Прыярытэт:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>Камісія:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation>Пасля камісіі:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Даслаць адразу некалькім атрымальнікам</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>Пыл:</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation>Баланс:</translation>
</message>
@@ -561,10 +975,30 @@ Address: %4
<translation>Пацвердзіць дасыланне манет</translation>
</message>
<message>
+ <source>Copy quantity</source>
+ <translation>Капіяваць колькасць</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation>Капіяваць колькасць</translation>
</message>
<message>
+ <source>Copy fee</source>
+ <translation>Капіяваць камісію</translation>
+ </message>
+ <message>
+ <source>Copy after fee</source>
+ <translation>Капіяваць з выняткам камісіі</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation>Капіяваць байты</translation>
+ </message>
+ <message>
+ <source>Copy priority</source>
+ <translation>Капіяваць прыярытэт</translation>
+ </message>
+ <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Велічыня плацяжу мае быць больш за 0.</translation>
</message>
@@ -572,6 +1006,10 @@ Address: %4
<source>(no label)</source>
<translation>непазначаны</translation>
</message>
+ <message>
+ <source>Copy dust</source>
+ <translation>Капіяваць пыл</translation>
+ </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -589,7 +1027,7 @@ Address: %4
</message>
<message>
<source>&amp;Label:</source>
- <translation>Пазнака:</translation>
+ <translation>Метка:</translation>
</message>
<message>
<source>Alt+A</source>
@@ -603,7 +1041,11 @@ Address: %4
<source>Alt+P</source>
<translation>Alt+P</translation>
</message>
- </context>
+ <message>
+ <source>Memo:</source>
+ <translation>Памятка:</translation>
+ </message>
+</context>
<context>
<name>ShutdownWindow</name>
</context>
@@ -625,6 +1067,10 @@ Address: %4
<context>
<name>SplashScreen</name>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
<source>The Bitcoin Core developers</source>
<translation>Распрацоўнікі Bitcoin Core</translation>
</message>
@@ -635,10 +1081,18 @@ Address: %4
</context>
<context>
<name>TrafficGraphWidget</name>
- </context>
+ <message>
+ <source>KB/s</source>
+ <translation>Кб/с</translation>
+ </message>
+</context>
<context>
<name>TransactionDesc</name>
<message>
+ <source>%1/offline</source>
+ <translation>%1/offline</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<translation>%1/непацверджана</translation>
</message>
@@ -647,10 +1101,22 @@ Address: %4
<translation>%1 пацверджанняў</translation>
</message>
<message>
+ <source>Status</source>
+ <translation>Статус</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>Дата</translation>
</message>
<message>
+ <source>Message</source>
+ <translation>Паведамленне</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation>Каментар</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation>ID</translation>
</message>
@@ -689,10 +1155,6 @@ Address: %4
<translation>Тып</translation>
</message>
<message>
- <source>Address</source>
- <translation>Адрас</translation>
- </message>
- <message>
<source>Confirmed (%1 confirmations)</source>
<translation>Пацверджана (%1 пацверджанняў)</translation>
</message>
@@ -705,6 +1167,10 @@ Address: %4
<translation>Згенеравана, але не прынята</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Метка</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Прынята з</translation>
</message>
@@ -741,10 +1207,6 @@ Address: %4
<translation>Тып транзакцыі</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Адрас прызначэння транзакцыі.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Колькасць аднятая ці даданая да балансу.</translation>
</message>
@@ -849,7 +1311,7 @@ Address: %4
</message>
<message>
<source>Label</source>
- <translation>Пазнака</translation>
+ <translation>Метка</translation>
</message>
<message>
<source>Address</source>
@@ -915,14 +1377,106 @@ Address: %4
<translation>Ужываць тэставае сеціва</translation>
</message>
<message>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation>Ці жадаеце вы перабудаваць зараз базу звестак блокаў?</translation>
+ </message>
+ <message>
+ <source>Error initializing block database</source>
+ <translation>Памылка ініцыялізацыі базвы звестак блокаў</translation>
+ </message>
+ <message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation>Памалка ініцыялізацыі асяроддзя базы звестак гаманца %s!</translation>
+ </message>
+ <message>
+ <source>Error loading block database</source>
+ <translation>Памылка загрузкі базвы звестак блокаў</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation>Памылка адчынення базы звестак блокаў</translation>
+ </message>
+ <message>
+ <source>Error: A fatal internal error occured, see debug.log for details</source>
+ <translation>Памылка: здарылася Фатальная унутраная памылка, глядзі debug.log для падрабязнасцяў</translation>
+ </message>
+ <message>
+ <source>Error: Disk space is low!</source>
+ <translation>Памылка: Замала вольнага месца на дыску!</translation>
+ </message>
+ <message>
+ <source>Importing...</source>
+ <translation>Імпартаванне...</translation>
+ </message>
+ <message>
+ <source>Not enough file descriptors available.</source>
+ <translation>Не хапае файлавых дэскрыптараў.</translation>
+ </message>
+ <message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Use UPnP to map the listening port (default: %u)</translation>
+ </message>
+ <message>
+ <source>Verifying blocks...</source>
+ <translation>Праверка блокаў...</translation>
+ </message>
+ <message>
+ <source>Verifying wallet...</source>
+ <translation>Праверка гаманца...</translation>
+ </message>
+ <message>
+ <source>Wallet options:</source>
+ <translation>Опцыі гаманца:</translation>
+ </message>
+ <message>
+ <source>Imports blocks from external blk000??.dat file</source>
+ <translation>Імпартаванне блокаў з вонкавага blk000??.dat файла</translation>
+ </message>
+ <message>
+ <source>Activating best chain...</source>
+ <translation>Актывацыя лепшага ланцуга...</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Інфармацыя</translation>
+ </message>
+ <message>
+ <source>RPC server options:</source>
+ <translation>Опцыі RPC сервера:</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Слаць trace/debug звесткі ў кансоль замест файла debug.log</translation>
</message>
<message>
+ <source>Signing transaction failed</source>
+ <translation>Памылка подпісу транзакцыі</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Стартаваць ммінімізаванай</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation>Гэта эксперыментальная праграма.</translation>
+ </message>
+ <message>
+ <source>Transaction amount too small</source>
+ <translation>Транзакцыя занадта малая</translation>
+ </message>
+ <message>
+ <source>Transaction too large</source>
+ <translation>Транзакцыя занадта вялікая</translation>
+ </message>
+ <message>
<source>Username for JSON-RPC connections</source>
<translation>Імя карыстальника для JSON-RPC злучэнняў</translation>
</message>
<message>
+ <source>Warning</source>
+ <translation>Увага</translation>
+ </message>
+ <message>
<source>Password for JSON-RPC connections</source>
<translation>Пароль для JSON-RPC злучэнняў</translation>
</message>
@@ -955,10 +1509,6 @@ Address: %4
<translation>Памылка загрузкі wallet.dat</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Памылковая колькасць</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Недастаткова сродкаў</translation>
</message>
@@ -971,6 +1521,10 @@ Address: %4
<translation>Загружаем гаманец...</translation>
</message>
<message>
+ <source>Cannot downgrade wallet</source>
+ <translation>Немагчыма рэгрэсаваць гаманец</translation>
+ </message>
+ <message>
<source>Rescanning...</source>
<translation>Перасканаванне...</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bg.ts b/src/qt/locale/bitcoin_bg.ts
index 3095aa1172..c86fdd42dd 100644
--- a/src/qt/locale/bitcoin_bg.ts
+++ b/src/qt/locale/bitcoin_bg.ts
@@ -1,21 +1,33 @@
-<TS language="bg" version="2.0">
+<TS language="bg" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Двоен клик за редакция на адрес или име</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Десен клик за промяна на адреса или името</translation>
</message>
<message>
<source>Create a new address</source>
<translation>Създаване на нов адрес</translation>
</message>
<message>
+ <source>&amp;New</source>
+ <translation>Нов</translation>
+ </message>
+ <message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation>Копиране на избрания адрес</translation>
+ <translation>Копиране на избрания адрес към клипборда</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>Копирай</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>Затвори</translation>
</message>
<message>
<source>&amp;Copy Address</source>
- <translation>&amp;Копирай</translation>
+ <translation>&amp;Копирай адрес</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -26,10 +38,26 @@
<translation>Запишете данните от текущия раздел във файл</translation>
</message>
<message>
+ <source>&amp;Export</source>
+ <translation>Изнеси</translation>
+ </message>
+ <message>
<source>&amp;Delete</source>
<translation>&amp;Изтриване</translation>
</message>
<message>
+ <source>Choose the address to send coins to</source>
+ <translation>Изберете адрес, на който да се изпращат монети</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation>Изберете адрес, на който ще получавате монети</translation>
+ </message>
+ <message>
+ <source>C&amp;hoose</source>
+ <translation>Избери</translation>
+ </message>
+ <message>
<source>Sending addresses</source>
<translation>Адреси за изпращане</translation>
</message>
@@ -38,6 +66,14 @@
<translation>Адреси за получаване</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>Това са адресите на получателите на плащания. Винаги проверявайте размера на сумата и адреса на получателя, преди да изпратите монети.</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
+ <translation>Това са Вашите Биткойн адреси,благодарение на които ще получавате плащания.Препоръчително е да използвате нови адреси за получаване на всяка транзакция.</translation>
+ </message>
+ <message>
<source>Copy &amp;Label</source>
<translation>Копирай &amp;име</translation>
</message>
@@ -57,7 +93,11 @@
<source>Exporting Failed</source>
<translation>Грешка при изнасянето</translation>
</message>
- </context>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <translation>Възникна грешка при опита за запазване на списъка с адреси в %1.Моля опитайте отново.</translation>
+ </message>
+</context>
<context>
<name>AddressTableModel</name>
<message>
@@ -76,8 +116,12 @@
<context>
<name>AskPassphraseDialog</name>
<message>
+ <source>Passphrase Dialog</source>
+ <translation>Диалог за паролите</translation>
+ </message>
+ <message>
<source>Enter passphrase</source>
- <translation>Въведи парола</translation>
+ <translation>Въведете текущата парола</translation>
</message>
<message>
<source>New passphrase</source>
@@ -85,11 +129,11 @@
</message>
<message>
<source>Repeat new passphrase</source>
- <translation>Още веднъж</translation>
+ <translation>Въведете новата парола повторно</translation>
</message>
<message>
<source>Encrypt wallet</source>
- <translation>Криптиране на портфейла</translation>
+ <translation>Шифриране на портфейла</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
@@ -101,35 +145,31 @@
</message>
<message>
<source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Тази операция изисква Вашата парола за декриптиране на портфейла.</translation>
+ <translation>Тази операция изисква Вашата парола за дешифриране на портфейла.</translation>
</message>
<message>
<source>Decrypt wallet</source>
- <translation>Декриптиране на портфейла</translation>
+ <translation>Дешифриране на портфейла</translation>
</message>
<message>
<source>Change passphrase</source>
<translation>Смяна на паролата</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Въведете текущата и новата парола за портфейла.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
- <translation>Потвърждаване на криптирането</translation>
+ <translation>Потвърдете на шифрирането на портфейла</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>ВНИМАНИЕ: Ако защитите вашият портфейл и изгубите ключовата дума, вие ще &lt;b&gt;ИЗГУБИТЕ ВСИЧКИТЕ СИ БИТКОЙНОВЕ&lt;/b&gt;!</translation>
+ <translation>ВНИМАНИЕ: Ако шифрирате вашият портфейл и изгубите паролата си, &lt;b&gt;ЩЕ ИЗГУБИТЕ ВСИЧКИТЕ СИ БИТКОИНИ&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Наистина ли искате да шифрирате портфейла?</translation>
+ <translation>Наистина ли желаете да шифрирате портфейла си?</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>ВАЖНО: Всякакви стари бекъп версии, които сте направили на вашият портфейл трябва да бъдат заменени със ново-генерирания, криптиран портфейл файл. От съображения за сигурност, предишните бекъпи на некриптираните портфейли ще станат неизползваеми веднага щом започнете да използвате новият криптиран портфейл.</translation>
+ <translation>ВАЖНО: Всички стари запазвания, които сте направили на Вашият портфейл трябва да замените с запазване на новополучения, шифриран портфейл. От съображения за сигурност, предишните запазвания на нешифрирани портфейли ще станат неизползваеми веднага, щом започнете да използвате новият, шифриран портфейл.</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
@@ -137,19 +177,15 @@
</message>
<message>
<source>Wallet encrypted</source>
- <translation>Портфейлът е криптиран</translation>
- </message>
- <message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Биткоин ще се затоври сега за да завърши процеса на криптиране. Запомнете, че криптирането на вашия портефейл не може напълно да предпази вашите Бит-монети от кражба чрез зловреден софтуер, инфектирал вашия компютър</translation>
+ <translation>Портфейлът е шифриран</translation>
</message>
<message>
<source>Wallet encryption failed</source>
- <translation>Криптирането беше неуспешно</translation>
+ <translation>Шифрирането беше неуспешно</translation>
</message>
<message>
<source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Криптирането на портфейла беше неуспешно поради неизвестен проблем. Портфейлът не е криптиран.</translation>
+ <translation>Шифрирането на портфейла беше неуспешно, поради софтуерен проблем. Портфейлът не е шифриран.</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
@@ -157,15 +193,15 @@
</message>
<message>
<source>Wallet unlock failed</source>
- <translation>Отключването беше неуспешно</translation>
+ <translation>Неуспешно отключване на портфейла</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>Паролата въведена за декриптиране на портфейла е грешна.</translation>
+ <translation>Паролата въведена за дешифриране на портфейла е грешна.</translation>
</message>
<message>
<source>Wallet decryption failed</source>
- <translation>Декриптирането беше неуспешно</translation>
+ <translation>Дешифрирането на портфейла беше неуспешно</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
@@ -187,16 +223,20 @@
<translation>&amp;Баланс</translation>
</message>
<message>
+ <source>Node</source>
+ <translation>Сървър</translation>
+ </message>
+ <message>
<source>Show general overview of wallet</source>
<translation>Обобщена информация за портфейла</translation>
</message>
<message>
<source>&amp;Transactions</source>
- <translation>&amp;Трансакции</translation>
+ <translation>&amp;Транзакции</translation>
</message>
<message>
<source>Browse transaction history</source>
- <translation>История на трансакциите</translation>
+ <translation>История на транзакциите</translation>
</message>
<message>
<source>E&amp;xit</source>
@@ -220,7 +260,7 @@
</message>
<message>
<source>&amp;Encrypt Wallet...</source>
- <translation>&amp;Криптиране на портфейла...</translation>
+ <translation>&amp;Шифриране на портфейла...</translation>
</message>
<message>
<source>&amp;Backup Wallet...</source>
@@ -231,14 +271,42 @@
<translation>&amp;Смяна на паролата...</translation>
</message>
<message>
+ <source>&amp;Sending addresses...</source>
+ <translation>&amp;Изпращане на адресите...</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses...</source>
+ <translation>&amp;Получаване на адресите...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI...</source>
+ <translation>Отвори &amp;URI...</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core client</source>
+ <translation>Bitcoin Core клиент</translation>
+ </message>
+ <message>
<source>Send coins to a Bitcoin address</source>
<translation>Изпращане към Биткоин адрес</translation>
</message>
<message>
+ <source>Backup wallet to another location</source>
+ <translation>Запазване на портфейла на друго място</translation>
+ </message>
+ <message>
<source>Change the passphrase used for wallet encryption</source>
<translation>Променя паролата за портфейла</translation>
</message>
<message>
+ <source>&amp;Debug window</source>
+ <translation>&amp;Прозорец за отстраняване на грешки</translation>
+ </message>
+ <message>
+ <source>Open debugging and diagnostic console</source>
+ <translation>Отворете конзолата за диагностика и отстраняване на грешки</translation>
+ </message>
+ <message>
<source>&amp;Verify message...</source>
<translation>&amp;Проверка на съобщение...</translation>
</message>
@@ -255,14 +323,34 @@
<translation>&amp;Изпращане</translation>
</message>
<message>
+ <source>&amp;Receive</source>
+ <translation>&amp;Получаване</translation>
+ </message>
+ <message>
+ <source>Show information about Bitcoin Core</source>
+ <translation>Покажете информация за Биткойн ядрото</translation>
+ </message>
+ <message>
<source>&amp;Show / Hide</source>
- <translation>&amp;Покажи / Скрий</translation>
+ <translation>&amp;Показване / Скриване</translation>
</message>
<message>
<source>Show or hide the main Window</source>
<translation>Показване и скриване на основния прозорец</translation>
</message>
<message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation>Шифроване на личните ключове,които принадлежат на портфейла Ви.</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation>Пишете съобщения със своя Биткойн адрес за да докажете,че е ваш.</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation>Потвърждаване на съобщения за да се знае,че са написани с дадените Биткойн адреси.</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation>&amp;Файл</translation>
</message>
@@ -278,29 +366,53 @@
<source>Tabs toolbar</source>
<translation>Раздели</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n връзка към Биткоин мрежата</numerusform><numerusform>%n връзки към Биткоин мрежата</numerusform></translation>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Биткойн ядро</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n час</numerusform><numerusform>%n часа</numerusform></translation>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation>Изискване на плащания(генерира QR кодове и биткойн: URIs)</translation>
</message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n ден</numerusform><numerusform>%n дни</numerusform></translation>
+ <message>
+ <source>&amp;About Bitcoin Core</source>
+ <translation>&amp;Относно Bitcoin Core</translation>
</message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n седмица</numerusform><numerusform>%n седмици</numerusform></translation>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation>Показване на списъка с използвани адреси и имена</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation>Покажи списък с използваните адреси и имена.</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI or payment request</source>
+ <translation>Отворете биткойн: URI или заявка за плащане</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation>&amp;Налични команди</translation>
+ </message>
+ <message>
+ <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
+ <translation>Покажи помощните съобщения на Биткойн за да видиш наличните и валидни команди</translation>
+ </message>
+ <message>
+ <source>No block source available...</source>
+ <translation>Липсва източник на блоковете...</translation>
</message>
<message>
<source>%1 and %2</source>
<translation>%1 и %2</translation>
</message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation><numerusform>%n година</numerusform><numerusform>%n години</numerusform></translation>
+ <message>
+ <source>%1 behind</source>
+ <translation>%1 зад</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation>Транзакции след това няма все още да бъдат видими.</translation>
</message>
<message>
<source>Error</source>
@@ -312,7 +424,7 @@
</message>
<message>
<source>Information</source>
- <translation>Данни</translation>
+ <translation>Информация</translation>
</message>
<message>
<source>Up to date</source>
@@ -324,11 +436,11 @@
</message>
<message>
<source>Sent transaction</source>
- <translation>Изходяща трансакция</translation>
+ <translation>Изходяща транзакция</translation>
</message>
<message>
<source>Incoming transaction</source>
- <translation>Входяща трансакция</translation>
+ <translation>Входяща транзакция</translation>
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
@@ -341,10 +453,22 @@
</context>
<context>
<name>ClientModel</name>
- </context>
+ <message>
+ <source>Network Alert</source>
+ <translation>Мрежови проблем</translation>
+ </message>
+</context>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Избор на монета</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation>Количество:</translation>
+ </message>
+ <message>
<source>Bytes:</source>
<translation>Байтове:</translation>
</message>
@@ -361,10 +485,42 @@
<translation>Такса:</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>Прах:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation>След прилагане на ДДС</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation>Ресто</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation>(Пре)махни всички</translation>
+ </message>
+ <message>
+ <source>Tree mode</source>
+ <translation>Дървовиден режим</translation>
+ </message>
+ <message>
+ <source>List mode</source>
+ <translation>Списъчен режим</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation>Сума</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>Получени с име</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Получени с адрес</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>Дата</translation>
</message>
@@ -393,6 +549,90 @@
<translation>Копирай сума</translation>
</message>
<message>
+ <source>Copy transaction ID</source>
+ <translation>Копирай транзакция с ID</translation>
+ </message>
+ <message>
+ <source>Lock unspent</source>
+ <translation>Заключване на неизхарченото</translation>
+ </message>
+ <message>
+ <source>Unlock unspent</source>
+ <translation>Отключване на неизхарченото</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation>Копиране на количеството</translation>
+ </message>
+ <message>
+ <source>Copy fee</source>
+ <translation>Копиране на данък добавена стойност</translation>
+ </message>
+ <message>
+ <source>Copy after fee</source>
+ <translation>Копиране след прилагане на данък добавена стойност</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation>Копиране на байтовете</translation>
+ </message>
+ <message>
+ <source>Copy priority</source>
+ <translation>Копиране на приоритет</translation>
+ </message>
+ <message>
+ <source>Copy dust</source>
+ <translation>Копирай прахта:</translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation>Копирай рестото</translation>
+ </message>
+ <message>
+ <source>highest</source>
+ <translation>Най-висок</translation>
+ </message>
+ <message>
+ <source>higher</source>
+ <translation>По-висок</translation>
+ </message>
+ <message>
+ <source>high</source>
+ <translation>Висок</translation>
+ </message>
+ <message>
+ <source>medium-high</source>
+ <translation>Средно-висок</translation>
+ </message>
+ <message>
+ <source>medium</source>
+ <translation>Среден</translation>
+ </message>
+ <message>
+ <source>low-medium</source>
+ <translation>Ниско-среден</translation>
+ </message>
+ <message>
+ <source>low</source>
+ <translation>Нисък</translation>
+ </message>
+ <message>
+ <source>lower</source>
+ <translation>По-нисък</translation>
+ </message>
+ <message>
+ <source>lowest</source>
+ <translation>Най-нисък</translation>
+ </message>
+ <message>
+ <source>(%1 locked)</source>
+ <translation>(%1 заключен)</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation>нищо</translation>
+ </message>
+ <message>
<source>yes</source>
<translation>да</translation>
</message>
@@ -401,10 +641,26 @@
<translation>не</translation>
</message>
<message>
+ <source>This means a fee of at least %1 per kB is required.</source>
+ <translation>Това означава че се изисква такса от поне %1 на килобайт.</translation>
+ </message>
+ <message>
+ <source>Can vary +/- 1 byte per input.</source>
+ <translation>Може да варира с +-1 байт</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation>(без име)</translation>
</message>
- </context>
+ <message>
+ <source>change from %1 (%2)</source>
+ <translation>ресто от %1 (%2)</translation>
+ </message>
+ <message>
+ <source>(change)</source>
+ <translation>(промени)</translation>
+ </message>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -429,11 +685,11 @@
</message>
<message>
<source>Edit receiving address</source>
- <translation>Редактиране на входящ адрес</translation>
+ <translation>Редактиране на адрес за получаване</translation>
</message>
<message>
<source>Edit sending address</source>
- <translation>Редактиране на изходящ адрес</translation>
+ <translation>Редактиране на адрес за изпращане</translation>
</message>
<message>
<source>The entered address "%1" is already in the address book.</source>
@@ -463,25 +719,49 @@
<translation>име</translation>
</message>
<message>
+ <source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
+ <translation>Директорията вече съществува.Добавете %1 ако желаете да добавите нова директория тук.</translation>
+ </message>
+ <message>
<source>Path already exists, and is not a directory.</source>
<translation>Пътят вече съществува и не е папка.</translation>
</message>
- </context>
+ <message>
+ <source>Cannot create data directory here.</source>
+ <translation>Не може да се създаде директория тук.</translation>
+ </message>
+</context>
<context>
<name>HelpMessageDialog</name>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Биткойн ядро</translation>
+ </message>
+ <message>
<source>version</source>
<translation>версия</translation>
</message>
<message>
+ <source>(%1-bit)</source>
+ <translation>(%1-битов)</translation>
+ </message>
+ <message>
+ <source>About Bitcoin Core</source>
+ <translation>Относно Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>Command-line options</source>
+ <translation>Списък с команди</translation>
+ </message>
+ <message>
<source>Usage:</source>
<translation>Използване:</translation>
</message>
<message>
- <source>UI options</source>
- <translation>UI Опции</translation>
+ <source>command-line options</source>
+ <translation>Списък с налични команди</translation>
</message>
- </context>
+</context>
<context>
<name>Intro</name>
<message>
@@ -489,12 +769,36 @@
<translation>Добре дошли</translation>
</message>
<message>
+ <source>Welcome to Bitcoin Core.</source>
+ <translation>Добре дошли в Биткойн ядрото.</translation>
+ </message>
+ <message>
+ <source>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</source>
+ <translation>Тъй като това е първото стартиране на програмата можете да изберете къде Биткон ядрото да запази данните си.</translation>
+ </message>
+ <message>
+ <source>Use the default data directory</source>
+ <translation>Използване на директория по подразбиране</translation>
+ </message>
+ <message>
+ <source>Use a custom data directory:</source>
+ <translation>Използване на директория ръчно</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Биткойн ядро</translation>
+ </message>
+ <message>
<source>Error</source>
<translation>Грешка</translation>
</message>
</context>
<context>
<name>OpenURIDialog</name>
+ <message>
+ <source>Open URI</source>
+ <translation>Отваряне на URI</translation>
+ </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -507,14 +811,54 @@
<translation>&amp;Основни</translation>
</message>
<message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Пускане на Биткоин при вход в системата</translation>
+ <source>Size of &amp;database cache</source>
+ <translation>Размер на кеша в &amp;базата данни</translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation>Мегабайта</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside</source>
+ <translation>Приемай връзки отвън</translation>
+ </message>
+ <message>
+ <source>Allow incoming connections</source>
+ <translation>Позволи входящите връзки</translation>
+ </message>
+ <message>
+ <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
+ <translation>IP адрес на прокси (напр. за IPv4: 127.0.0.1 / за IPv6: ::1)</translation>
+ </message>
+ <message>
+ <source>Third party transaction URLs</source>
+ <translation>URL адреси на трети страни</translation>
+ </message>
+ <message>
+ <source>Reset all client options to default.</source>
+ <translation>Възстановете всички настройки по подразбиране.</translation>
+ </message>
+ <message>
+ <source>&amp;Reset Options</source>
+ <translation>&amp;Нулирай настройките</translation>
</message>
<message>
<source>&amp;Network</source>
<translation>&amp;Мрежа</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>По&amp;ртфейл</translation>
+ </message>
+ <message>
+ <source>Expert</source>
+ <translation>Експерт</translation>
+ </message>
+ <message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation>&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>Автоматично отваряне на входящия Bitcoin порт. Работи само с рутери поддържащи UPnP.</translation>
</message>
@@ -523,6 +867,14 @@
<translation>Отваряне на входящия порт чрез &amp;UPnP</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Свързване с Биткойн мрежата чрез SOCKS5 прокси.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>&amp;Свързване чрез SOCKS5 прокси (прокси по подразбиране):</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>Прокси &amp; АйПи:</translation>
</message>
@@ -547,10 +899,6 @@
<translation>&amp;Минимизиране в системния трей</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 Quit in the menu.</source>
- <translation>При затваряне на прозореца приложението остава минимизирано. Ако изберете тази опция, приложението може да се затвори само чрез Изход в менюто.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>М&amp;инимизиране при затваряне</translation>
</message>
@@ -563,18 +911,18 @@
<translation>Език:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Промяната на езика ще влезе в сила след рестартиране на Биткоин.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
- <translation>Мерни единици:</translation>
+ <translation>Мерна единица за показваните суми:</translation>
</message>
<message>
<source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
<translation>Изберете единиците, показвани по подразбиране в интерфейса.</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation>Дали да покаже възможностите за контрол на монетите или не.</translation>
+ </message>
+ <message>
<source>&amp;OK</source>
<translation>ОК</translation>
</message>
@@ -587,25 +935,65 @@
<translation>подразбиране</translation>
</message>
<message>
+ <source>none</source>
+ <translation>нищо</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <translation>Потвърдете отмяната на настройките.</translation>
+ </message>
+ <message>
+ <source>Client restart required to activate changes.</source>
+ <translation>Изисква се рестартиране на клиента за активиране на извършените промени.</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation>Тази промяна изисква рестартиране на клиента Ви.</translation>
+ </message>
+ <message>
<source>The supplied proxy address is invalid.</source>
- <translation>Прокси адресът е невалиден.</translation>
+ <translation>Текущият прокси адрес е невалиден.</translation>
</message>
</context>
<context>
<name>OverviewPage</name>
<message>
<source>Form</source>
- <translation>Форма</translation>
+ <translation>Формуляр</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>Текущата информация на екрана може да не е актуална. Вашият портфейл ще се синхронизира автоматично с мрежата на Биткоин, щом поне една връзката с нея се установи; този процес все още не е приключил.</translation>
+ </message>
+ <message>
+ <source>Watch-only:</source>
+ <translation>В наблюдателен режим:</translation>
</message>
<message>
<source>Available:</source>
<translation>Налично:</translation>
</message>
<message>
+ <source>Your current spendable balance</source>
+ <translation>Вашата текуща сметка за изразходване</translation>
+ </message>
+ <message>
<source>Pending:</source>
<translation>Изчакващо:</translation>
</message>
<message>
+ <source>Immature:</source>
+ <translation>Неразвит:</translation>
+ </message>
+ <message>
+ <source>Mined balance that has not yet matured</source>
+ <translation>Миниран баланс,който все още не се е развил</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation>Баланс</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation>Общо:</translation>
</message>
@@ -614,20 +1002,84 @@
<translation>Текущият ви общ баланс</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>несинхронизиран</translation>
+ <source>Spendable:</source>
+ <translation>За харчене:</translation>
</message>
-</context>
+ <message>
+ <source>Recent transactions</source>
+ <translation>Скорошни транзакции</translation>
+ </message>
+ </context>
<context>
<name>PaymentServer</name>
<message>
+ <source>URI handling</source>
+ <translation>Справяне с URI</translation>
+ </message>
+ <message>
+ <source>Invalid payment address %1</source>
+ <translation>Невалиден адрес на плащане %1</translation>
+ </message>
+ <message>
+ <source>Payment request rejected</source>
+ <translation>Заявката за плащане беше отхвърлена</translation>
+ </message>
+ <message>
+ <source>Payment request network doesn't match client network.</source>
+ <translation>Мрежата от която се извършва заявката за плащане не съвпада с мрежата на клиента.</translation>
+ </message>
+ <message>
+ <source>Requested payment amount of %1 is too small (considered dust).</source>
+ <translation>Заявената сума за плащане: %1 е твърде малка (счита се за отпадък)</translation>
+ </message>
+ <message>
+ <source>Payment request error</source>
+ <translation>Възникна грешка по време назаявката за плащане</translation>
+ </message>
+ <message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation>Биткойн не можe да се стартира: click-to-pay handler</translation>
+ </message>
+ <message>
+ <source>Payment request file handling</source>
+ <translation>Файл за справяне със заявки</translation>
+ </message>
+ <message>
+ <source>Refund from %1</source>
+ <translation>Възстановяване на сума от %1</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Дос защита на заявката за плащане</translation>
+ </message>
+ <message>
+ <source>Error communicating with %1: %2</source>
+ <translation>Грешка при комуникацията с %1: %2</translation>
+ </message>
+ <message>
+ <source>Bad response from server %1</source>
+ <translation>Възникна проблем при свързването със сървър %1</translation>
+ </message>
+ <message>
<source>Payment acknowledged</source>
- <translation>Плащането е приета</translation>
+ <translation>Плащането е прието</translation>
</message>
- </context>
+ <message>
+ <source>Network request error</source>
+ <translation>Грешка в мрежата по време на заявката</translation>
+ </message>
+</context>
<context>
<name>PeerTableModel</name>
- </context>
+ <message>
+ <source>User Agent</source>
+ <translation>Клиент на потребителя</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Време за отговор</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -635,13 +1087,57 @@
<translation>Сума</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation>Въведете Биткойн адрес (например: %1)</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation>%1 ден</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation>%1 час</translation>
+ </message>
+ <message>
+ <source>%1 m</source>
+ <translation>%1 минута</translation>
+ </message>
+ <message>
+ <source>%1 s</source>
+ <translation>%1 секунда</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Неналичен</translation>
+ </message>
+ <message>
<source>N/A</source>
- <translation>N/A</translation>
+ <translation>Несъществуващ</translation>
</message>
- </context>
+ <message>
+ <source>%1 ms</source>
+ <translation>%1 милисекунда</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
- </context>
+ <message>
+ <source>&amp;Save Image...</source>
+ <translation>&amp;Запиши изображение...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Image</source>
+ <translation>&amp;Копирай изображение</translation>
+ </message>
+ <message>
+ <source>Save QR Code</source>
+ <translation>Запази QR Код</translation>
+ </message>
+ <message>
+ <source>PNG Image (*.png)</source>
+ <translation>PNG Изображение (*.png)</translation>
+ </message>
+</context>
<context>
<name>RPCConsole</name>
<message>
@@ -650,7 +1146,7 @@
</message>
<message>
<source>N/A</source>
- <translation>N/A</translation>
+ <translation>Несъществуващ</translation>
</message>
<message>
<source>Client version</source>
@@ -661,10 +1157,26 @@
<translation>Данни</translation>
</message>
<message>
+ <source>Debug window</source>
+ <translation>Прозорец с грешки</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation>Основни</translation>
+ </message>
+ <message>
<source>Using OpenSSL version</source>
<translation>Използване на OpenSSL версия</translation>
</message>
<message>
+ <source>Using BerkeleyDB version</source>
+ <translation>Използване на база данни BerkeleyDB </translation>
+ </message>
+ <message>
+ <source>Startup time</source>
+ <translation>Време за стартиране</translation>
+ </message>
+ <message>
<source>Network</source>
<translation>Мрежа</translation>
</message>
@@ -681,16 +1193,104 @@
<translation>Текущ брой блокове</translation>
</message>
<message>
+ <source>Received</source>
+ <translation>Получени</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation>Изпратени</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation>&amp;Пиъри</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>Избери пиър за детайлна информация.</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <translation>Посока</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation>Версия</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation>Клиент на потребителя</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Услуги</translation>
+ </message>
+ <message>
+ <source>Starting Height</source>
+ <translation>Стартова височина</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation>Продължителност на връзката</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation>Изпратени за последно</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation>Получени за последно</translation>
+ </message>
+ <message>
+ <source>Bytes Sent</source>
+ <translation>Изпратени байтове</translation>
+ </message>
+ <message>
+ <source>Bytes Received</source>
+ <translation>Получени байтове</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Време за отговор</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Време на последния блок</translation>
</message>
<message>
+ <source>&amp;Open</source>
+ <translation>&amp;Отвори</translation>
+ </message>
+ <message>
+ <source>&amp;Console</source>
+ <translation>&amp;Конзола</translation>
+ </message>
+ <message>
+ <source>&amp;Network Traffic</source>
+ <translation>&amp;Мрежов Трафик</translation>
+ </message>
+ <message>
+ <source>&amp;Clear</source>
+ <translation>&amp;Изчисти</translation>
+ </message>
+ <message>
<source>Totals</source>
<translation>Общо:</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Отворете Биткой дебъг лог файла от настоящата Data папка. Може да отнеме няколко секунди при по - големи лог файлове.</translation>
+ <source>In:</source>
+ <translation>Входящи:</translation>
+ </message>
+ <message>
+ <source>Out:</source>
+ <translation>Изходящи</translation>
+ </message>
+ <message>
+ <source>Build date</source>
+ <translation>Дата на създаване</translation>
+ </message>
+ <message>
+ <source>Debug log file</source>
+ <translation>Лог файл,съдържащ грешките</translation>
</message>
<message>
<source>Clear console</source>
@@ -700,18 +1300,90 @@
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Използвайте стрелки надолу и нагореза разглеждане на историятаот команди и &lt;b&gt;Ctrl-L&lt;/b&gt; за изчистване на конзолата.</translation>
</message>
- </context>
+ <message>
+ <source>Type &lt;b&gt;help&lt;/b&gt; for an overview of available commands.</source>
+ <translation>Въведeте &lt;/b&gt;помощ&lt;/b&gt; за да видите наличните команди.</translation>
+ </message>
+ <message>
+ <source>%1 B</source>
+ <translation>%1 Байт</translation>
+ </message>
+ <message>
+ <source>%1 KB</source>
+ <translation>%1 Килобайт</translation>
+ </message>
+ <message>
+ <source>%1 MB</source>
+ <translation>%1 Мегабайт</translation>
+ </message>
+ <message>
+ <source>%1 GB</source>
+ <translation>%1 Гигабайт</translation>
+ </message>
+ <message>
+ <source>via %1</source>
+ <translation>посредством %1</translation>
+ </message>
+ <message>
+ <source>never</source>
+ <translation>Никога</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <translation>Входящи</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <translation>Изходящи</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Неизвестен</translation>
+ </message>
+ <message>
+ <source>Fetching...</source>
+ <translation>Прихващане...</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
+ <source>&amp;Amount:</source>
+ <translation>&amp;Сума</translation>
+ </message>
+ <message>
<source>&amp;Label:</source>
<translation>&amp;Име:</translation>
</message>
<message>
+ <source>&amp;Message:</source>
+ <translation>&amp;Съобщение:</translation>
+ </message>
+ <message>
+ <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
+ <translation>Използвате този формуляр за заявяване на плащания. Всички полета са &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>Незадължително заявяване на сума. Оставете полето празно или нулево, за да не заявите конкретна сума.</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation>Изчисти всички полета от формуляра.</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation>Изчистване</translation>
</message>
<message>
+ <source>Requested payments history</source>
+ <translation>Изискана история на плащанията</translation>
+ </message>
+ <message>
+ <source>&amp;Request payment</source>
+ <translation>&amp;Изискване на плащане</translation>
+ </message>
+ <message>
<source>Show</source>
<translation>Показване</translation>
</message>
@@ -735,6 +1407,26 @@
<context>
<name>ReceiveRequestDialog</name>
<message>
+ <source>QR Code</source>
+ <translation>QR код</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation>Копиране на &amp;URI</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Address</source>
+ <translation>&amp;Копирай адрес</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image...</source>
+ <translation>&amp;Запиши изображение...</translation>
+ </message>
+ <message>
+ <source>Request payment to %1</source>
+ <translation>Изискване на плащане от %1</translation>
+ </message>
+ <message>
<source>Payment information</source>
<translation>Данни за плащането</translation>
</message>
@@ -781,7 +1473,15 @@
<source>(no label)</source>
<translation>(без име)</translation>
</message>
- </context>
+ <message>
+ <source>(no message)</source>
+ <translation>(без съобщение)</translation>
+ </message>
+ <message>
+ <source>(no amount)</source>
+ <translation>(липсва сума)</translation>
+ </message>
+</context>
<context>
<name>SendCoinsDialog</name>
<message>
@@ -789,6 +1489,22 @@
<translation>Изпращане</translation>
</message>
<message>
+ <source>Coin Control Features</source>
+ <translation>Настройки за контрол на монетите</translation>
+ </message>
+ <message>
+ <source>automatically selected</source>
+ <translation>астоматично избран</translation>
+ </message>
+ <message>
+ <source>Insufficient funds!</source>
+ <translation>Нямате достатъчно налични пари!</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation>Количество:</translation>
+ </message>
+ <message>
<source>Bytes:</source>
<translation>Байтове:</translation>
</message>
@@ -805,6 +1521,54 @@
<translation>Такса:</translation>
</message>
<message>
+ <source>After Fee:</source>
+ <translation>След прилагане на ДДС</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation>Ресто</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>Ако тази опция е активирана,но адресът на промяна е празен или невалиден,промяната ще бъде изпратена на новосъздаден адрес.</translation>
+ </message>
+ <message>
+ <source>Transaction Fee:</source>
+ <translation>Такса за транзакцията:</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>Избери...</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>за килобайт</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>Крайна сума поне</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Препоръчителна:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>По избор:</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Време за потвърждение:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>нормален</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>бърз</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Изпращане към повече от един получател</translation>
</message>
@@ -813,6 +1577,14 @@
<translation>Добави &amp;получател</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation>Изчисти всички полета от формуляра.</translation>
+ </message>
+ <message>
+ <source>Dust:</source>
+ <translation>Прах:</translation>
+ </message>
+ <message>
<source>Clear &amp;All</source>
<translation>&amp;Изчисти</translation>
</message>
@@ -833,16 +1605,40 @@
<translation>Потвърждаване</translation>
</message>
<message>
+ <source>Copy quantity</source>
+ <translation>Копиране на количеството</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation>Копирай сума</translation>
</message>
<message>
- <source>or</source>
- <translation>или</translation>
+ <source>Copy fee</source>
+ <translation>Копиране на данък добавена стойност</translation>
+ </message>
+ <message>
+ <source>Copy after fee</source>
+ <translation>Копиране след прилагане на данък добавена стойност</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Невалиден адрес на получателя.</translation>
+ <source>Copy bytes</source>
+ <translation>Копиране на байтовете</translation>
+ </message>
+ <message>
+ <source>Copy priority</source>
+ <translation>Копиране на приоритет</translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation>Копирай рестото</translation>
+ </message>
+ <message>
+ <source>Total Amount %1 (= %2)</source>
+ <translation>Пълна сума %1 (= %2)</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation>или</translation>
</message>
<message>
<source>The amount to pay must be larger than 0.</source>
@@ -853,20 +1649,40 @@
<translation>Сумата надвишава текущия баланс</translation>
</message>
<message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation>Сумата при добавяне на данък добавена стойност по %1 транзакцията надвишава сумата по вашата сметка.</translation>
+ </message>
+ <message>
<source>Transaction creation failed!</source>
- <translation>Грешка при създаването на трансакция!</translation>
+ <translation>Грешка при създаването на транзакция!</translation>
+ </message>
+ <message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Платете минималната такса от %1</translation>
+ </message>
+ <message>
+ <source>Warning: Invalid Bitcoin address</source>
+ <translation>Внимание: Невалиден Биткойн адрес</translation>
</message>
<message>
<source>(no label)</source>
<translation>(без име)</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation>Внимание:Неизвестен адрес за промяна</translation>
+ </message>
+ <message>
+ <source>Copy dust</source>
+ <translation>Копирай прахта:</translation>
+ </message>
+ <message>
<source>Are you sure you want to send?</source>
<translation>Наистина ли искате да изпратите?</translation>
</message>
<message>
<source>added as transaction fee</source>
- <translation>добавено като такса за трансакция</translation>
+ <translation>добавено като такса за транзакция</translation>
</message>
</context>
<context>
@@ -888,6 +1704,10 @@
<translation>&amp;Име:</translation>
</message>
<message>
+ <source>Choose previously used address</source>
+ <translation>Изберете използван преди адрес</translation>
+ </message>
+ <message>
<source>This is a normal payment.</source>
<translation>Това е нормално плащане.</translation>
</message>
@@ -915,10 +1735,22 @@
<source>Pay To:</source>
<translation>Плащане на:</translation>
</message>
- </context>
+ <message>
+ <source>Memo:</source>
+ <translation>Бележка:</translation>
+ </message>
+</context>
<context>
<name>ShutdownWindow</name>
- </context>
+ <message>
+ <source>Bitcoin Core is shutting down...</source>
+ <translation>Биткойн ядрото се изключва...</translation>
+ </message>
+ <message>
+ <source>Do not shut down the computer until this window disappears.</source>
+ <translation>Не изключвайте компютъра докато този прозорец не изчезне.</translation>
+ </message>
+</context>
<context>
<name>SignVerifyMessageDialog</name>
<message>
@@ -930,8 +1762,8 @@
<translation>&amp;Подпиши</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Можете да подпишете съобщение като доказателство, че притежавате определен адрес. Бъдете внимателни и не подписвайте съобщения, които биха разкрили лична информация без вашето съгласие.</translation>
+ <source>Choose previously used address</source>
+ <translation>Изберете използван преди адрес</translation>
</message>
<message>
<source>Alt+A</source>
@@ -978,6 +1810,10 @@
<translation>Проверете съобщение, за да сте сигурни че е подписано с определен Биткоин адрес</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation>Потвърди &amp;съобщението</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation>Натиснете "Подписване на съобщение" за да създадете подпис</translation>
</message>
@@ -990,16 +1826,20 @@
<translation>Моля проверете адреса и опитайте отново.</translation>
</message>
<message>
+ <source>The entered address does not refer to a key.</source>
+ <translation>Въведеният адрес не може да се съпостави с валиден ключ.</translation>
+ </message>
+ <message>
<source>Wallet unlock was cancelled.</source>
<translation>Отключването на портфейла беше отменено.</translation>
</message>
<message>
<source>Private key for the entered address is not available.</source>
- <translation>Не е наличен частният ключ за въведеният адрес.</translation>
+ <translation>Не е наличен частен ключ за въведеният адрес.</translation>
</message>
<message>
<source>Message signing failed.</source>
- <translation>Подписването на съобщение бе неуспешно.</translation>
+ <translation>Подписването на съобщение беше неуспешно.</translation>
</message>
<message>
<source>Message signed.</source>
@@ -1029,13 +1869,25 @@
<context>
<name>SplashScreen</name>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Биткойн ядро</translation>
+ </message>
+ <message>
+ <source>The Bitcoin Core developers</source>
+ <translation>Разработчици на Bitcoin Core</translation>
+ </message>
+ <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
</context>
<context>
<name>TrafficGraphWidget</name>
- </context>
+ <message>
+ <source>KB/s</source>
+ <translation>Килобайта в секунда</translation>
+ </message>
+</context>
<context>
<name>TransactionDesc</name>
<message>
@@ -1043,6 +1895,10 @@
<translation>Подлежи на промяна до %1</translation>
</message>
<message>
+ <source>conflicted</source>
+ <translation>припокриващ се</translation>
+ </message>
+ <message>
<source>%1/offline</source>
<translation>%1/офлайн</translation>
</message>
@@ -1104,7 +1960,7 @@
</message>
<message>
<source>Net amount</source>
- <translation>Сума нето</translation>
+ <translation>Нетна сума</translation>
</message>
<message>
<source>Message</source>
@@ -1123,8 +1979,12 @@
<translation>Търговец</translation>
</message>
<message>
+ <source>Debug information</source>
+ <translation>Информация за грешките</translation>
+ </message>
+ <message>
<source>Transaction</source>
- <translation>Трансакция</translation>
+ <translation>Транзакция</translation>
</message>
<message>
<source>Amount</source>
@@ -1151,11 +2011,11 @@
<name>TransactionDescDialog</name>
<message>
<source>Transaction details</source>
- <translation>Трансакция</translation>
+ <translation>Транзакция</translation>
</message>
<message>
<source>This pane shows a detailed description of the transaction</source>
- <translation>Описание на трансакцията</translation>
+ <translation>Описание на транзакцията</translation>
</message>
</context>
<context>
@@ -1169,10 +2029,6 @@
<translation>Тип</translation>
</message>
<message>
- <source>Address</source>
- <translation>Адрес</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Подлежи на промяна до %1</translation>
</message>
@@ -1189,6 +2045,14 @@
<translation>Генерирана, но отхвърлена от мрежата</translation>
</message>
<message>
+ <source>Offline</source>
+ <translation>Извън линия</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation>Име</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Непотвърдено</translation>
</message>
@@ -1202,7 +2066,7 @@
</message>
<message>
<source>Received with</source>
- <translation>Получени с</translation>
+ <translation>Получени</translation>
</message>
<message>
<source>Received from</source>
@@ -1226,19 +2090,15 @@
</message>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Състояние на трансакцията. Задръжте върху това поле за брой потвърждения.</translation>
+ <translation>Състояние на транзакцията. Задръжте върху това поле за брой потвърждения.</translation>
</message>
<message>
<source>Date and time that the transaction was received.</source>
- <translation>Дата и час на получаване.</translation>
+ <translation>Дата и час на получаване на транзакцията.</translation>
</message>
<message>
<source>Type of transaction.</source>
- <translation>Вид трансакция.</translation>
- </message>
- <message>
- <source>Destination address of transaction.</source>
- <translation>Получател на трансакцията.</translation>
+ <translation>Вид транзакция.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -1316,16 +2176,20 @@
<translation>Копирай сума</translation>
</message>
<message>
+ <source>Copy transaction ID</source>
+ <translation>Копирай транзакция с ID</translation>
+ </message>
+ <message>
<source>Edit label</source>
<translation>Редактирай име</translation>
</message>
<message>
<source>Show transaction details</source>
- <translation>Подробности за трансакцията</translation>
+ <translation>Подробности за транзакцията</translation>
</message>
<message>
<source>Export Transaction History</source>
- <translation>Изнасяне историята на трансакциите</translation>
+ <translation>Изнасяне историята на транзакциите</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -1336,6 +2200,10 @@
<translation>Изнасянето е успешна</translation>
</message>
<message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation>Историята с транзакциите беше успешно запазена в %1.</translation>
+ </message>
+ <message>
<source>Comma separated file (*.csv)</source>
<translation>CSV файл (*.csv)</translation>
</message>
@@ -1392,6 +2260,10 @@
<context>
<name>WalletView</name>
<message>
+ <source>&amp;Export</source>
+ <translation>Изнеси</translation>
+ </message>
+ <message>
<source>Export the data in the current tab to a file</source>
<translation>Запишете данните от текущия раздел във файл</translation>
</message>
@@ -1399,7 +2271,27 @@
<source>Backup Wallet</source>
<translation>Запазване на портфейла</translation>
</message>
- </context>
+ <message>
+ <source>Wallet Data (*.dat)</source>
+ <translation>Информация за портфейла (*.dat)</translation>
+ </message>
+ <message>
+ <source>Backup Failed</source>
+ <translation>Неуспешно запазване на портфейла</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the wallet data to %1.</source>
+ <translation>Възникна грешка при запазването на информацията за портфейла в %1.</translation>
+ </message>
+ <message>
+ <source>The wallet data was successfully saved to %1.</source>
+ <translation>Информацията за портфейла беше успешно запазена в %1.</translation>
+ </message>
+ <message>
+ <source>Backup Successful</source>
+ <translation>Успешно запазване на портфейла</translation>
+ </message>
+</context>
<context>
<name>bitcoin-core</name>
<message>
@@ -1411,22 +2303,50 @@
<translation>Определете директория за данните</translation>
</message>
<message>
+ <source>Connect to a node to retrieve peer addresses, and disconnect</source>
+ <translation>Свържете се към сървър за да можете да извлечете адресите на пиърите след което се разкачете.</translation>
+ </message>
+ <message>
+ <source>Specify your own public address</source>
+ <translation>Въведете Ваш публичен адрес</translation>
+ </message>
+ <message>
<source>Use the test network</source>
<translation>Използвайте тестовата мрежа</translation>
</message>
<message>
+ <source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
+ <translation>Приемайте връзки отвън.(по подразбиране:1 в противен случай -proxy или -connect)</translation>
+ </message>
+ <message>
<source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
- <translation>Внимание: -paytxfee има голяма стойност! Това е таксата за транзакциите, която ще платите ако направите транзакция.</translation>
+ <translation>Внимание: -paytxfee е с мното голяма зададена стойност! Това е транзакционната такса, която ще платите ако направите транзакция.</translation>
+ </message>
+ <message>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Сложете в бял списък пиъри,свързващи се от дадената интернет маска или айпи адрес.Може да бъде заложено неколкократно.</translation>
</message>
<message>
<source>(default: 1)</source>
<translation>(по подразбиране 1)</translation>
</message>
<message>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;category&gt; може да бъде:</translation>
+ </message>
+ <message>
<source>Connection options:</source>
<translation>Настройки на връзката:</translation>
</message>
<message>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation>Желаете ли да пресъздадете базата данни с блокове сега?</translation>
+ </message>
+ <message>
+ <source>Error initializing block database</source>
+ <translation>Грешка в пускането на базата данни с блокове</translation>
+ </message>
+ <message>
<source>Error: Disk space is low!</source>
<translation>Грешка: мястото на диска е малко!</translation>
</message>
@@ -1451,24 +2371,64 @@
<translation>Настройки на портфейла:</translation>
</message>
<message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>Заложете броя на нишки за генерация на монети ако е включено(-1 = всички ядра, по подразбиране: %d)</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Внимание: -maxtxfee има много висока стойност! Толкова високи такси могат да бъдат заплатени на една транзакция.</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Изберете директория при стартиране на програмата.( настройка по подразбиране:0)</translation>
+ </message>
+ <message>
+ <source>Connect through SOCKS5 proxy</source>
+ <translation>Свързване чрез SOCKS5 прокси</translation>
+ </message>
+ <message>
+ <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
+ <translation>Всички права запазени (C) 2009-%i Доставчиците на Биткойн</translation>
+ </message>
+ <message>
<source>Information</source>
- <translation>Данни</translation>
+ <translation>Информация</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Невалидна сума за -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Невалидна сума за -mintxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Изпрати локализиращата или дебъг информацията към конзолата, вместо файлът debug.log</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Задаване на език,например "de_DE" (по подразбиране: system locale)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Стартирай минимизирано</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation>Това е експериментален софтуер.</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
- <translation>Сумата на трансакцията е твърде малка</translation>
+ <translation>Сумата на транзакцията е твърде малка</translation>
</message>
<message>
<source>Transaction amounts must be positive</source>
- <translation>Сумите на трансакциите трябва да са положителни</translation>
+ <translation>Сумите на транзакциите трябва да са положителни</translation>
</message>
<message>
<source>Transaction too large</source>
- <translation>Трансакцията е твърде голяма</translation>
+ <translation>Транзакцията е твърде голяма</translation>
</message>
<message>
<source>Username for JSON-RPC connections</source>
@@ -1479,8 +2439,8 @@
<translation>Предупреждение</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Внимание: Използвате остаряла версия, необходимо е обновление!</translation>
+ <source>on startup</source>
+ <translation>по време на стартирането</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -1492,7 +2452,7 @@
</message>
<message>
<source>Rescan the block chain for missing wallet transactions</source>
- <translation>Повторно сканиране на блок-връзка за липсващи портфейлни трансакции</translation>
+ <translation>Повторно сканиране на блок-връзка за липсващи портфейлни транзакции</translation>
</message>
<message>
<source>Use OpenSSL (https) for JSON-RPC connections</source>
@@ -1504,7 +2464,7 @@
</message>
<message>
<source>Loading addresses...</source>
- <translation>Зареждане на адресите...</translation>
+ <translation>Зареждане на адреси...</translation>
</message>
<message>
<source>Error loading wallet.dat: Wallet corrupted</source>
@@ -1519,6 +2479,22 @@
<translation>Невалиден -proxy address: '%s'</translation>
</message>
<message>
+ <source>Specify configuration file (default: %s)</source>
+ <translation>Назовете конфигурационен файл(по подразбиране %s)</translation>
+ </message>
+ <message>
+ <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
+ <translation>Задайте време на изключване при проблеми със свързването в милисекунди(минимум:1, по подразбиране %d)</translation>
+ </message>
+ <message>
+ <source>Specify pid file (default: %s)</source>
+ <translation>Задайте pid файл(по подразбиране: %s)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Невалидна сума за -paytxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Insufficient funds</source>
<translation>Недостатъчно средства</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bs.ts b/src/qt/locale/bitcoin_bs.ts
index 86526022fe..fc5e6d270e 100644
--- a/src/qt/locale/bitcoin_bs.ts
+++ b/src/qt/locale/bitcoin_bs.ts
@@ -1,4 +1,4 @@
-<TS language="bs" version="2.0">
+<TS language="bs" version="2.1">
<context>
<name>AddressBookPage</name>
</context>
diff --git a/src/qt/locale/bitcoin_ca.ts b/src/qt/locale/bitcoin_ca.ts
index 8f06ac3aa7..f7d97eb061 100644
--- a/src/qt/locale/bitcoin_ca.ts
+++ b/src/qt/locale/bitcoin_ca.ts
@@ -1,9 +1,9 @@
-<TS language="ca" version="2.0">
+<TS language="ca" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Feu doble clic per editar l'adreça o l'etiqueta</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Feu clic dret per a editar l'adreça o l'etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>Canvia la contrasenya</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Introduïu tant la contrasenya antiga com la nova del moneder.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirma l'encriptació del moneder</translation>
</message>
@@ -188,10 +184,6 @@
<translation>Introduïu la contrasenya nova al moneder.&lt;br/&gt;Utilitzeu una contrasenya de &lt;b&gt;deu o més caràcters aleatoris&lt;/b&gt;, o &lt;b&gt;vuit o més paraules&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin es tancarà ara per acabar el procés d'encriptació. Recordeu que encriptar el moneder no protegeix completament els bitcoins de ser robats per programari maliciós instal·lat a l'ordinador.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>L'encriptació del moneder ha fallat</translation>
</message>
@@ -311,10 +303,6 @@
<translation>Envia monedes a una adreça Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modifica les opcions de configuració per bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Realitza una còpia de seguretat del moneder a una altra ubicació</translation>
</message>
@@ -491,14 +479,6 @@
<translation>Transacció entrant</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Data: %1\nImport: %2\n Tipus: %3\n Adreça: %4\n</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>El moneder està &lt;b&gt;encriptat&lt;/b&gt; i actualment &lt;b&gt;desbloquejat&lt;/b&gt;</translation>
</message>
@@ -517,6 +497,10 @@ Address: %4
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Selecció de moneda</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Quantitat:</translation>
</message>
@@ -534,7 +518,7 @@ Address: %4
</message>
<message>
<source>Fee:</source>
- <translation>Quota:</translation>
+ <translation>Comissió</translation>
</message>
<message>
<source>Dust:</source>
@@ -542,7 +526,7 @@ Address: %4
</message>
<message>
<source>After Fee:</source>
- <translation>Quota posterior:</translation>
+ <translation>Comissió posterior:</translation>
</message>
<message>
<source>Change:</source>
@@ -562,7 +546,15 @@ Address: %4
</message>
<message>
<source>Amount</source>
- <translation>Quantitat</translation>
+ <translation>Import</translation>
+ </message>
+ <message>
+ <source>Received with label</source>
+ <translation>Rebut amb l'etiqueta</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Rebut amb l'adreça</translation>
</message>
<message>
<source>Date</source>
@@ -689,12 +681,8 @@ Address: %4
<translation>no</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Aquesta etiqueta es posa de color vermell si la mida de la transacció és més gran de 1000 bytes.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
- <translation>Això comporta una comissi d'almenys %1 per kB.</translation>
+ <translation>Això comporta una comissió d'almenys %1 per kB.</translation>
</message>
<message>
<source>Can vary +/- 1 byte per input.</source>
@@ -705,14 +693,6 @@ Address: %4
<translation>Les transaccions amb una major prioritat són més propenses a ser incloses en un bloc.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Aquesta etiqueta es torna vermella si la prioritat és menor que «mitjana».</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Aquesta etiqueta es torna vermella si qualsevol destinatari rep un import inferior a %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(sense etiqueta)</translation>
</message>
@@ -729,7 +709,7 @@ Address: %4
<name>EditAddressDialog</name>
<message>
<source>Edit Address</source>
- <translation>Editar Adreça</translation>
+ <translation>Edita l'adreça</translation>
</message>
<message>
<source>&amp;Label</source>
@@ -833,30 +813,6 @@ Address: %4
<source>command-line options</source>
<translation>Opcions de la línia d'ordres</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Opcions de IU</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Defineix un idioma, per exemple "de_DE" (per defecte: preferències locals de sistema)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Inicia minimitzat</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Defineix certificats arrel SSL per a la sol·licitud de pagament (per defecte: -sistema-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Mostra la finestra de benvinguda a l'inici (per defecte: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Tria el directori de dades a l'inici (per defecte: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -896,7 +852,15 @@ Address: %4
<source>Error</source>
<translation>Error</translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>%n GB d'espai lliure disponible</numerusform><numerusform>%n GB d'espai lliure disponible</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(de %n GB necessari)</numerusform><numerusform>(de %n GB necessaris)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -931,14 +895,6 @@ Address: %4
<translation>&amp;Principal</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Inicia automàticament el Bitcoin després de l'inici de sessió del sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Inicia el Bitcoin a l'inici de sessió del sistema.</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Mida de la memòria cau de la base de &amp;dades</translation>
</message>
@@ -1019,6 +975,14 @@ Address: %4
<translation>Port obert amb &amp;UPnP</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Connecta a la xarxa Bitcoin a través d'un proxy SOCKS5.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>&amp;Connecta a través d'un proxy SOCKS5 (proxy per defecte):</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>&amp;IP del proxy:</translation>
</message>
@@ -1043,10 +1007,6 @@ Address: %4
<translation>&amp;Minimitza a la barra d'aplicacions en comptes de la barra de tasques</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 Quit in the menu.</source>
- <translation>Minimitza en comptes de sortir de la aplicació al tancar la finestra. Quan aquesta opció està activa, la aplicació només es tancarà al seleccionar Sortir al menú.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimitza en tancar</translation>
</message>
@@ -1059,10 +1019,6 @@ Address: %4
<translation>&amp;Llengua de la interfície d'usuari:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Aquí podeu definir la llengua de l'aplicació. Aquesta configuració tindrà efecte una vegada es reiniciï Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unitats per mostrar els imports en:</translation>
</message>
@@ -1099,10 +1055,6 @@ Address: %4
<translation>Cal reiniciar el client per activar els canvis.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>S'aturarà el client, voleu procedir?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Amb aquest canvi cal un reinici del client.</translation>
</message>
@@ -1150,6 +1102,10 @@ Address: %4
<translation>Balanç minat que encara no ha madurat</translation>
</message>
<message>
+ <source>Balances</source>
+ <translation>Balances</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation>Total:</translation>
</message>
@@ -1162,6 +1118,14 @@ Address: %4
<translation>El vostre balanç actual en adreces de només lectura</translation>
</message>
<message>
+ <source>Spendable:</source>
+ <translation>Que es pot gastar:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation>Transaccions recents</translation>
+ </message>
+ <message>
<source>Unconfirmed transactions to watch-only addresses</source>
<translation>Transaccions sense confirmar a adreces de només lectura</translation>
</message>
@@ -1173,10 +1137,6 @@ Address: %4
<source>Current total balance in watch-only addresses</source>
<translation>Balanç total actual en adreces de només lectura</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>Fora de sincronia</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1197,10 +1157,6 @@ Address: %4
<translation>La xarxa de la sol·licitud de pagament no coincideix amb la xarxa del client.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>La sol·licitud de pagament ha caducat.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>La sol·licitud de pagament no està inicialitzada.</translation>
</message>
@@ -1241,6 +1197,14 @@ Address: %4
<translation>Reemborsament de %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>La sol·licitud de pagament %1 és massa gran (%2 bytes, permès %3 bytes).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Protecció de DoS per a la sol·licitud de pagament</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Error en comunicar amb %1: %2</translation>
</message>
@@ -1268,10 +1232,6 @@ Address: %4
<translation>Agent d'usuari</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adreça / nom de l'ordinador</translation>
- </message>
- <message>
<source>Ping Time</source>
<translation>Temps de ping</translation>
</message>
@@ -1280,7 +1240,7 @@ Address: %4
<name>QObject</name>
<message>
<source>Amount</source>
- <translation>Quantitat</translation>
+ <translation>Import</translation>
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
@@ -1303,14 +1263,6 @@ Address: %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>XARXA</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>DESCONEGUT</translation>
- </message>
- <message>
<source>None</source>
<translation>Cap</translation>
</message>
@@ -1509,18 +1461,10 @@ Address: %4
<translation>Fitxer de registre de depuració</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Obre el fitxer de registre de depuració de Bitcoin del directori de dades actual. Això pot trigar uns quants segons per a fitxers de registre grans.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Neteja la consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Us donem la benvinguda a la consola RPC de Bitcoin</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Utilitza les fletxes d'amunt i avall per navegar per l'historial, i &lt;b&gt;Ctrl-L&lt;\b&gt; per netejar la pantalla.</translation>
</message>
@@ -1782,7 +1726,7 @@ Address: %4
</message>
<message>
<source>After Fee:</source>
- <translation>Quota posterior:</translation>
+ <translation>Comissió posterior:</translation>
</message>
<message>
<source>Change:</source>
@@ -1797,6 +1741,70 @@ Address: %4
<translation>Personalitza l'adreça de canvi</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Comissió de transacció</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>Tria...</translation>
+ </message>
+ <message>
+ <source>collapse fee-settings</source>
+ <translation>redueix els paràmetres de comissió</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>per kilobyte</translation>
+ </message>
+ <message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>Si la comissió personalitzada es defineix a 1000 satoshis i la transacció és de només 250 bytes, llavors «per kilobyte» només es paguen 250 satoshis en una comissió, mentre que amb la de «total com a mínim» es pagarien 1000 satoshis. Per a transaccions superiors al kilobyte, en tots dos casos es paga per kilobyte.</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>total com a mínim</translation>
+ </message>
+ <message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>No hi ha cap problema en pagar només la comissió mínima sempre que hi hagi menys volum de transacció que espai en els blocs. Però tingueu present que això pot acabar en una transacció que mai es confirmi una vegada hi hagi més demanda de transaccions de bitcoins que la xarxa pugui processar.</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(llegiu l'indicador de funció)</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Recomanada:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>Personalitzada:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(No s'ha inicialitzat encara la comissió intel·ligent. Normalment pren uns pocs blocs...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Temps de confirmació:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>normal</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>ràpid</translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Envia com a transacció de comissió zero si és possible</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(la confirmació pot trigar més temps)</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Envia a múltiples destinataris al mateix temps</translation>
</message>
@@ -1846,7 +1854,7 @@ Address: %4
</message>
<message>
<source>Copy fee</source>
- <translation>Copia la comissi</translation>
+ <translation>Copia la comissió</translation>
</message>
<message>
<source>Copy after fee</source>
@@ -1873,10 +1881,6 @@ Address: %4
<translation>o</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>L'adreça de destinatari no és vàlida, si us plau comprovi-la.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>L'import a pagar ha de ser major que 0.</translation>
</message>
@@ -1886,11 +1890,7 @@ Address: %4
</message>
<message>
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>El total excedeix el teu balanç quan s'afegeix la comisió a la transacció %1.</translation>
- </message>
- <message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>S'ha trobat una adreça duplicada, tan sols es pot enviar a cada adreça un cop per ordre de enviament.</translation>
+ <translation>El total excedeix el teu balanç quan s'afegeix la comissió a la transacció %1.</translation>
</message>
<message>
<source>Transaction creation failed!</source>
@@ -1901,6 +1901,10 @@ Address: %4
<translation>S'ha rebutjat la transacció! Això pot passar si alguna de les monedes del vostre moneder ja s'han gastat; per exemple, si heu fet servir una còpia de seguretat del fitxer wallet.dat i s'haguessin gastat monedes de la còpia però sense marcar-les-hi com a gastades.</translation>
</message>
<message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Paga només la comissió mínima de %1</translation>
+ </message>
+ <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Avís: adreça Bitcoin no vàlida</translation>
</message>
@@ -1976,10 +1980,6 @@ Address: %4
<translation>Missatge:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Aquesta és una sol·licitud de pagament verificada.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Introduïu una etiqueta per a aquesta adreça per afegir-la a la llista d'adreces utilitzades</translation>
</message>
@@ -1988,10 +1988,6 @@ Address: %4
<translation>Un missatge que s'ha adjuntat al bitcoin: URI que s'emmagatzemarà amb la transacció per a la vostra referència. Nota: el missatge no s'enviarà a través de la xarxa Bitcoin.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Aquesta és una sol·licitud de pagament no verificada.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Paga a:</translation>
</message>
@@ -2022,10 +2018,6 @@ Address: %4
<translation>&amp;Signa el missatge</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Podeu signar missatges amb la vostra adreça per provar que són vostres. Aneu amb compte no signar qualsevol cosa, ja que els atacs de pesca electrònica (phishing) poden provar de confondre-us perquè els signeu amb la vostra identitat. Només signeu als documents completament detallats amb què hi esteu d'acord.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>L'adreça Bitcoin amb què signar el missatge</translation>
</message>
@@ -2078,10 +2070,6 @@ Address: %4
<translation>&amp;Verifica el missatge</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Introdueixi l'adreça signant, missatge (assegura't que copies salts de línia, espais, tabuladors, etc excactament tot el text) i la signatura a sota per verificar el missatge. Per evitar ser enganyat per un atac home-entre-mig, vés amb compte de no llegir més en la signatura del que hi ha al missatge signat mateix.</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>L'adreça Bitcoin amb què va ser signat el missatge</translation>
</message>
@@ -2300,7 +2288,7 @@ Address: %4
</message>
<message>
<source>Amount</source>
- <translation>Quantitat</translation>
+ <translation>Import</translation>
</message>
<message>
<source>true</source>
@@ -2345,10 +2333,6 @@ Address: %4
<translation>Tipus</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Immadur (%1 confirmacions, serà disponible després de %2)</translation>
</message>
@@ -2377,6 +2361,10 @@ Address: %4
<translation>Fora de línia</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Sense confirmar</translation>
</message>
@@ -2429,8 +2417,8 @@ Address: %4
<translation>Tipus de transacció.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Adreça del destinatari de la transacció.</translation>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation>Si està implicada o no una adreça només de lectura en la transacció.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2524,6 +2512,10 @@ Address: %4
<translation>Exporta l'historial de transacció</translation>
</message>
<message>
+ <source>Watch-only</source>
+ <translation>Només de lectura</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation>L'exportació ha fallat</translation>
</message>
@@ -2667,29 +2659,6 @@ Address: %4
<translation>Accepta connexions de fora (per defecte: 1 si no -proxy o -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, heu de establir una contrasenya RPC al fitxer de configuració: %s
-Es recomana que useu la següent contrasenya aleatòria:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(no necesiteu recordar aquesta contrasenya)
-El nom d'usuari i la contrasenya NO HAN de ser els mateixos.
-Si el fitxer no existeix, crea'l amb els permisos de fitxer de només lectura per al propietari.
-També es recomana establir la notificació d'alertes i així sereu notificat de les incidències;
-per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Vincula a una adreça específica i sempre escolta-hi. Utilitza la notació [host]:port per IPv6</translation>
</message>
@@ -2698,16 +2667,12 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Elimina totes les transaccions del moneder i només recupera aquelles de la cadena de blocs a través de -rescan a l'inici</translation>
</message>
<message>
- <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
- <translation>Entra en el mode de proves de regressió, que utilitza una cadena especial en què els blocs poden resoldre's al moment.</translation>
- </message>
- <message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Error: La transacció ha estat rebutjada. Això pot passar si alguna de les monedes del teu moneder ja s'han gastat, com si haguesis usat una copia de l'arxiu wallet.dat i s'haguessin gastat monedes de la copia però sense marcar com gastades en aquest.</translation>
+ <source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
+ <translation>Distribuït sota llicència de programari MIT. Vegeu el fitxer acompanyant COPYING o &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Error: Aquesta transacció requereix una comissió d'almenys %s degut al seu import, complexitat o per l'ús de fons recentment rebuts!</translation>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>Entra en el mode de proves de regressió, que utilitza una cadena especial en què els blocs poden resoldre's al moment.</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
@@ -2750,6 +2715,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Avís: el fitxer wallet.dat és corrupte, dades rescatades! L'arxiu wallet.dat original ha estat desat com wallet.{estampa_temporal}.bak al directori %s; si el teu balanç o transaccions son incorrectes hauries de restaurar-lo de un backup.</translation>
</message>
<message>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Afegeix a la llista blanca els iguals que es connecten de la màscara de xarxa o adreça IP donada. Es pot especificar moltes vegades.</translation>
+ </message>
+ <message>
<source>(default: 1)</source>
<translation>(per defecte: 1)</translation>
</message>
@@ -2782,10 +2751,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opcions de depuració/proves:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Descobreix la pròpia adreça IP (per defecte: 1 quan escoltant i no -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>No carreguis el moneder i inhabilita les crides RPC del moneder</translation>
</message>
@@ -2810,12 +2775,12 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Error en obrir la base de dades de blocs</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>Error: Espai al disc baix!</translation>
+ <source>Error: A fatal internal error occured, see debug.log for details</source>
+ <translation>Error: s'ha produït un error intern fatal. Consulteu debug.log per a més detalls</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Error: El moneder està bloquejat, no és possible crear la transacció!</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>Error: Espai al disc baix!</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
@@ -2842,8 +2807,8 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>No hi ha suficient descriptors de fitxers disponibles.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Reconstrueix l'índex de la cadena de blocs dels fitxers actuals blk000??.dat</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Només connecta als nodes de la xarxa &lt;net&gt; (ipv4, ipv6 o onion)</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -2862,6 +2827,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Això es així per a eines de proves de regressió per al desenvolupament d'aplicacions.</translation>
</message>
<message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Utilitza UPnP per a mapejar el port d'escolta (per defecte: %u)</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>S'estan verificant els blocs...</translation>
</message>
@@ -2926,6 +2895,18 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Comissions (en BTC/Kb) inferiors a això es consideren de comissió zero per a la creació de la transacció (per defecte: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Si no s'especifica una paytxfee (comissió de transacció de pagament), inclogueu suficient comissió per tal que les transaccions comencin a confirmar-se en una mitja de n blocs (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Import no vàlid per a -maxtxfee=&lt;amount&gt;: '%s' (cal que sigui com a mínim la comissió de minrelay de %s per evitar que les comissions s'encallin)</translation>
+ </message>
+ <message>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>Mida màxima de les dades en les transaccions de l'operador en què confiem i en les meves (per defecte: %u)</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Consulta a adreces d'iguals a través de DNS, si es troba baix en adreces (per defecte: 1 a menys que -connect)</translation>
</message>
@@ -2934,10 +2915,41 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Defineix la mida màxima de transaccions d'alta prioritat / baixa comissió en bytes (per defecte: %d)</translation>
</message>
<message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>Defineix el nombre de fils per a la generació de moneda si està habilitat (-1 = tots els nuclis, per defecte: %d)</translation>
+ </message>
+ <message>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation>Aquest producte inclou programari desenvolupat pel projecte OpenSSL per a ús a l'OpenSSL Toolkit &lt;https://www.openssl.org/&gt; i programari criptogràfic escrit per Eric Young i programari UPnP escrit per Thomas Bernard.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>Per utilitzar bitcoind, o l'opció de serviddor de bitcoin-qt, heu de definir una rpcpassword en el fitxer de configuració:
+%s
+Es recomana que utilitzeu la contrasenya aleatòria següent:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(no cal que recordeu la contrasenya)
+El nom d'usuari i la contrasenya NO han de ser els mateixos.
+Si el fitxer no existeix, creeu-ne un amb permisos de lectura només per al seu propietari.
+Es recomana definir alertnotify per tal de ser notificat de qualsevol problema;
+per exemple: alertnotify=echo %%s | mail -s "Avís de Bitcoin" admin@foo.com</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Avís: s'ha especificat un -maxtxfee molt alt! Comissions tan grans podrien pagar-se en una única transacció.</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Avís: comproveu que la data i hora del vostre ordinador siguin correctes! Si el vostre rellotge no és correcte, el Bitcoin Core no funcionarà correctament.</translation>
</message>
@@ -2946,10 +2958,18 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Els iguals en la llista blanca no poden ser bandejats per DoS i es transmetran sempre llurs transaccions, fins i tot si ja són a la mempool. Això és útil, p. ex., per a una passarel·la</translation>
</message>
<message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Accepta sol·licituds REST públiques (per defecte: %u)</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>No es pot resoldre l'adreça -whitebind: «%s»</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Tria el directori de dades a l'inici (per defecte: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Connecta a través del proxy SOCKS5</translation>
</message>
@@ -2966,6 +2986,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Error en carregar wallet.dat: el moneder requereix una versió més nova del Bitcoin core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Error en llegir la base de dades, tancant.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Error: s'ha trobat un argument -tor no acceptat. Feu servir -onion.</translation>
</message>
@@ -2982,6 +3006,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ha fallat la inicialització de la comprovació de validesa. El Bitcoin Core s'està aturant.</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Import no vàlid per a -maxtxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Import no vàlid per a -minrelaytxfee=&lt;amount&gt;: «%s»</translation>
</message>
@@ -2998,8 +3026,8 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>S'ha especificat una màscara de xarxa no vàlida a -whitelist: «%s»</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Manté com a màxim &lt;n&gt; blocs no connectables en memòria (per defecte: %u)</translation>
+ <source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
+ <translation>Manté com a màxim &lt;n&gt; transaccions no connectables en memòria (per defecte: %u)</translation>
</message>
<message>
<source>Need to specify a port with -whitebind: '%s'</source>
@@ -3010,10 +3038,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opcions de transmissió del node:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Imprimeix el block a l'inici, si es troba l'índex de blocs</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Opcions RPC SSL: (veieu el wiki del Bitcoin per a instruccions de configuració de l'SSL)</translation>
</message>
@@ -3022,6 +3046,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opcions del servidor RPC:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>Suport RPC per a connexions HTTP persistents (per defecte: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Descarta a l'atzar 1 de cada &lt;n&gt; missatges de la xarxa</translation>
</message>
@@ -3034,10 +3062,26 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation>
</message>
<message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>Envia les transaccions com a transaccions de comissió zero sempre que sigui possible (per defecte: %u) </translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Defineix certificats arrel SSL per a la sol·licitud de pagament (per defecte: -sistema-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Defineix un idioma, per exemple «de_DE» (per defecte: preferències locals de sistema)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Mostra la finestra de benvinguda a l'inici (per defecte: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Redueix el fitxer debug.log durant l'inici del client (per defecte: 1 quan no -debug)</translation>
</message>
@@ -3046,6 +3090,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ha fallat la signatura de la transacció</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Inicia minimitzat</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Això és programari experimental.</translation>
</message>
@@ -3058,6 +3106,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Els imports de les transaccions han de ser positius</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transacció massa gran per a la política de comissions</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>La transacció és massa gran</translation>
</message>
@@ -3082,10 +3134,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Avís</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Avís: aquesta versió està obsoleta. És necessari actualitzar-la!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Avís: s'ha ignorat l'argument no acceptat de -benchmark. Feu servir -debug=bench.</translation>
</message>
@@ -3142,14 +3190,170 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Error en carregar wallet.dat: Moneder corrupte</translation>
</message>
<message>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = manté les metadades de les tx, p. ex., propietari del compte i informació de sol·licitud del pagament, 2 = prescindeix de les metadades de les tx)</translation>
+ </message>
+ <message>
+ <source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Buida l'activitat de la base de dades de la memòria disponible al registre del disc cada &lt;n&gt; megabytes (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>Com d'exhaustiva és la verificació de blocs del -checkblocks (0-4, per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
+ <translation>Enregistreu la prioritat de la transacció i la comissió per kB en minar blocs (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
+ <translation>Manté un índex complet de transaccions, utilitzat per la crida rpc getrawtransaction (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
+ <translation>Nombre de segons necessaris perquè els iguals de comportament qüestionable puguin tornar a connectar-se (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
+ <translation>Informació de sortida de la depuració (per defecte: %u, proporcionar &lt;category&gt; és opcional)</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
+ <translation>Utilitza un proxy SOCKS4 apart per a arribar als iguals a través de serveis ocults de Tor (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>(default: %s)</source>
+ <translation>(per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Acceptable ciphers (default: %s)</source>
+ <translation>Xifrats acceptables (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Demana sempre les adreces dels iguals a través de consultes DNS (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Disable safemode, override a real safe mode event (default: %u)</source>
+ <translation>Inhabilita el mode segur, sobreescriu un esdeveniment de mode segur real (per defecte: %u) </translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>Error en carregar wallet.dat</translation>
</message>
<message>
+ <source>Force safe mode (default: %u)</source>
+ <translation>Força el mode segur (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Generate coins (default: %u)</source>
+ <translation>Genera monedes (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>How many blocks to check at startup (default: %u, 0 = all)</source>
+ <translation>Quants blocs per comprovar a l'inici (per defecte: %u, 0 = tots)</translation>
+ </message>
+ <message>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>Inclou l'adreça IP a la sortida de depuració (per defecte: %u)</translation>
+ </message>
+ <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Adreça -proxy invalida: '%s'</translation>
</message>
<message>
+ <source>Limit size of signature cache to &lt;n&gt; entries (default: %u)</source>
+ <translation>Limita la mida de la cau de signatura a &lt;n&gt; entrades (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Escolta les connexions JSON-RPC en &lt;port&gt; (per defecte: %u o testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Escolta les connexions en &lt;port&gt; (per defecte: %u o testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
+ <translation>Manté com a màxim &lt;n&gt; connexions a iguals (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Memòria intermèdia màxima de recepció per connexió, &lt;n&gt;*1000 bytes (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Memòria intermèdia màxima d'enviament per connexió, &lt;n&gt;*1000 bytes (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Only accept block chain matching built-in checkpoints (default: %u)</source>
+ <translation>Només accepta els punts de control integrats que coincideixen amb la cadena de blocs (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Prepend debug output with timestamp (default: %u)</source>
+ <translation>Posa davant de la sortida de depuració una marca horària (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>Retransmet i mina les transaccions de l'operador (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>Retransmet multisig no P2SH (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Run a thread to flush wallet periodically (default: %u)</source>
+ <translation>Executa un fil per buidar el moneder periòdicament (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Server certificate file (default: %s)</source>
+ <translation>Fitxer de certificat del servidor (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Server private key (default: %s)</source>
+ <translation>Clau privada del servidor (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Set key pool size to &lt;n&gt; (default: %u)</source>
+ <translation>Defineix la mida clau disponible a &lt;n&gt; (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Set minimum block size in bytes (default: %u)</source>
+ <translation>Defineix la mida de bloc mínima en bytes (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Set the number of threads to service RPC calls (default: %d)</source>
+ <translation>Defineix el nombre de fils a crides de servei RPC (per defecte: %d)</translation>
+ </message>
+ <message>
+ <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source>
+ <translation>Defineix el senyalador DB_PRIVATE en l'entorn db del moneder (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Specify configuration file (default: %s)</source>
+ <translation>Especifica el fitxer de configuració (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
+ <translation>Especifica el temps d'espera de la connexió en milisegons (mínim: 1, per defecte: %d)</translation>
+ </message>
+ <message>
+ <source>Specify pid file (default: %s)</source>
+ <translation>Especifica el fitxer pid (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Spend unconfirmed change when sending transactions (default: %u)</source>
+ <translation>Gasta el canvi no confirmat en enviar les transaccions (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Stop running after importing blocks from disk (default: %u)</source>
+ <translation>Atura l'execució després d'importar blocs del disc (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Threshold for disconnecting misbehaving peers (default: %u)</source>
+ <translation>Llindar per a desconnectar els iguals de comportament qüestionable (per defecte: %u)</translation>
+ </message>
+ <message>
<source>Unknown network specified in -onlynet: '%s'</source>
<translation>Xarxa desconeguda especificada a -onlynet: '%s'</translation>
</message>
@@ -3166,10 +3370,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Import no vàlid per a -paytxfee=&lt;amount&gt;: «%s»</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Import no vàlid</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Balanç insuficient</translation>
</message>
@@ -3202,10 +3402,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ha acabat la càrrega</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Utilitza l'opció %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Error</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ca@valencia.ts b/src/qt/locale/bitcoin_ca@valencia.ts
index d3bf33ebfb..c68cfb686a 100644
--- a/src/qt/locale/bitcoin_ca@valencia.ts
+++ b/src/qt/locale/bitcoin_ca@valencia.ts
@@ -1,11 +1,7 @@
-<TS language="ca@valencia" version="2.0">
+<TS language="ca@valencia" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Feu doble clic per editar l'adreça o l'etiqueta</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Crea una nova adreça</translation>
</message>
@@ -87,7 +83,7 @@
</message>
<message>
<source>Comma separated file (*.csv)</source>
- <translation>Fitxer de separació amb comes (*.csv)</translation>
+ <translation>Fitxer separat per comes (*.csv)</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -156,10 +152,6 @@
<translation>Canvia la contrasenya</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Introduïu tant la contrasenya antiga com la nova del moneder.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirma l'encriptació del moneder</translation>
</message>
@@ -188,10 +180,6 @@
<translation>Introduïu la contrasenya nova al moneder.&lt;br/&gt;Utilitzeu una contrasenya de &lt;b&gt;deu o més caràcters aleatoris&lt;/b&gt;, o &lt;b&gt;vuit o més paraules&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin es tancarà ara per acabar el procés d'encriptació. Recordeu que encriptar el moneder no protegeix completament els bitcoins de ser robats per programari maliciós instal·lat a l'ordinador.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>L'encriptació del moneder ha fallat</translation>
</message>
@@ -311,10 +299,6 @@
<translation>Envia monedes a una adreça Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modifica les opcions de configuració per bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Realitza una còpia de seguretat del moneder a una altra ubicació</translation>
</message>
@@ -452,7 +436,7 @@
</message>
<message>
<source>Information</source>
- <translation>Informació</translation>
+ <translation>&amp;Informació</translation>
</message>
<message>
<source>Up to date</source>
@@ -471,14 +455,6 @@
<translation>Transacció entrant</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Data: %1\nImport: %2\n Tipus: %3\n Adreça: %4\n</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>El moneder està &lt;b&gt;encriptat&lt;/b&gt; i actualment &lt;b&gt;desbloquejat&lt;/b&gt;</translation>
</message>
@@ -514,7 +490,7 @@ Address: %4
</message>
<message>
<source>Fee:</source>
- <translation>Quota:</translation>
+ <translation>Comissió:</translation>
</message>
<message>
<source>Dust:</source>
@@ -562,11 +538,11 @@ Address: %4
</message>
<message>
<source>Copy address</source>
- <translation>Copiar adreça </translation>
+ <translation>Copia l'adreça</translation>
</message>
<message>
<source>Copy label</source>
- <translation>Copiar etiqueta</translation>
+ <translation>Copia l'etiqueta</translation>
</message>
<message>
<source>Copy amount</source>
@@ -590,7 +566,7 @@ Address: %4
</message>
<message>
<source>Copy fee</source>
- <translation>Copia la comissió</translation>
+ <translation>Copia la comissi</translation>
</message>
<message>
<source>Copy after fee</source>
@@ -669,10 +645,6 @@ Address: %4
<translation>no</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Esta etiqueta es posa de color roig si la mida de la transacció és més gran de 1000 bytes.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Això comporta una comissi d'almenys %1 per kB.</translation>
</message>
@@ -685,14 +657,6 @@ Address: %4
<translation>Les transaccions amb una major prioritat són més propenses a ser incloses en un bloc.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Esta etiqueta es torna roja si la prioritat és menor que «mitjana».</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Esta etiqueta es torna roja si qualsevol destinatari rep un import inferior a %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(sense etiqueta)</translation>
</message>
@@ -813,30 +777,6 @@ Address: %4
<source>command-line options</source>
<translation>Opcions de la línia d'ordes</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Opcions d'IU</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Defineix un idioma, per exemple "de_DE" (per defecte: preferències locals de sistema)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Inicia minimitzat</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Defineix certificats arrel SSL per a la sol·licitud de pagament (per defecte: -sistema-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Mostra la finestra de benvinguda a l'inici (per defecte: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Tria el directori de dades a l'inici (per defecte: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -911,14 +851,6 @@ Address: %4
<translation>&amp;Principal</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Inicia automàticament el Bitcoin després de l'inici de sessió del sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Inicia el Bitcoin a l'inici de sessió del sistema.</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Mida de la memòria cau de la base de &amp;dades</translation>
</message>
@@ -1023,10 +955,6 @@ Address: %4
<translation>&amp;Minimitza a la barra d'aplicacions en comptes de la barra de tasques</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 Quit in the menu.</source>
- <translation>Minimitza en comptes d'eixir de la aplicació al tancar la finestra. Quan esta opció està activa, la aplicació només es tancarà al seleccionar Eixir al menú.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimitza en tancar</translation>
</message>
@@ -1039,10 +967,6 @@ Address: %4
<translation>&amp;Llengua de la interfície d'usuari:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Ací podeu definir la llengua de l'aplicació. Esta configuració tindrà efecte una vegada es reinicie Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unitats per mostrar els imports en:</translation>
</message>
@@ -1079,10 +1003,6 @@ Address: %4
<translation>Cal reiniciar el client per activar els canvis.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Es pararà el client, voleu procedir?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Amb este canvi cal un reinici del client.</translation>
</message>
@@ -1153,10 +1073,6 @@ Address: %4
<source>Current total balance in watch-only addresses</source>
<translation>Balanç total actual en adreces de només lectura</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>Fora de sincronia</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1177,10 +1093,6 @@ Address: %4
<translation>La xarxa de la sol·licitud de pagament no coincideix amb la xarxa del client.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>La sol·licitud de pagament ha caducat.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>La sol·licitud de pagament no està inicialitzada.</translation>
</message>
@@ -1248,10 +1160,6 @@ Address: %4
<translation>Agent d'usuari</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adreça / nom de l'ordinador</translation>
- </message>
- <message>
<source>Ping Time</source>
<translation>Temps de ping</translation>
</message>
@@ -1283,14 +1191,6 @@ Address: %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>XARXA</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>DESCONEGUT</translation>
- </message>
- <message>
<source>None</source>
<translation>Cap</translation>
</message>
@@ -1489,18 +1389,10 @@ Address: %4
<translation>Fitxer de registre de depuració</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Obri el fitxer de registre de depuració de Bitcoin del directori de dades actual. Això pot trigar uns quants segons per a fitxers de registre grans.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Neteja la consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Vos donem la benvinguda a la consola RPC de Bitcoin</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Utilitza les fletxes d'amunt i avall per navegar per l'historial, i &lt;b&gt;Ctrl-L&lt;\b&gt; per netejar la pantalla.</translation>
</message>
@@ -1668,7 +1560,7 @@ Address: %4
</message>
<message>
<source>Amount</source>
- <translation>Import</translation>
+ <translation>Quantitat</translation>
</message>
<message>
<source>Label</source>
@@ -1703,7 +1595,7 @@ Address: %4
</message>
<message>
<source>Amount</source>
- <translation>Import</translation>
+ <translation>Quantitat</translation>
</message>
<message>
<source>(no label)</source>
@@ -1786,7 +1678,7 @@ Address: %4
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation>Netejar tots els camps del formulari.</translation>
+ <translation>Esborra tots els camps del formuari.</translation>
</message>
<message>
<source>Dust:</source>
@@ -1853,10 +1745,6 @@ Address: %4
<translation>o</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>L'adreça de destinatari no és vàlida, per favor comprovi-la.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>L'import a pagar ha de ser major que 0.</translation>
</message>
@@ -1869,10 +1757,6 @@ Address: %4
<translation>El total excedeix el teu balanç quan s'afig la comisió a la transacció %1.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>S'ha trobat una adreça duplicada, tan sols es pot enviar a cada adreça un cop per orde d'enviament.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Ha fallat la creació de la transacció!</translation>
</message>
@@ -1956,10 +1840,6 @@ Address: %4
<translation>Missatge:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Esta és una sol·licitud de pagament verificada.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Introduïu una etiqueta per a esta adreça per afegir-la a la llista d'adreces utilitzades</translation>
</message>
@@ -1968,10 +1848,6 @@ Address: %4
<translation>Un missatge que s'ha adjuntat al bitcoin: URI que s'emmagatzemarà amb la transacció per a la vostra referència. Nota: el missatge no s'enviarà a través de la xarxa Bitcoin.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Esta és una sol·licitud de pagament no verificada.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Paga a:</translation>
</message>
@@ -2002,24 +1878,20 @@ Address: %4
<translation>&amp;Signa el missatge</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Podeu signar missatges amb la vostra adreça per provar que són vostres. Aneu amb compte no signar qualsevol cosa, ja que els atacs de pesca electrònica (phishing) poden provar de confondre-vos perquè els signeu amb la vostra identitat. Només signeu als documents completament detallats amb què hi esteu d'acord.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>L'adreça Bitcoin amb què signar el missatge</translation>
</message>
<message>
<source>Choose previously used address</source>
- <translation>Tria les adreces fetes servir amb anterioritat</translation>
+ <translation>Trieu una adreça feta servir anteriorment</translation>
</message>
<message>
<source>Alt+A</source>
- <translation>Alt+A</translation>
+ <translation>Alta+A</translation>
</message>
<message>
<source>Paste address from clipboard</source>
- <translation>Apega l'adreça del porta-retalls</translation>
+ <translation>Apegar adreça del porta-retalls</translation>
</message>
<message>
<source>Alt+P</source>
@@ -2058,10 +1930,6 @@ Address: %4
<translation>&amp;Verifica el missatge</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Introduïsca l'adreça signant, missatge (assegura't que copies salts de línia, espais, tabuladors, etc excactament tot el text) i la signatura a sota per verificar el missatge. Per evitar ser enganyat per un atac home-entre-mig, vés amb compte de no llegir més en la signatura del que hi ha al missatge signat mateix.</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>L'adreça Bitcoin amb què va ser signat el missatge</translation>
</message>
@@ -2134,7 +2002,7 @@ Address: %4
<name>SplashScreen</name>
<message>
<source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
+ <translation>Nucli de Bitcoin</translation>
</message>
<message>
<source>The Bitcoin Core developers</source>
@@ -2313,10 +2181,6 @@ Address: %4
<translation>Tipus</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Immadur (%1 confirmacions, serà disponible després de %2)</translation>
</message>
@@ -2341,6 +2205,10 @@ Address: %4
<translation>Fora de línia</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Sense confirmar</translation>
</message>
@@ -2393,10 +2261,6 @@ Address: %4
<translation>Tipus de transacció.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Adreça del destinatari de la transacció.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Import extret o afegit del balanç.</translation>
</message>
@@ -2465,7 +2329,7 @@ Address: %4
</message>
<message>
<source>Copy label</source>
- <translation>Copiar etiqueta</translation>
+ <translation>Copia l'etiqueta</translation>
</message>
<message>
<source>Copy amount</source>
@@ -2631,29 +2495,6 @@ Address: %4
<translation>Accepta connexions de fora (per defecte: 1 si no -proxy o -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, heu d'establir una contrasenya RPC al fitxer de configuració: %s
-Es recomana que useu la següent contrasenya aleatòria:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(no necesiteu recordar esta contrasenya)
-El nom d'usuari i la contrasenya NO HAN de ser els mateixos.
-Si el fitxer no existeix, crea'l amb els permisos de fitxer de només lectura per al propietari.
-També es recomana establir la notificació d'alertes i així sereu notificat de les incidències;
-per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Vincula a una adreça específica i sempre escolta-hi. Utilitza la notació [host]:port per IPv6</translation>
</message>
@@ -2666,14 +2507,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Entra en el mode de proves de regressió, que utilitza una cadena especial en què els blocs poden resoldre's al moment.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Error: La transacció ha estat rebutjada. Això pot passar si alguna de les monedes del teu moneder ja s'han gastat, com si haguesis usat una copia de l'arxiu wallet.dat i s'hagueren gastat monedes de la copia però sense marcar com gastades en este.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Error: Esta transacció requereix una comissió d'almenys %s degut al seu import, complexitat o per l'ús de fons recentment rebuts!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Executa una orde quan una transacció del moneder canvie (%s en cmd es canvia per TxID)</translation>
</message>
@@ -2746,10 +2579,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opcions de depuració/proves:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Descobreix la pròpia adreça IP (per defecte: 1 quan escoltant i no -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>No carreguis el moneder i inhabilita les crides RPC del moneder</translation>
</message>
@@ -2778,10 +2607,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Error: Espai al disc baix!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Error: El moneder està bloquejat, no és possible crear la transacció!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Ha fallat escoltar a qualsevol port. Feu servir -listen=0 si voleu fer això.</translation>
</message>
@@ -2806,10 +2631,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>No hi ha suficient descriptors de fitxers disponibles.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Reconstrueix l'índex de la cadena de blocs dels fitxers actuals blk000??.dat</translation>
- </message>
- <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>Defineix la mida de la memòria cau de la base de dades en megabytes (%d a %d, per defecte: %d)</translation>
</message>
@@ -2914,6 +2735,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>No es pot resoldre l'adreça -whitebind: «%s»</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Tria el directori de dades a l'inici (per defecte: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Connecta a través del proxy SOCKS5</translation>
</message>
@@ -2962,10 +2787,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>S'ha especificat una màscara de xarxa no vàlida a -whitelist: «%s»</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Manté com a màxim &lt;n&gt; blocs no connectables en memòria (per defecte: %u)</translation>
- </message>
- <message>
<source>Need to specify a port with -whitebind: '%s'</source>
<translation>Cal especificar un port amb -whitebind: «%s»</translation>
</message>
@@ -2974,10 +2795,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opcions de transmissió del node:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Imprimeix el block a l'inici, si es troba l'índex de blocs</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Opcions RPC SSL: (veieu el wiki del Bitcoin per a instruccions de configuració de l'SSL)</translation>
</message>
@@ -2998,10 +2815,22 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Defineix certificats arrel SSL per a la sol·licitud de pagament (per defecte: -sistema-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Defineix un idioma, per exemple "de_DE" (per defecte: preferències locals de sistema)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Mostra la finestra de benvinguda a l'inici (per defecte: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Redueix el fitxer debug.log durant l'inici del client (per defecte: 1 quan no -debug)</translation>
</message>
@@ -3010,6 +2839,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ha fallat la signatura de la transacció</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Inicia minimitzat</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Això és programari experimental.</translation>
</message>
@@ -3046,10 +2879,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Avís</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Avís: esta versió està obsoleta. És necessari actualitzar-la!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Avís: s'ha ignorat l'argument no acceptat de -benchmark. Feu servir -debug=bench.</translation>
</message>
@@ -3130,10 +2959,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Import no vàlid per a -paytxfee=&lt;amount&gt;: «%s»</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Import no vàlid</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Balanç insuficient</translation>
</message>
@@ -3166,10 +2991,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ha acabat la càrrega</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Utilitza l'opció %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Error</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ca_ES.ts b/src/qt/locale/bitcoin_ca_ES.ts
index 60c6fa30f4..cd6aa96d34 100644
--- a/src/qt/locale/bitcoin_ca_ES.ts
+++ b/src/qt/locale/bitcoin_ca_ES.ts
@@ -1,9 +1,9 @@
-<TS language="ca_ES" version="2.0">
+<TS language="ca_ES" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Feu doble clic per editar l'adreça o l'etiqueta</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Feu clic dret per a editar l'adreça o l'etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>Canvia la contrasenya</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Introduïu tant la contrasenya antiga com la nova del moneder.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirma l'encriptació del moneder</translation>
</message>
@@ -188,10 +184,6 @@
<translation>Introduïu la contrasenya nova al moneder.&lt;br/&gt;Utilitzeu una contrasenya de &lt;b&gt;deu o més caràcters aleatoris&lt;/b&gt;, o &lt;b&gt;vuit o més paraules&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin es tancarà ara per acabar el procés d'encriptació. Recordeu que encriptar el moneder no protegeix completament els bitcoins de ser robats per programari maliciós instal·lat a l'ordinador.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>L'encriptació del moneder ha fallat</translation>
</message>
@@ -311,10 +303,6 @@
<translation>Envia monedes a una adreça Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modifica les opcions de configuració per bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Realitza una còpia de seguretat del moneder a una altra ubicació</translation>
</message>
@@ -491,14 +479,6 @@
<translation>Transacció entrant</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Data: %1\nImport: %2\n Tipus: %3\n Adreça: %4\n</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>El moneder està &lt;b&gt;encriptat&lt;/b&gt; i actualment &lt;b&gt;desbloquejat&lt;/b&gt;</translation>
</message>
@@ -517,6 +497,10 @@ Address: %4
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Selecció de moneda</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Quantitat:</translation>
</message>
@@ -534,7 +518,7 @@ Address: %4
</message>
<message>
<source>Fee:</source>
- <translation>Quota:</translation>
+ <translation>Comissió</translation>
</message>
<message>
<source>Dust:</source>
@@ -542,7 +526,7 @@ Address: %4
</message>
<message>
<source>After Fee:</source>
- <translation>Quota posterior:</translation>
+ <translation>Comissió posterior:</translation>
</message>
<message>
<source>Change:</source>
@@ -562,7 +546,15 @@ Address: %4
</message>
<message>
<source>Amount</source>
- <translation>Quantitat</translation>
+ <translation>Import</translation>
+ </message>
+ <message>
+ <source>Received with label</source>
+ <translation>Rebut amb l'etiqueta</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Rebut amb l'adreça</translation>
</message>
<message>
<source>Date</source>
@@ -689,12 +681,8 @@ Address: %4
<translation>no</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Aquesta etiqueta es posa de color vermell si la mida de la transacció és més gran de 1000 bytes.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
- <translation>Això comporta una comissi d'almenys %1 per kB.</translation>
+ <translation>Això comporta una comissió d'almenys %1 per kB.</translation>
</message>
<message>
<source>Can vary +/- 1 byte per input.</source>
@@ -705,14 +693,6 @@ Address: %4
<translation>Les transaccions amb una major prioritat són més propenses a ser incloses en un bloc.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Aquesta etiqueta es torna vermella si la prioritat és menor que «mitjana».</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Aquesta etiqueta es torna vermella si qualsevol destinatari rep un import inferior a %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(sense etiqueta)</translation>
</message>
@@ -729,7 +709,7 @@ Address: %4
<name>EditAddressDialog</name>
<message>
<source>Edit Address</source>
- <translation>Editar Adreça</translation>
+ <translation>Edita l'adreça</translation>
</message>
<message>
<source>&amp;Label</source>
@@ -833,30 +813,6 @@ Address: %4
<source>command-line options</source>
<translation>Opcions de la línia d'ordres</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Opcions de IU</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Defineix un idioma, per exemple "de_DE" (per defecte: preferències locals de sistema)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Inicia minimitzat</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Defineix certificats arrel SSL per a la sol·licitud de pagament (per defecte: -sistema-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Mostra la finestra de benvinguda a l'inici (per defecte: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Tria el directori de dades a l'inici (per defecte: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -896,7 +852,15 @@ Address: %4
<source>Error</source>
<translation>Error</translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>%n GB d'espai lliure disponible</numerusform><numerusform>%n GB d'espai lliure disponible</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(de %n GB necessari)</numerusform><numerusform>(de %n GB necessaris)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -931,14 +895,6 @@ Address: %4
<translation>&amp;Principal</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Inicia automàticament el Bitcoin després de l'inici de sessió del sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Inicia el Bitcoin a l'inici de sessió del sistema.</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Mida de la memòria cau de la base de &amp;dades</translation>
</message>
@@ -1019,6 +975,14 @@ Address: %4
<translation>Port obert amb &amp;UPnP</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Connecta a la xarxa Bitcoin a través d'un proxy SOCKS5.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>&amp;Connecta a través d'un proxy SOCKS5 (proxy per defecte):</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>&amp;IP del proxy:</translation>
</message>
@@ -1043,10 +1007,6 @@ Address: %4
<translation>&amp;Minimitza a la barra d'aplicacions en comptes de la barra de tasques</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 Quit in the menu.</source>
- <translation>Minimitza en comptes de sortir de la aplicació al tancar la finestra. Quan aquesta opció està activa, la aplicació només es tancarà al seleccionar Sortir al menú.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimitza en tancar</translation>
</message>
@@ -1059,10 +1019,6 @@ Address: %4
<translation>&amp;Llengua de la interfície d'usuari:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Aquí podeu definir la llengua de l'aplicació. Aquesta configuració tindrà efecte una vegada es reiniciï Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unitats per mostrar els imports en:</translation>
</message>
@@ -1099,10 +1055,6 @@ Address: %4
<translation>Cal reiniciar el client per activar els canvis.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>S'aturarà el client, voleu procedir?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Amb aquest canvi cal un reinici del client.</translation>
</message>
@@ -1150,6 +1102,10 @@ Address: %4
<translation>Balanç minat que encara no ha madurat</translation>
</message>
<message>
+ <source>Balances</source>
+ <translation>Balances</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation>Total:</translation>
</message>
@@ -1162,6 +1118,14 @@ Address: %4
<translation>El vostre balanç actual en adreces de només lectura</translation>
</message>
<message>
+ <source>Spendable:</source>
+ <translation>Que es pot gastar:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation>Transaccions recents</translation>
+ </message>
+ <message>
<source>Unconfirmed transactions to watch-only addresses</source>
<translation>Transaccions sense confirmar a adreces de només lectura</translation>
</message>
@@ -1173,10 +1137,6 @@ Address: %4
<source>Current total balance in watch-only addresses</source>
<translation>Balanç total actual en adreces de només lectura</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>Fora de sincronia</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1197,10 +1157,6 @@ Address: %4
<translation>La xarxa de la sol·licitud de pagament no coincideix amb la xarxa del client.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>La sol·licitud de pagament ha caducat.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>La sol·licitud de pagament no està inicialitzada.</translation>
</message>
@@ -1241,6 +1197,14 @@ Address: %4
<translation>Reemborsament de %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>La sol·licitud de pagament %1 és massa gran (%2 bytes, permès %3 bytes).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Protecció de DoS per a la sol·licitud de pagament</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Error en comunicar amb %1: %2</translation>
</message>
@@ -1268,10 +1232,6 @@ Address: %4
<translation>Agent d'usuari</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adreça / nom de l'ordinador</translation>
- </message>
- <message>
<source>Ping Time</source>
<translation>Temps de ping</translation>
</message>
@@ -1280,7 +1240,7 @@ Address: %4
<name>QObject</name>
<message>
<source>Amount</source>
- <translation>Quantitat</translation>
+ <translation>Import</translation>
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
@@ -1303,14 +1263,6 @@ Address: %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>XARXA</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>DESCONEGUT</translation>
- </message>
- <message>
<source>None</source>
<translation>Cap</translation>
</message>
@@ -1509,18 +1461,10 @@ Address: %4
<translation>Fitxer de registre de depuració</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Obre el fitxer de registre de depuració de Bitcoin del directori de dades actual. Això pot trigar uns quants segons per a fitxers de registre grans.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Neteja la consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Us donem la benvinguda a la consola RPC de Bitcoin</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Utilitza les fletxes d'amunt i avall per navegar per l'historial, i &lt;b&gt;Ctrl-L&lt;\b&gt; per netejar la pantalla.</translation>
</message>
@@ -1782,7 +1726,7 @@ Address: %4
</message>
<message>
<source>After Fee:</source>
- <translation>Quota posterior:</translation>
+ <translation>Comissió posterior:</translation>
</message>
<message>
<source>Change:</source>
@@ -1797,6 +1741,70 @@ Address: %4
<translation>Personalitza l'adreça de canvi</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Comissió de transacció</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>Tria...</translation>
+ </message>
+ <message>
+ <source>collapse fee-settings</source>
+ <translation>redueix els paràmetres de comissió</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>per kilobyte</translation>
+ </message>
+ <message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>Si la comissió personalitzada es defineix a 1000 satoshis i la transacció és de només 250 bytes, llavors «per kilobyte» només es paguen 250 satoshis en una comissió, mentre que amb la de «total com a mínim» es pagarien 1000 satoshis. Per a transaccions superiors al kilobyte, en tots dos casos es paga per kilobyte.</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>total com a mínim</translation>
+ </message>
+ <message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>No hi ha cap problema en pagar només la comissió mínima sempre que hi hagi menys volum de transacció que espai en els blocs. Però tingueu present que això pot acabar en una transacció que mai es confirmi una vegada hi hagi més demanda de transaccions de bitcoins que la xarxa pugui processar.</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(llegiu l'indicador de funció)</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Recomanada:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>Personalitzada:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(No s'ha inicialitzat encara la comissió intel·ligent. Normalment pren uns pocs blocs...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Temps de confirmació:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>normal</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>ràpid</translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Envia com a transacció de comissió zero si és possible</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(la confirmació pot trigar més temps)</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Envia a múltiples destinataris al mateix temps</translation>
</message>
@@ -1846,7 +1854,7 @@ Address: %4
</message>
<message>
<source>Copy fee</source>
- <translation>Copia la comissi</translation>
+ <translation>Copia la comissió</translation>
</message>
<message>
<source>Copy after fee</source>
@@ -1873,10 +1881,6 @@ Address: %4
<translation>o</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>L'adreça de destinatari no és vàlida, si us plau comprovi-la.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>L'import a pagar ha de ser major que 0.</translation>
</message>
@@ -1886,11 +1890,7 @@ Address: %4
</message>
<message>
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>El total excedeix el teu balanç quan s'afegeix la comisió a la transacció %1.</translation>
- </message>
- <message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>S'ha trobat una adreça duplicada, tan sols es pot enviar a cada adreça un cop per ordre de enviament.</translation>
+ <translation>El total excedeix el teu balanç quan s'afegeix la comissió a la transacció %1.</translation>
</message>
<message>
<source>Transaction creation failed!</source>
@@ -1901,6 +1901,10 @@ Address: %4
<translation>S'ha rebutjat la transacció! Això pot passar si alguna de les monedes del vostre moneder ja s'han gastat; per exemple, si heu fet servir una còpia de seguretat del fitxer wallet.dat i s'haguessin gastat monedes de la còpia però sense marcar-les-hi com a gastades.</translation>
</message>
<message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Paga només la comissió mínima de %1</translation>
+ </message>
+ <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Avís: adreça Bitcoin no vàlida</translation>
</message>
@@ -1976,10 +1980,6 @@ Address: %4
<translation>Missatge:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Aquesta és una sol·licitud de pagament verificada.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Introduïu una etiqueta per a aquesta adreça per afegir-la a la llista d'adreces utilitzades</translation>
</message>
@@ -1988,10 +1988,6 @@ Address: %4
<translation>Un missatge que s'ha adjuntat al bitcoin: URI que s'emmagatzemarà amb la transacció per a la vostra referència. Nota: el missatge no s'enviarà a través de la xarxa Bitcoin.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Aquesta és una sol·licitud de pagament no verificada.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Paga a:</translation>
</message>
@@ -2022,10 +2018,6 @@ Address: %4
<translation>&amp;Signa el missatge</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Podeu signar missatges amb la vostra adreça per provar que són vostres. Aneu amb compte no signar qualsevol cosa, ja que els atacs de pesca electrònica (phishing) poden provar de confondre-us perquè els signeu amb la vostra identitat. Només signeu als documents completament detallats amb què hi esteu d'acord.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>L'adreça Bitcoin amb què signar el missatge</translation>
</message>
@@ -2078,10 +2070,6 @@ Address: %4
<translation>&amp;Verifica el missatge</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Introdueixi l'adreça signant, missatge (assegura't que copies salts de línia, espais, tabuladors, etc excactament tot el text) i la signatura a sota per verificar el missatge. Per evitar ser enganyat per un atac home-entre-mig, vés amb compte de no llegir més en la signatura del que hi ha al missatge signat mateix.</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>L'adreça Bitcoin amb què va ser signat el missatge</translation>
</message>
@@ -2300,7 +2288,7 @@ Address: %4
</message>
<message>
<source>Amount</source>
- <translation>Quantitat</translation>
+ <translation>Import</translation>
</message>
<message>
<source>true</source>
@@ -2345,10 +2333,6 @@ Address: %4
<translation>Tipus</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adreça</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Immadur (%1 confirmacions, serà disponible després de %2)</translation>
</message>
@@ -2377,6 +2361,10 @@ Address: %4
<translation>Fora de línia</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Sense confirmar</translation>
</message>
@@ -2429,8 +2417,8 @@ Address: %4
<translation>Tipus de transacció.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Adreça del destinatari de la transacció.</translation>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation>Si està implicada o no una adreça només de lectura en la transacció.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2524,6 +2512,10 @@ Address: %4
<translation>Exporta l'historial de transacció</translation>
</message>
<message>
+ <source>Watch-only</source>
+ <translation>Només de lectura</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation>L'exportació ha fallat</translation>
</message>
@@ -2667,29 +2659,6 @@ Address: %4
<translation>Accepta connexions de fora (per defecte: 1 si no -proxy o -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, heu de establir una contrasenya RPC al fitxer de configuració: %s
-Es recomana que useu la següent contrasenya aleatòria:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(no necesiteu recordar aquesta contrasenya)
-El nom d'usuari i la contrasenya NO HAN de ser els mateixos.
-Si el fitxer no existeix, crea'l amb els permisos de fitxer de només lectura per al propietari.
-També es recomana establir la notificació d'alertes i així sereu notificat de les incidències;
-per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Vincula a una adreça específica i sempre escolta-hi. Utilitza la notació [host]:port per IPv6</translation>
</message>
@@ -2698,16 +2667,12 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Elimina totes les transaccions del moneder i només recupera aquelles de la cadena de blocs a través de -rescan a l'inici</translation>
</message>
<message>
- <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
- <translation>Entra en el mode de proves de regressió, que utilitza una cadena especial en què els blocs poden resoldre's al moment.</translation>
- </message>
- <message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Error: La transacció ha estat rebutjada. Això pot passar si alguna de les monedes del teu moneder ja s'han gastat, com si haguesis usat una copia de l'arxiu wallet.dat i s'haguessin gastat monedes de la copia però sense marcar com gastades en aquest.</translation>
+ <source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
+ <translation>Distribuït sota llicència de programari MIT. Vegeu el fitxer acompanyant COPYING o &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Error: Aquesta transacció requereix una comissió d'almenys %s degut al seu import, complexitat o per l'ús de fons recentment rebuts!</translation>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>Entra en el mode de proves de regressió, que utilitza una cadena especial en què els blocs poden resoldre's al moment.</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
@@ -2750,6 +2715,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Avís: el fitxer wallet.dat és corrupte, dades rescatades! L'arxiu wallet.dat original ha estat desat com wallet.{estampa_temporal}.bak al directori %s; si el teu balanç o transaccions son incorrectes hauries de restaurar-lo de un backup.</translation>
</message>
<message>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Afegeix a la llista blanca els iguals que es connecten de la màscara de xarxa o adreça IP donada. Es pot especificar moltes vegades.</translation>
+ </message>
+ <message>
<source>(default: 1)</source>
<translation>(per defecte: 1)</translation>
</message>
@@ -2782,10 +2751,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opcions de depuració/proves:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Descobreix la pròpia adreça IP (per defecte: 1 quan escoltant i no -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>No carreguis el moneder i inhabilita les crides RPC del moneder</translation>
</message>
@@ -2810,12 +2775,12 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Error en obrir la base de dades de blocs</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>Error: Espai al disc baix!</translation>
+ <source>Error: A fatal internal error occured, see debug.log for details</source>
+ <translation>Error: s'ha produït un error intern fatal. Consulteu debug.log per a més detalls</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Error: El moneder està bloquejat, no és possible crear la transacció!</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>Error: Espai al disc baix!</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
@@ -2842,8 +2807,8 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>No hi ha suficient descriptors de fitxers disponibles.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Reconstrueix l'índex de la cadena de blocs dels fitxers actuals blk000??.dat</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Només connecta als nodes de la xarxa &lt;net&gt; (ipv4, ipv6 o onion)</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -2862,6 +2827,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Això es així per a eines de proves de regressió per al desenvolupament d'aplicacions.</translation>
</message>
<message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Utilitza UPnP per a mapejar el port d'escolta (per defecte: %u)</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>S'estan verificant els blocs...</translation>
</message>
@@ -2926,6 +2895,18 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Comissions (en BTC/Kb) inferiors a això es consideren de comissió zero per a la creació de la transacció (per defecte: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Si no s'especifica una paytxfee (comissió de transacció de pagament), inclogueu suficient comissió per tal que les transaccions comencin a confirmar-se en una mitja de n blocs (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Import no vàlid per a -maxtxfee=&lt;amount&gt;: '%s' (cal que sigui com a mínim la comissió de minrelay de %s per evitar que les comissions s'encallin)</translation>
+ </message>
+ <message>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>Mida màxima de les dades en les transaccions de l'operador en què confiem i en les meves (per defecte: %u)</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Consulta a adreces d'iguals a través de DNS, si es troba baix en adreces (per defecte: 1 a menys que -connect)</translation>
</message>
@@ -2934,10 +2915,41 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Defineix la mida màxima de transaccions d'alta prioritat / baixa comissió en bytes (per defecte: %d)</translation>
</message>
<message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>Defineix el nombre de fils per a la generació de moneda si està habilitat (-1 = tots els nuclis, per defecte: %d)</translation>
+ </message>
+ <message>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation>Aquest producte inclou programari desenvolupat pel projecte OpenSSL per a ús a l'OpenSSL Toolkit &lt;https://www.openssl.org/&gt; i programari criptogràfic escrit per Eric Young i programari UPnP escrit per Thomas Bernard.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>Per utilitzar bitcoind, o l'opció de serviddor de bitcoin-qt, heu de definir una rpcpassword en el fitxer de configuració:
+%s
+Es recomana que utilitzeu la contrasenya aleatòria següent:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(no cal que recordeu la contrasenya)
+El nom d'usuari i la contrasenya NO han de ser els mateixos.
+Si el fitxer no existeix, creeu-ne un amb permisos de lectura només per al seu propietari.
+Es recomana definir alertnotify per tal de ser notificat de qualsevol problema;
+per exemple: alertnotify=echo %%s | mail -s "Avís de Bitcoin" admin@foo.com</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Avís: s'ha especificat un -maxtxfee molt alt! Comissions tan grans podrien pagar-se en una única transacció.</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Avís: comproveu que la data i hora del vostre ordinador siguin correctes! Si el vostre rellotge no és correcte, el Bitcoin Core no funcionarà correctament.</translation>
</message>
@@ -2946,10 +2958,18 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Els iguals en la llista blanca no poden ser bandejats per DoS i es transmetran sempre llurs transaccions, fins i tot si ja són a la mempool. Això és útil, p. ex., per a una passarel·la</translation>
</message>
<message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Accepta sol·licituds REST públiques (per defecte: %u)</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>No es pot resoldre l'adreça -whitebind: «%s»</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Tria el directori de dades a l'inici (per defecte: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Connecta a través del proxy SOCKS5</translation>
</message>
@@ -2966,6 +2986,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Error en carregar wallet.dat: el moneder requereix una versió més nova del Bitcoin core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Error en llegir la base de dades, tancant.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Error: s'ha trobat un argument -tor no acceptat. Feu servir -onion.</translation>
</message>
@@ -2982,6 +3006,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ha fallat la inicialització de la comprovació de validesa. El Bitcoin Core s'està aturant.</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Import no vàlid per a -maxtxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Import no vàlid per a -minrelaytxfee=&lt;amount&gt;: «%s»</translation>
</message>
@@ -2998,8 +3026,8 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>S'ha especificat una màscara de xarxa no vàlida a -whitelist: «%s»</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Manté com a màxim &lt;n&gt; blocs no connectables en memòria (per defecte: %u)</translation>
+ <source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
+ <translation>Manté com a màxim &lt;n&gt; transaccions no connectables en memòria (per defecte: %u)</translation>
</message>
<message>
<source>Need to specify a port with -whitebind: '%s'</source>
@@ -3010,10 +3038,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opcions de transmissió del node:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Imprimeix el block a l'inici, si es troba l'índex de blocs</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Opcions RPC SSL: (veieu el wiki del Bitcoin per a instruccions de configuració de l'SSL)</translation>
</message>
@@ -3022,6 +3046,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opcions del servidor RPC:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>Suport RPC per a connexions HTTP persistents (per defecte: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Descarta a l'atzar 1 de cada &lt;n&gt; missatges de la xarxa</translation>
</message>
@@ -3034,10 +3062,26 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Envia informació de traça/depuració a la consola en comptes del fitxer debug.log</translation>
</message>
<message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>Envia les transaccions com a transaccions de comissió zero sempre que sigui possible (per defecte: %u) </translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Defineix certificats arrel SSL per a la sol·licitud de pagament (per defecte: -sistema-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Defineix un idioma, per exemple «de_DE» (per defecte: preferències locals de sistema)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Mostra totes les opcions de depuració (ús: --help --help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Mostra la finestra de benvinguda a l'inici (per defecte: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Redueix el fitxer debug.log durant l'inici del client (per defecte: 1 quan no -debug)</translation>
</message>
@@ -3046,6 +3090,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ha fallat la signatura de la transacció</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Inicia minimitzat</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Això és programari experimental.</translation>
</message>
@@ -3058,6 +3106,10 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Els imports de les transaccions han de ser positius</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transacció massa gran per a la política de comissions</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>La transacció és massa gran</translation>
</message>
@@ -3082,10 +3134,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Avís</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Avís: aquesta versió està obsoleta. És necessari actualitzar-la!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Avís: s'ha ignorat l'argument no acceptat de -benchmark. Feu servir -debug=bench.</translation>
</message>
@@ -3142,14 +3190,170 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Error en carregar wallet.dat: Moneder corrupte</translation>
</message>
<message>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = manté les metadades de les tx, p. ex., propietari del compte i informació de sol·licitud del pagament, 2 = prescindeix de les metadades de les tx)</translation>
+ </message>
+ <message>
+ <source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Buida l'activitat de la base de dades de la memòria disponible al registre del disc cada &lt;n&gt; megabytes (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>Com d'exhaustiva és la verificació de blocs del -checkblocks (0-4, per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
+ <translation>Enregistreu la prioritat de la transacció i la comissió per kB en minar blocs (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
+ <translation>Manté un índex complet de transaccions, utilitzat per la crida rpc getrawtransaction (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
+ <translation>Nombre de segons necessaris perquè els iguals de comportament qüestionable puguin tornar a connectar-se (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
+ <translation>Informació de sortida de la depuració (per defecte: %u, proporcionar &lt;category&gt; és opcional)</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
+ <translation>Utilitza un proxy SOCKS4 apart per a arribar als iguals a través de serveis ocults de Tor (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>(default: %s)</source>
+ <translation>(per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Acceptable ciphers (default: %s)</source>
+ <translation>Xifrats acceptables (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Demana sempre les adreces dels iguals a través de consultes DNS (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Disable safemode, override a real safe mode event (default: %u)</source>
+ <translation>Inhabilita el mode segur, sobreescriu un esdeveniment de mode segur real (per defecte: %u) </translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>Error en carregar wallet.dat</translation>
</message>
<message>
+ <source>Force safe mode (default: %u)</source>
+ <translation>Força el mode segur (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Generate coins (default: %u)</source>
+ <translation>Genera monedes (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>How many blocks to check at startup (default: %u, 0 = all)</source>
+ <translation>Quants blocs per comprovar a l'inici (per defecte: %u, 0 = tots)</translation>
+ </message>
+ <message>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>Inclou l'adreça IP a la sortida de depuració (per defecte: %u)</translation>
+ </message>
+ <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Adreça -proxy invalida: '%s'</translation>
</message>
<message>
+ <source>Limit size of signature cache to &lt;n&gt; entries (default: %u)</source>
+ <translation>Limita la mida de la cau de signatura a &lt;n&gt; entrades (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Escolta les connexions JSON-RPC en &lt;port&gt; (per defecte: %u o testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Escolta les connexions en &lt;port&gt; (per defecte: %u o testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
+ <translation>Manté com a màxim &lt;n&gt; connexions a iguals (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Memòria intermèdia màxima de recepció per connexió, &lt;n&gt;*1000 bytes (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Memòria intermèdia màxima d'enviament per connexió, &lt;n&gt;*1000 bytes (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Only accept block chain matching built-in checkpoints (default: %u)</source>
+ <translation>Només accepta els punts de control integrats que coincideixen amb la cadena de blocs (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Prepend debug output with timestamp (default: %u)</source>
+ <translation>Posa davant de la sortida de depuració una marca horària (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>Retransmet i mina les transaccions de l'operador (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>Retransmet multisig no P2SH (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Run a thread to flush wallet periodically (default: %u)</source>
+ <translation>Executa un fil per buidar el moneder periòdicament (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Server certificate file (default: %s)</source>
+ <translation>Fitxer de certificat del servidor (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Server private key (default: %s)</source>
+ <translation>Clau privada del servidor (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Set key pool size to &lt;n&gt; (default: %u)</source>
+ <translation>Defineix la mida clau disponible a &lt;n&gt; (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Set minimum block size in bytes (default: %u)</source>
+ <translation>Defineix la mida de bloc mínima en bytes (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Set the number of threads to service RPC calls (default: %d)</source>
+ <translation>Defineix el nombre de fils a crides de servei RPC (per defecte: %d)</translation>
+ </message>
+ <message>
+ <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source>
+ <translation>Defineix el senyalador DB_PRIVATE en l'entorn db del moneder (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Specify configuration file (default: %s)</source>
+ <translation>Especifica el fitxer de configuració (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
+ <translation>Especifica el temps d'espera de la connexió en milisegons (mínim: 1, per defecte: %d)</translation>
+ </message>
+ <message>
+ <source>Specify pid file (default: %s)</source>
+ <translation>Especifica el fitxer pid (per defecte: %s)</translation>
+ </message>
+ <message>
+ <source>Spend unconfirmed change when sending transactions (default: %u)</source>
+ <translation>Gasta el canvi no confirmat en enviar les transaccions (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Stop running after importing blocks from disk (default: %u)</source>
+ <translation>Atura l'execució després d'importar blocs del disc (per defecte: %u)</translation>
+ </message>
+ <message>
+ <source>Threshold for disconnecting misbehaving peers (default: %u)</source>
+ <translation>Llindar per a desconnectar els iguals de comportament qüestionable (per defecte: %u)</translation>
+ </message>
+ <message>
<source>Unknown network specified in -onlynet: '%s'</source>
<translation>Xarxa desconeguda especificada a -onlynet: '%s'</translation>
</message>
@@ -3166,10 +3370,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Import no vàlid per a -paytxfee=&lt;amount&gt;: «%s»</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Import no vàlid</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Balanç insuficient</translation>
</message>
@@ -3202,10 +3402,6 @@ per exemple: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ha acabat la càrrega</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Utilitza l'opció %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Error</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cmn.ts b/src/qt/locale/bitcoin_cmn.ts
index 09ff0acf02..3286f12698 100644
--- a/src/qt/locale/bitcoin_cmn.ts
+++ b/src/qt/locale/bitcoin_cmn.ts
@@ -1,4 +1,4 @@
-<TS language="cmn" version="2.0">
+<TS language="cmn" version="2.1">
<context>
<name>AddressBookPage</name>
</context>
diff --git a/src/qt/locale/bitcoin_cs.ts b/src/qt/locale/bitcoin_cs.ts
index bc2a2ef7b5..47464b7a53 100644
--- a/src/qt/locale/bitcoin_cs.ts
+++ b/src/qt/locale/bitcoin_cs.ts
@@ -1,9 +1,9 @@
-<TS language="cs" version="2.0">
+<TS language="cs" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dvojklikem myši začneš upravovat označení adresy</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Pravým tlačítkem myši začneš upravovat označení adresy</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>Změň heslo</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Zadej staré a nové heslo k peněžence.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Potvrď zašifrování peněženky</translation>
</message>
@@ -188,10 +184,6 @@
<translation>Zadej nové heslo k peněžence.&lt;br/&gt;Použij &lt;b&gt;alespoň deset náhodných znaků&lt;/b&gt; nebo &lt;b&gt;alespoň osm slov&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin se teď ukončí, aby dokončil zašifrování. Pamatuj však, že pouhé zašifrování peněženky úplně nezabraňuje krádeži tvých bitcoinů malwarem, kterým se může počítač nakazit.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Zašifrování peněženky selhalo</translation>
</message>
@@ -311,10 +303,6 @@
<translation>Pošli mince na Bitcoinovou adresu</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Uprav nastavení Bitcoinu</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Zazálohuj peněženku na jiné místo</translation>
</message>
@@ -430,10 +418,26 @@
<source>No block source available...</source>
<translation>Není dostupný žádný zdroj bloků...</translation>
</message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation><numerusform>%n hodinu</numerusform><numerusform>%n hodiny</numerusform><numerusform>%n hodin</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation><numerusform>%n den</numerusform><numerusform>%n dny</numerusform><numerusform>%n dnů</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation><numerusform>%n týden</numerusform><numerusform>%n týdny</numerusform><numerusform>%n týdnů</numerusform></translation>
+ </message>
<message>
<source>%1 and %2</source>
<translation>%1 a %2</translation>
</message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation><numerusform>%n rok</numerusform><numerusform>%n roky</numerusform><numerusform>%n roků</numerusform></translation>
+ </message>
<message>
<source>%1 behind</source>
<translation>Stahuji ještě bloky transakcí za poslední %1</translation>
@@ -475,18 +479,6 @@
<translation>Příchozí transakce</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Datum: %1
-Částka: %2
-Typ: %3
-Adresa: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Peněženka je &lt;b&gt;zašifrovaná&lt;/b&gt; a momentálně &lt;b&gt;odemčená&lt;/b&gt;</translation>
</message>
@@ -505,6 +497,10 @@ Adresa: %4
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Výběr mincí</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Počet:</translation>
</message>
@@ -553,6 +549,14 @@ Adresa: %4
<translation>Částka</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>Příjem na označení</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Příjem na adrese</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>Datum</translation>
</message>
@@ -677,10 +681,6 @@ Adresa: %4
<translation>ne</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Popisek zčervená, pokud je velikost transakce větší než 1000 bajtů.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>To znamená, že je vyžadován poplatek alespoň %1 za kB.</translation>
</message>
@@ -693,14 +693,6 @@ Adresa: %4
<translation>Transakce s vyšší prioritou mají větší šanci na zařazení do bloku.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Popisek zčervená, pokud je priorita menší než „střední“.</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Popisek zčervená, pokud má některý příjemce obdržet částku menší než %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(bez označení)</translation>
</message>
@@ -821,30 +813,6 @@ Adresa: %4
<source>command-line options</source>
<translation>možnosti příkazové řádky</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Možnosti UI</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Nastavit jazyk, například "de_DE" (výchozí: systémové nastavení)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Nastartovat minimalizovaně</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Nastavit kořenové SSL certifikáty pro platební požadavky (výchozí: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Zobrazit startovací obrazovku (výchozí: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Zvolit adresář pro data při startu (výchozí: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -884,7 +852,15 @@ Adresa: %4
<source>Error</source>
<translation>Chyba</translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>%n GB volného místa</numerusform><numerusform>%n GB volného místa</numerusform><numerusform>%n GB volného místa</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(z potřebného %n GB)</numerusform><numerusform>(z potřebných %n GB)</numerusform><numerusform>(z potřebných %n GB)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -919,14 +895,6 @@ Adresa: %4
<translation>&amp;Hlavní</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Automaticky spustí Bitcoin po přihlášení do systému.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>S&amp;pustit Bitcoin po přihlášení do systému</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Velikost &amp;databázové cache</translation>
</message>
@@ -1007,6 +975,14 @@ Adresa: %4
<translation>Namapovat port přes &amp;UPnP</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Připojí se do Bitcoinové sítě přes SOCKS5 proxy.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>&amp;Připojit přes SOCKS5 proxy (výchozí proxy):</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>&amp;IP adresa proxy:</translation>
</message>
@@ -1031,10 +1007,6 @@ Adresa: %4
<translation>&amp;Minimalizovávat do ikony v panelu</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 Quit in the menu.</source>
- <translation>Zavřením se aplikace minimalizuje. Pokud je tato volba zaškrtnuta, tak se aplikace ukončí pouze zvolením Konec v menu.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>Za&amp;vřením minimalizovat</translation>
</message>
@@ -1047,10 +1019,6 @@ Adresa: %4
<translation>&amp;Jazyk uživatelského rozhraní:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Tady lze nastavit jazyk uživatelského rozhraní. Nastavení se projeví až po restartování Bitcoinu.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>J&amp;ednotka pro částky:</translation>
</message>
@@ -1087,10 +1055,6 @@ Adresa: %4
<translation>K aktivaci změn je potřeba restartovat klienta.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Klient se vypne, chceš pokračovat?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Tahle změna bude chtít restartovat klienta.</translation>
</message>
@@ -1138,6 +1102,10 @@ Adresa: %4
<translation>Vytěžené mince, které ještě nejsou zralé</translation>
</message>
<message>
+ <source>Balances</source>
+ <translation>Stavy účtů</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation>Celkem:</translation>
</message>
@@ -1150,6 +1118,14 @@ Adresa: %4
<translation>Aktuální stav účtu sledovaných adres</translation>
</message>
<message>
+ <source>Spendable:</source>
+ <translation>Běžné:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation>Poslední transakce</translation>
+ </message>
+ <message>
<source>Unconfirmed transactions to watch-only addresses</source>
<translation>Nepotvrzené transakce sledovaných adres</translation>
</message>
@@ -1161,10 +1137,6 @@ Adresa: %4
<source>Current total balance in watch-only addresses</source>
<translation>Aktuální stav účtu sledovaných adres</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>nesynchronizováno</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1185,10 +1157,6 @@ Adresa: %4
<translation>Síť platebního požadavku neodpovídá síti klienta.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Platební požadavek vypršel.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>Platební požadavek není zahájený.</translation>
</message>
@@ -1229,6 +1197,14 @@ Adresa: %4
<translation>Vrácení peněz od %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>Platební požadavek %1 je moc velký (%2 bajtů, povoleno %3 bajtů).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>DoS ochrana platebního požadavku</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Chyba při komunikaci s %1: %2</translation>
</message>
@@ -1256,10 +1232,6 @@ Adresa: %4
<translation>Typ klienta</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adresa/Název hostitele</translation>
- </message>
- <message>
<source>Ping Time</source>
<translation>Odezva</translation>
</message>
@@ -1291,14 +1263,6 @@ Adresa: %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>SÍŤ</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>NEZNÁMÁ</translation>
- </message>
- <message>
<source>None</source>
<translation>Žádné</translation>
</message>
@@ -1497,18 +1461,10 @@ Adresa: %4
<translation>Soubor s ladicími záznamy</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Otevři soubor s ladicími záznamy Bitcoinu z aktuálního datového adresáře. U velkých logů to může pár vteřin zabrat.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Vyčistit konzoli</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Vítej v Bitcoinové RPC konzoli.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>V historii se pohybuješ šipkami nahoru a dolů a pomocí &lt;b&gt;Ctrl-L&lt;/b&gt; čistíš obrazovku.</translation>
</message>
@@ -1785,6 +1741,70 @@ Adresa: %4
<translation>Vlastní adresa pro drobné</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Transakční poplatek:</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>Zvol...</translation>
+ </message>
+ <message>
+ <source>collapse fee-settings</source>
+ <translation>sbal nastavení poplatků</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>za kilobajt</translation>
+ </message>
+ <message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>Pokud je vlastní poplatek nastavený na 1000 satoshi a transakce má pouze 250 bajtů, tak „za kilobajt“ zaplatí poplatek jen 250 satoshi, zatímco „přinejmenším“ zaplatí 1000 satoshi. Pro transakce větší než kilobajt obě možnosti platí za kilobajt.</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>přinejmenším</translation>
+ </message>
+ <message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>Platit jen minimální poplatek je v pořádku, pokud je zrovna méně transakcí než místa v blocích. Ale počítej s tím, že to také může skončit transakcí, která nikdy nebude potvrzena, pokud je větší poptávka po bitcoinových transakcích, než síť zvládne zpracovat.</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(viz bublina)</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Doporučený:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>Vlastní:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(Inteligentní poplatek ještě není inicializovaný. Obvykle mu to tak pár bloků trvá...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Rychlost potvrzení:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>normální</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>rychlá</translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Pošli transakci pokud možno bez poplatku</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(potvrzení může trvat déle)</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Pošli více příjemcům naráz</translation>
</message>
@@ -1861,10 +1881,6 @@ Adresa: %4
<translation>nebo</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Adresa příjemce je neplatná, překontroluj ji prosím.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Odesílaná částka musí být větší než 0.</translation>
</message>
@@ -1877,10 +1893,6 @@ Adresa: %4
<translation>Celková částka při připočítání poplatku %1 překročí stav účtu.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Zaznamenána duplikovaná adresa; každá adresa může být v odesílané platbě pouze jednou.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Vytvoření transakce selhalo!</translation>
</message>
@@ -1889,6 +1901,10 @@ Adresa: %4
<translation>Transakce byla odmítnuta! Tohle může nastat, pokud nějaké mince z tvé peněženky už jednou byly utraceny, například pokud používáš kopii souboru wallet.dat a mince byly utraceny v druhé kopii, ale nebyly označeny jako utracené v této.</translation>
</message>
<message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Zaplatit pouze minimální poplatek %1</translation>
+ </message>
+ <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Upozornění: Neplatná Bitcoinová adresa</translation>
</message>
@@ -1964,10 +1980,6 @@ Adresa: %4
<translation>Zpráva:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Tohle je ověřený platební požadavek.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Zadej označení této adresy; obojí se ti pak uloží do adresáře</translation>
</message>
@@ -1976,10 +1988,6 @@ Adresa: %4
<translation>Zpráva, která byla připojena k bitcoin: URI a která se ti pro přehled uloží k transakci. Poznámka: Tahle zpráva se neposílá s platbou po Bitcoinové síti.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Tohle je neověřený platební požadavek.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Komu:</translation>
</message>
@@ -2010,10 +2018,6 @@ Adresa: %4
<translation>&amp;Podepiš zprávu</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Podepsáním zprávy svými adresami můžeš prokázat, že je skutečně vlastníš. Buď opatrný a nepodepisuj nic vágního; například při phishingových útocích můžeš být lákán, abys něco takového podepsal. Podepisuj pouze zcela úplná a detailní prohlášení, se kterými souhlasíš.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>Bitcoinová adresa, kterou se zpráva podepíše</translation>
</message>
@@ -2066,10 +2070,6 @@ Adresa: %4
<translation>&amp;Ověř zprávu</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>K ověření podpisu zprávy zadej podepisující adresu, zprávu (ověř si, že správně kopíruješ zalomení řádků, mezery, tabulátory apod.) a podpis. Dávej pozor na to, abys nezkopíroval do podpisu víc, než co je v samotné podepsané zprávě, abys nebyl napálen man-in-the-middle útokem.</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>Bitcoinová adresa, kterou je zpráva podepsána</translation>
</message>
@@ -2216,7 +2216,7 @@ Adresa: %4
</message>
<message>
<source>watch-only</source>
- <translation>sledovací</translation>
+ <translation>sledovaná</translation>
</message>
<message>
<source>label</source>
@@ -2226,6 +2226,10 @@ Adresa: %4
<source>Credit</source>
<translation>Příjem</translation>
</message>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation><numerusform>dozraje po %n bloku</numerusform><numerusform>dozraje po %n blocích</numerusform><numerusform>dozraje po %n blocích</numerusform></translation>
+ </message>
<message>
<source>not accepted</source>
<translation>neakceptováno</translation>
@@ -2329,10 +2333,6 @@ Adresa: %4
<translation>Typ</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Nedozráno (%1 potvrzení, bude k dispozici za %2)</translation>
</message>
@@ -2361,6 +2361,10 @@ Adresa: %4
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Označení</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Nepotvrzeno</translation>
</message>
@@ -2413,8 +2417,8 @@ Adresa: %4
<translation>Druh transakce.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Cílová adresa transakce.</translation>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation>Zda tato transakce zahrnuje i některou sledovanou adresu.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2508,6 +2512,10 @@ Adresa: %4
<translation>Exportuj transakční historii</translation>
</message>
<message>
+ <source>Watch-only</source>
+ <translation>Sledovaná</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation>Exportování selhalo</translation>
</message>
@@ -2651,30 +2659,6 @@ Adresa: %4
<translation>Přijímat spojení zvenčí (výchozí: 1, pokud není zadáno -proxy nebo -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, musíš nastavit rpcpassword v konfiguračním souboru:
-%s
-Je vhodné použít následující náhodné heslo:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(není potřeba si ho pamatovat)
-rpcuser a rpcpassword NESMÍ být stejné.
-Pokud konfigurační soubor ještě neexistuje, vytvoř ho tak, aby ho mohl číst pouze vlastník.
-Je také doporučeno si nastavit alertnotify, abys byl upozorněn na případné problémy;
-například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Poslouchat na zadané adrese. Pro zápis IPv6 adresy použij notaci [adresa]:port</translation>
</message>
@@ -2683,16 +2667,12 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Smazat všechny transakce peněženky a při startu obnovit pouze relevantní části řetězce bloků pomocí -rescan</translation>
</message>
<message>
- <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
- <translation>Přepnout do módu testování regresí, který používá speciální řetězec, ve kterém mohou být bloky okamžitě vyřešeny.</translation>
+ <source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
+ <translation>Šířen pod softwarovou licencí MIT, viz přiložený soubor COPYING nebo &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Chyba: Transakce byla odmítnuta! Tohle může nastat, pokud nějaké mince z tvé peněženky už jednou byly utraceny, například pokud používáš kopii souboru wallet.dat a mince byly utraceny v druhé kopii, ale nebyly označeny jako utracené v této.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Chyba: Tahle transakce vyžaduje transakční poplatek nejméně %s kvůli velikosti zasílané částky, komplexnosti nebo použití nedávno přijatých mincí!</translation>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>Přepnout do módu testování regresí, který používá speciální řetězec, ve kterém mohou být bloky okamžitě vyřešeny.</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
@@ -2735,6 +2715,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Upozornění: soubor wallet.dat je poškozený, data jsou však zachráněna! Původní soubor wallet.dat je uložený jako wallet.{timestamp}.bak v %s. Pokud je stav tvého účtu nebo transakce nesprávné, zřejmě bys měl obnovit zálohu.</translation>
</message>
<message>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Umístit na bílou listinu protějšky připojující se z dané podsítě či IP adresy. Lze zadat i vícekrát.</translation>
+ </message>
+ <message>
<source>(default: 1)</source>
<translation>(výchozí: 1)</translation>
</message>
@@ -2767,10 +2751,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Možnosti ladění/testování:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Zjistit vlastní IP adresu (výchozí: 1, pokud naslouchá a není zadáno -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Nenačítat peněženku a vypnout její RPC volání</translation>
</message>
@@ -2795,12 +2775,12 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Chyba při otevírání databáze bloků</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>Problém: Na disku je málo místa!</translation>
+ <source>Error: A fatal internal error occured, see debug.log for details</source>
+ <translation>Chyba: Stala se fatální vnitřní chyba. detaily viz v debug.log</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Chyba: Peněženka je zamčená, nemohu vytvořit transakci!</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>Problém: Na disku je málo místa!</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
@@ -2827,8 +2807,8 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Je nedostatek deskriptorů souborů.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Znovu vytvořit index řetězce bloků z aktuálních blk000??.dat souborů</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Připojovat se pouze k uzlům v &lt;net&gt; síti (ipv4, ipv6 nebo onion)</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -2847,6 +2827,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Tohle je určeno pro nástroje na regresní testování a vyvíjení aplikací.</translation>
</message>
<message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Použít UPnP k namapování naslouchacího portu (výchozí: %u)</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Ověřuji bloky... </translation>
</message>
@@ -2915,6 +2899,14 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Poplatky (v BTC/Kb) menší než tato hodnota jsou považovány za nulové pro účely vytváření transakcí (výchozí: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Pokud paytxfee není nastaveno, platit dostatečný poplatek na to, aby byly transakce potvrzeny v průměru během n bloků (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>Maximální velikost dat v transakcích nesoucích data, se kterou jsme ochotni je ještě přeposílat a těžit (výchozí: %u)</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Při nedostatku adres získat další protějšky z DNS (výchozí: 1, pokud není použito -connect)</translation>
</message>
@@ -2923,6 +2915,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Nastavit maximální velikost prioritních/nízkopoplatkových transakcí v bajtech (výchozí: %d)</translation>
</message>
<message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>Nastavení počtu vláken pro těžení, je-li zapnuté (-1 = všechna jádra, výchozí: %d)</translation>
+ </message>
+ <message>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation>Tento produkt zahrnuje programy vyvinuté OpenSSL Projektem pro použití v OpenSSL Toolkitu &lt;https://www.openssl.org/&gt; a kryptografický program od Erika Younga a program UPnP od Thomase Bernarda.</translation>
</message>
@@ -2939,6 +2935,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Nemohu přeložit -whitebind adresu: '%s'</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Zvolit adresář pro data při startu (výchozí: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Připojit se přes SOCKS5 proxy</translation>
</message>
@@ -2955,6 +2955,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Chyba při načítání wallet.dat: peněženka vyžaduje novější verzi Bitcoin Core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Chyba při čtení z databáze, ukončuji se.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Chyba: Argument -tor již není podporovaný, použij -onion.</translation>
</message>
@@ -2987,8 +2991,8 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ve -whitelist byla zadána neplatná podsíť: '%s'</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Držet v paměti nejvýše &lt;n&gt; nespojitelných bloků (výchozí: %u)</translation>
+ <source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
+ <translation>Držet v paměti nejvýše &lt;n&gt; nespojitelných transakcí (výchozí: %u)</translation>
</message>
<message>
<source>Need to specify a port with -whitebind: '%s'</source>
@@ -2999,10 +3003,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Možnosti přeposílání:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Vypsat při startu blok,pokud se nachází v indexu bloků</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Možnosti SSL pro RPC: (viz instrukce nastavení SSL na Bitcoin Wiki)</translation>
</message>
@@ -3023,10 +3023,26 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Posílat stopovací/ladicí informace do konzole místo do souboru debug.log</translation>
</message>
<message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>Posílat transakce pokud možno bez poplatků (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Nastavit kořenové SSL certifikáty pro platební požadavky (výchozí: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Nastavit jazyk, například "de_DE" (výchozí: systémové nastavení)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Zobrazit všechny možnosti ladění (užití: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Zobrazit startovací obrazovku (výchozí: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Při spuštění klienta zmenšit soubor debug.log (výchozí: 1, pokud není zadáno -debug)</translation>
</message>
@@ -3035,6 +3051,10 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Nepodařilo se podepsat transakci</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Nastartovat minimalizovaně</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Tohle je experimentální program.</translation>
</message>
@@ -3047,8 +3067,12 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Částky v transakci musí být kladné</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transakce je na poplatkovou politiku příliš velká</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
- <translation>Transace je příliš velká</translation>
+ <translation>Transakce je příliš velká</translation>
</message>
<message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
@@ -3071,10 +3095,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Upozornění</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Upozornění: tahle verze je zastaralá, měl bys ji aktualizovat!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Upozornění: Nepodporovaný argument -benchmark se ignoruje, použij -debug=bench.</translation>
</message>
@@ -3131,14 +3151,166 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Chyba při načítání wallet.dat: peněženka je poškozená</translation>
</message>
<message>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = ukládat transakční metadata, např. majitele účtu a informace o platebním požadavku, 2 = mazat transakční metadata)</translation>
+ </message>
+ <message>
+ <source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Promítnout databázovou aktivitu z paměťového prostoru do záznamu na disku každých &lt;n&gt; megabajtů (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>Jak moc důkladná má být verifikace bloků -checkblocks (0-4, výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
+ <translation>Zaznamenávat během těžení bloků prioritu transakce a poplatek za kB (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
+ <translation>Spravovat úplný index transakcí, který je využíván rpc voláním getrawtransaction (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
+ <translation>Doba ve vteřinách, po kterou se nebudou moci zlobivé protějšky znovu připojit (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
+ <translation>Tisknout ladicí informace (výchozí: %u, zadání &lt;category&gt; je volitelné)</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
+ <translation>Použít samostatnou SOCKS5 proxy ke spojení s protějšky přes skryté služby v Toru (výchozí: %s)</translation>
+ </message>
+ <message>
+ <source>(default: %s)</source>
+ <translation>(výchozí: %s)</translation>
+ </message>
+ <message>
+ <source>Acceptable ciphers (default: %s)</source>
+ <translation>Akceptovatelné šifry (výchozí: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Vždy získávat adresy dalších protějšků přes DNS (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Disable safemode, override a real safe mode event (default: %u)</source>
+ <translation>Vypnout bezpečný režim (safemode), překrýt skutečnou událost bezpečného režimu (výchozí: %u)</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>Chyba při načítání wallet.dat</translation>
</message>
<message>
+ <source>Force safe mode (default: %u)</source>
+ <translation>Vynutit bezpečný mód (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Generate coins (default: %u)</source>
+ <translation>Těžit (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>How many blocks to check at startup (default: %u, 0 = all)</source>
+ <translation>Kolik bloků při startu zkontrolovat (výchozí: %u, 0 = všechny)</translation>
+ </message>
+ <message>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>Zaznamenávat do ladicích výstupů i IP adresy (výchozí: %u)</translation>
+ </message>
+ <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Neplatná -proxy adresa: '%s'</translation>
</message>
<message>
+ <source>Limit size of signature cache to &lt;n&gt; entries (default: %u)</source>
+ <translation>Omezit velikost vyrovnávací paměti pro podpisy na &lt;n&gt; položek (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Čekat na JSON-RPC spojení na &lt;portu&gt; (výchozí: %u nebo testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Čekat na spojení na &lt;portu&gt; (výchozí: %u nebo testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
+ <translation>Povolit nejvýše &lt;n&gt; protějšků (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Maximální velikost přijímacího bufferu pro každé spojení, &lt;n&gt;*1000 bajtů (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Maximální velikost odesílacího bufferu pro každé spojení, &lt;n&gt;*1000 bajtů (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Only accept block chain matching built-in checkpoints (default: %u)</source>
+ <translation>Uznávat pouze řetězec bloků, který odpovídá vnitřním kontrolním bodům (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Prepend debug output with timestamp (default: %u)</source>
+ <translation>Připojit před ladicí výstup časové razítko (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>Přeposílat a těžit transakce nesoucí data (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>Přeposílat ne-P2SH multisig (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Run a thread to flush wallet periodically (default: %u)</source>
+ <translation>Spustit vlákno pročišťující periodicky peněženku (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Server certificate file (default: %s)</source>
+ <translation>Soubor se serverovým certifikátem (výchozí: %s)</translation>
+ </message>
+ <message>
+ <source>Server private key (default: %s)</source>
+ <translation>Soubor se serverovým soukromým klíčem (výchozí: %s)</translation>
+ </message>
+ <message>
+ <source>Set key pool size to &lt;n&gt; (default: %u)</source>
+ <translation>Nastavit zásobník klíčů na velikost &lt;n&gt; (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Set minimum block size in bytes (default: %u)</source>
+ <translation>Nastavit minimální velikost bloku v bajtech (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Set the number of threads to service RPC calls (default: %d)</source>
+ <translation>Nastavení počtu vláken pro servisní RPC volání (výchozí: %d)</translation>
+ </message>
+ <message>
+ <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source>
+ <translation>Nastavit příznak DB_PRIVATE v databázovém prostředí peněženky (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Specify configuration file (default: %s)</source>
+ <translation>Konfigurační soubor (výchozí: %s)</translation>
+ </message>
+ <message>
+ <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
+ <translation>Zadej časový limit spojení v milivteřinách (minimum: 1, výchozí: %d)</translation>
+ </message>
+ <message>
+ <source>Spend unconfirmed change when sending transactions (default: %u)</source>
+ <translation>Utrácet i ještě nepotvrzené drobné při posílání transakcí (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Stop running after importing blocks from disk (default: %u)</source>
+ <translation>Ukončit se po importu bloků z disku (výchozí: %u)</translation>
+ </message>
+ <message>
+ <source>Threshold for disconnecting misbehaving peers (default: %u)</source>
+ <translation>Práh pro odpojování zlobivých protějšků (výchozí: %u)</translation>
+ </message>
+ <message>
<source>Unknown network specified in -onlynet: '%s'</source>
<translation>V -onlynet byla uvedena neznámá síť: '%s'</translation>
</message>
@@ -3155,10 +3327,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Neplatná částka pro -paytxfee=&lt;částka&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Neplatná částka</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nedostatek prostředků</translation>
</message>
@@ -3191,10 +3359,6 @@ například: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Načítání dokončeno</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>K použití volby %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Chyba</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cy.ts b/src/qt/locale/bitcoin_cy.ts
index c68fc274f3..9867375fb2 100644
--- a/src/qt/locale/bitcoin_cy.ts
+++ b/src/qt/locale/bitcoin_cy.ts
@@ -1,11 +1,7 @@
-<TS language="cy" version="2.0">
+<TS language="cy" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Clicio dwywaith i olygu cyfeiriad neu label</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Creu cyfeiriad newydd</translation>
</message>
@@ -72,10 +68,6 @@
<translation>Newid cyfrinymadrodd</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Teipiwch yr hen cyfrinymadrodd a chyfrinymadrodd newydd i mewn i'r waled.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Cadarnau amgryptiad y waled</translation>
</message>
@@ -445,13 +437,13 @@
<translation>Math</translation>
</message>
<message>
- <source>Address</source>
- <translation>Cyfeiriad</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Agor tan %1</translation>
</message>
+ <message>
+ <source>Label</source>
+ <translation>Label</translation>
+ </message>
</context>
<context>
<name>TransactionView</name>
diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts
index f733591098..1467791047 100644
--- a/src/qt/locale/bitcoin_da.ts
+++ b/src/qt/locale/bitcoin_da.ts
@@ -1,9 +1,9 @@
-<TS language="da" version="2.0">
+<TS language="da" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dobbeltklik for at redigere adresse eller mærkat</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Højreklik for at redigere adresse eller mærke</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>Skift adgangskode</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Indtast den gamle og den nye adgangskode til tegnebogen.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Bekræft tegnebogskryptering</translation>
</message>
@@ -172,6 +168,10 @@
<translation>Er du sikker på, at du ønsker at kryptere din tegnebog?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Bitcoin Core vil nu lukke for at færdiggøre krypteringsprocessen. Husk at kryptering af din tegnebog kan ikke beskytte dine bitcoin fuldt ud mod at blive stjålet af eventuel malware, der måtte have inficeret din computer.</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>VIGTIGT: Enhver tidligere sikkerhedskopi, som du har lavet af tegnebogsfilen, bør blive erstattet af den nyligt genererede, krypterede tegnebogsfil. Af sikkerhedsmæssige årsager vil tidligere sikkerhedskopier af den ikke-krypterede tegnebogsfil blive ubrugelige i det øjeblik, du starter med at anvende den nye, krypterede tegnebog.</translation>
</message>
@@ -188,8 +188,8 @@
<translation>Indtast det nye kodeord til tegnebogen.&lt;br/&gt;Brug venligst et kodeord på &lt;b&gt;ti eller flere tilfældige tegn&lt;/b&gt; eller &lt;b&gt;otte eller flere ord&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin vil nu lukke for at gennemføre krypteringsprocessen. Husk på, at kryptering af din tegnebog vil ikke beskytte dine bitcoins fuldt ud mod at blive stjålet af malware på din computer.</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Indtast den gamle adgangskode og en ny adgangskode til tegnebogen.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -311,10 +311,6 @@
<translation>Send bitcoins til en Bitcoin-adresse</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Redigér konfigurationsindstillinger for Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Lav sikkerhedskopi af tegnebogen til et andet sted</translation>
</message>
@@ -403,6 +399,10 @@
<translation>&amp;Om Bitcoin Core</translation>
</message>
<message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Ændr opsætning af Bitcoin Core</translation>
+ </message>
+ <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Vis listen over brugte afsendelsesadresser og -mærkater</translation>
</message>
@@ -431,6 +431,10 @@
<translation>Ingen blokkilde tilgængelig …</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>Bearbejdede %n blok med transaktionshistorik.</numerusform><numerusform>Bearbejdede %n blokke med transaktionshistorik.</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n time</numerusform><numerusform>%n timer</numerusform></translation>
</message>
@@ -478,35 +482,49 @@
<source>Up to date</source>
<translation>Opdateret</translation>
</message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>%n blok af transaktionshistorikken er blevet behandlet.</numerusform><numerusform>%n blokke af transaktionshistorikken er blevet behandlet.</numerusform></translation>
- </message>
<message>
<source>Catching up...</source>
<translation>Indhenter …</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>Afsendt transaktion</translation>
+ <source>Date: %1
+</source>
+ <translation>Dato: %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>Indgående transaktion</translation>
+ <source>Amount: %1
+</source>
+ <translation>Beløb: %1
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Type: %1
</source>
- <translation>Dato: %1
-Beløb: %2
-Type: %3
-Adresse: %4
+ <translation>Type: %1
</translation>
</message>
<message>
+ <source>Label: %1
+</source>
+ <translation>Mærkat: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Adresse: %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation>Afsendt transaktion</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Indgående transaktion</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Tegnebog er &lt;b&gt;krypteret&lt;/b&gt; og i øjeblikket &lt;b&gt;ulåst&lt;/b&gt;</translation>
</message>
@@ -697,6 +715,18 @@ Adresse: %4
<translation>ingen</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Denne mærkat bliver rød, hvis transaktionsstørrelsen er større end 1000 byte.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Denne mærkat bliver rød, hvis prioriteten er mindre end "medium".</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>Denne mærkat bliver rød, hvis en eller flere modtagere modtager et beløb, der er mindre end %1.</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation>Kan variere med +/- %1 satoshi per input.</translation>
</message>
@@ -709,10 +739,6 @@ Adresse: %4
<translation>nej</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Dette mærkat bliver rødt, hvis transaktionsstørrelsen er større end 1000 byte.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Dette betyder, at et gebyr på mindst %1 pr. kB er nødvendigt.</translation>
</message>
@@ -725,14 +751,6 @@ Adresse: %4
<translation>Transaktioner med højere prioritet har højere sansynlighed for at blive inkluderet i en blok.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Dette mærkat bliver rødt, hvis prioriteten er mindre end "medium".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Dette mærkat bliver rødt, hvis mindst én modtager et beløb mindre end %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(ingen mærkat)</translation>
</message>
@@ -853,30 +871,6 @@ Adresse: %4
<source>command-line options</source>
<translation>kommandolinjetilvalg</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Brugergrænsefladeindstillinger</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Angiv sprog, fx "da_DK" (standard: systemlokalitet)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Start minimeret</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Sæt SSL-rodcertifikater for betalingsanmodning (standard: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Vis opstartsbillede ved opstart (standard: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Vælg datamappe ved opstart (standard: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -955,14 +949,6 @@ Adresse: %4
<translation>&amp;Generelt</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Start Bitcoin automatisk, når der logges ind på systemet.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Start Bitcoin ved systemlogin</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Størrelsen på &amp;databasens cache</translation>
</message>
@@ -987,6 +973,14 @@ Adresse: %4
<translation>IP-adresse for proxyen (fx IPv4: 127.0.0.1 / IPv6: ::1)</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>Minimér i stedet for at lukke applikationen, når vinduet lukkes. Når denne indstilling er slået til, vil applikationen først blive lukket, når Afslut vælges i menuen.</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>Sproget for brugerfladen kan vælges her. Denne indstilling vil træde i kraft efter genstart af Bitcoin Core.</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>Tredjeparts-URL'er (fx et blokhåndteringsværktøj), der vises i transaktionsfanen som genvejsmenupunkter. %s i URL'en erstattes med transaktionens hash. Flere URL'er separeres med en lodret streg |.</translation>
</message>
@@ -1011,6 +1005,14 @@ Adresse: %4
<translation>&amp;Netværk</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>Start Bitcoin Core automatisk efter der logges ind på systemet.</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>&amp;Start Bitcoin Core ved system-login</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = auto, &lt;0 = efterlad så mange kerner fri)</translation>
</message>
@@ -1075,10 +1077,6 @@ Adresse: %4
<translation>&amp;Minimér til statusfeltet i stedet for proceslinjen</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 Quit in the menu.</source>
- <translation>Minimér i stedet for at afslutte programmet, når vinduet lukkes. Når denne indstilling er valgt, vil programmet kun blive lukket, når du har valgt Afslut i menuen.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimér ved lukning</translation>
</message>
@@ -1091,10 +1089,6 @@ Adresse: %4
<translation>&amp;Sprog for brugergrænseflade:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Sproget for brugergrænsefladen kan angives her. Denne indstilling træder først i kraft, når Bitcoin genstartes.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Enhed at vise beløb i:</translation>
</message>
@@ -1131,8 +1125,8 @@ Adresse: %4
<translation>Genstart af klienten er nødvendig for at aktivere ændringer.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Klienten vil blive lukket ned; vil du fortsætte?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>Klienten vil lukke ned. Vil du fortsætte?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1217,10 +1211,6 @@ Adresse: %4
<source>Current total balance in watch-only addresses</source>
<translation>Nuværende totalsaldo på kigge-adresser</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>ikke synkroniseret</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1241,10 +1231,6 @@ Adresse: %4
<translation>Netværk for betalingsanmodning stemmer ikke overens med klientens netværk.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Betalingsanmodning er udløbet.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>Betalingsanmodning er ikke klargjort.</translation>
</message>
@@ -1277,14 +1263,30 @@ Adresse: %4
<translation>Fil for betalingsanmodning kan ikke læses! Dette kan skyldes en ugyldig fil for betalingsanmodning.</translation>
</message>
<message>
+ <source>Payment request expired.</source>
+ <translation>Betalingsanmodning er udløbet.</translation>
+ </message>
+ <message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>Ikke-verificerede betalingsanmodninger for tilpassede betalings-scripts understøttes ikke.</translation>
</message>
<message>
+ <source>Invalid payment request.</source>
+ <translation>Ugyldig betalingsanmodning.</translation>
+ </message>
+ <message>
<source>Refund from %1</source>
<translation>Tilbagebetaling fra %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>Betalingsanmodning %1 er for stor (%2 byte, %3 byte tilladt).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Beskyttelse mod DoS-angreb via betalingsanmodninger</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Fejl under kommunikation med %1: %2</translation>
</message>
@@ -1312,8 +1314,8 @@ Adresse: %4
<translation>Brugeragent</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adresse/værtsnavn</translation>
+ <source>Node/Service</source>
+ <translation>Knude/tjeneste</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1347,14 +1349,6 @@ Adresse: %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>NETVÆRK</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>UKENDT</translation>
- </message>
- <message>
<source>None</source>
<translation>Ingen</translation>
</message>
@@ -1445,6 +1439,10 @@ Adresse: %4
<translation>Nuværende antal blokke</translation>
</message>
<message>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Åbn Bitcoin Cores fejlsøgningslogfil fra den aktuelle datamappe. Dette kan tage nogle få sekunder for store logfiler.</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Modtaget</translation>
</message>
@@ -1513,6 +1511,10 @@ Adresse: %4
<translation>Ping-tid</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation>Tidsforskydning</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Tidsstempel for seneste blok</translation>
</message>
@@ -1553,16 +1555,12 @@ Adresse: %4
<translation>Fejlsøgningslogfil</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Åbn Bitcoin-fejlsøgningslogfilen fra den nuværende datamappe. Dette kan tage nogle få sekunder for store logfiler.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Ryd konsol</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Velkommen til Bitcoin RPC-konsollen.</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Velkommen til Bitcoin Cores RPC-konsol.</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
@@ -1853,14 +1851,6 @@ Adresse: %4
<translation>sammenfold gebyropsætning</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Minimér</translation>
- </message>
- <message>
- <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
- <translation>Hvis det brugertilpassede gebyr er sat til 1000 satoshis, og transaktionen kun fylder 250 byte, betaler "pr. kilobyte" kun 250 satoshis i gebyr, mens "mindst" betaler 1000 satoshis. For transaktioner større end en kilobyte betaler begge pr. kilobyte.</translation>
- </message>
- <message>
<source>per kilobyte</source>
<translation>pr. kilobyte</translation>
</message>
@@ -1869,6 +1859,10 @@ Adresse: %4
<translation>Hvis det brugertilpassede gebyr er sat til 1000 satoshis, og transaktionen kun fylder 250 byte, betaler "pr. kilobyte" kun 250 satoshis i gebyr, mens "total mindst" betaler 1000 satoshis. For transaktioner større end en kilobyte betaler begge pr. kilobyte.</translation>
</message>
<message>
+ <source>Hide</source>
+ <translation>Skjul</translation>
+ </message>
+ <message>
<source>total at least</source>
<translation>total mindst</translation>
</message>
@@ -1989,10 +1983,6 @@ Adresse: %4
<translation>eller</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Modtagerens adresse er ikke gyldig. Tjek venligst adressen igen.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Beløbet til betaling skal være større end 0.</translation>
</message>
@@ -2005,10 +1995,6 @@ Adresse: %4
<translation>Totalen overstiger din saldo, når transaktionsgebyret på %1 er inkluderet.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Duplikeret adresse fundet. Du kan kun sende til hver adresse én gang pr. afsendelse.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Oprettelse af transaktion mislykkedes!</translation>
</message>
@@ -2017,16 +2003,28 @@ Adresse: %4
<translation>Transaktionen blev afvist! Dette kan ske, hvis nogle af dine bitcoins i din tegnebog allerede er brugt, som hvis du brugte en kopi af wallet.dat og dine bitcoins er blevet brugt i kopien, men ikke er markeret som brugt her.</translation>
</message>
<message>
- <source>A fee higher than %1 is considered an insanely high fee.</source>
- <translation>Et gebyr højere end %1 anses som et vanvittigt højt gebyr.</translation>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation>Et gebyr højere end %1 opfattes som et absurd højt gebyr.</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>Betalingsanmodning er udløbet.</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation><numerusform>Bekræftelse estimeres til at begynde inden for %n blok.</numerusform><numerusform>Bekræftelse estimeres til at begynde inden for %n blokke.</numerusform></translation>
</message>
<message>
<source>Pay only the minimum fee of %1</source>
<translation>Betal kun det minimale gebyr på %1</translation>
</message>
<message>
- <source>Estimated to begin confirmation within %1 block(s).</source>
- <translation>Bekræftelse vurderes at begynde inden for %1 blok(ke).</translation>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>Modtageradressen er ikke gyldig. Tjek venligst igen.</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation>Adressegenganger fundet. Adresser bør kun bruges én gang hver.</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
@@ -2100,12 +2098,24 @@ Adresse: %4
<translation>Fjern denne indgang</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>Gebyret vil blive trukket fra det sendte beløb. Modtageren vil modtage færre bitcoin, end du indtaster i beløbfeltet. Hvis flere modtagere vælges, vil gebyret deles ligeligt.</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation>&amp;Træk gebyr fra beløb</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Besked:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Dette er en verificeret betalingsanmodning.</translation>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>Dette er en uautentificeret betalingsanmodning.</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>Dette er en autentificeret betalingsanmodning.</translation>
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
@@ -2116,10 +2126,6 @@ Adresse: %4
<translation>En besked, som blev føjet til "bitcon:"-URI'en, som vil gemmes med transaktionen til din reference. Bemærk: Denne besked vil ikke blive sendt over Bitcoin-netværket.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Dette er en ikke-verificeret betalingsanmodning.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Betal til:</translation>
</message>
@@ -2150,8 +2156,8 @@ Adresse: %4
<translation>&amp;Underskriv besked</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Du kan underskrive beskeder med dine Bitcoin-adresser for at bevise, at de tilhører dig. Pas på ikke at underskrive noget vagt, da phisingangreb kan narre dig til at overdrage din identitet. Underskriv kun fuldt detaljerede udsagn, du er enig i.</translation>
+ <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>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>
@@ -2206,8 +2212,8 @@ Adresse: %4
<translation>&amp;Verificér besked</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Indtast herunder den underskrivende adresse, beskeden (inkludér linjeskift, mellemrum mv. nøjagtigt, som de fremgår) og underskriften for at verificere beskeden. Vær forsigtig med ikke at lægge mere i underskriften end besked selv, så du undgår at blive narret af et man-in-the-middle-angreb.</translation>
+ <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>Indtast modtagerens adresse, besked (vær sikker på at kopiere linjeskift, mellemrum, tabuleringer, etc. præcist) og signatur herunder for at verificere beskeden. Vær forsigtig med ikke at læse noget ud fra signaturen, som ikke står i selve beskeden, for at undgå at blive snydt af et eventuelt man-in-the-middle-angreb. Bemærk, at dette kun beviser, at den signerende person kan modtage med adressen; det kan ikke bevise hvem der har sendt en given transaktion!</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
@@ -2412,7 +2418,7 @@ Adresse: %4
</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>Minede bitcoins skal modne %1 blokke, før de kan bruges. Da du genererede denne blok, blev den udsendt til netværket for at blive føjet til blokkæden. Hvis det ikke lykkes at få den i kæden, vil dens tilstand ændres til "ikke accepteret", og den vil ikke kunne bruges. Dette kan ske nu og da, hvis en anden knude udvinder en blok inden for nogle få sekunder fra din.</translation>
+ <translation>Minede bitcoins skal modne %1 blokke, før de kan bruges. Da du genererede denne blok, blev den transmitteret til netværket for at blive føjet til blokkæden. Hvis det ikke lykkes at få den i kæden, vil dens tilstand ændres til "ikke accepteret", og den vil ikke kunne bruges. Dette kan ske nu og da, hvis en anden knude udvinder en blok inden for nogle få sekunder fra din.</translation>
</message>
<message>
<source>Debug information</source>
@@ -2473,10 +2479,6 @@ Adresse: %4
<translation>Type</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Umoden (%1 bekræftelser; vil være tilgængelig efter %2)</translation>
</message>
@@ -2505,6 +2507,10 @@ Adresse: %4
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Mærkat</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Ubekræftet</translation>
</message>
@@ -2561,8 +2567,8 @@ Adresse: %4
<translation>Afgør hvorvidt en kigge-adresse er involveret i denne transaktion.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Destinationsadresse for transaktion.</translation>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation>Brugerdefineret hensigt/formål med transaktionen.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2803,34 +2809,14 @@ Adresse: %4
<translation>Acceptér forbindelser udefra (standard: 1 hvis hverken -proxy eller -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, du skal angive en RPC-adgangskode i konfigurationsfilen:
-%s
-Det anbefales, at du bruger nedenstående, tilfældige adgangskode:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(du behøver ikke huske denne adgangskode)
-Brugernavnet og adgangskode MÅ IKKE være det samme.
-Hvis filen ikke eksisterer, opret den og giv ingen andre end ejeren læserettighed.
-Det anbefales også at angive alertnotify, så du påmindes om problemer;
-fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Tildel til den givne adresse og lyt altid på den. Brug [vært]:port-notation for IPv6</translation>
</message>
<message>
+ <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default: %u)</source>
+ <translation>Begræns hyppigheden af gratis transaktioner løbende til &lt;n&gt;*1000 byte pr. minut (standard: %u)</translation>
+ </message>
+ <message>
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
<translation>Slet alle transaktioner i tegnebogen og genskab kun disse dele af blokkæden gennem -rescan under opstart</translation>
</message>
@@ -2843,14 +2829,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Start regressionstesttilstand, som bruger en speciel kæde, hvor blokke kan løses med det samme.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Fejl: Transaktionen blev afvist. Dette kan ske, hvis nogle af dine bitcoins i din tegnebog allerede er brugt, som hvis du brugte en kopi af wallet.dat og dine bitcoins er blevet brugt i kopien, men ikke er markeret som brugt her.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Fejl: Denne transaktion kræver et transaktionsgebyr på minimum %s pga. dens beløb, kompleksitet eller anvendelse af nyligt modtagne bitcoins!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Udfør kommando, når en transaktion i tegnebogen ændres (%s i kommandoen erstattes med TxID)</translation>
</message>
@@ -2859,6 +2837,14 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>I denne tilstand styrer -genproclimit hvor mange blokke, der genereres med det samme.</translation>
</message>
<message>
+ <source>Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Maksimalt totalt gebyr der kan bruges i en enkelt tegnebogstransaktion. For lav en værdi kan afbryde store transaktioner (standard: %s)</translation>
+ </message>
+ <message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, &gt;%u = target size in MiB to use for block files)</source>
+ <translation>Reducér pladskravene ved at beskære (slette, "prune") gamle blokke. Denne tilstand slår understøttelse af tegnebogen fra og er ikke kompatibel med -txindex. Advarsel: Fortrydelse af denne indstilling kræver download af hele blokkæden igen. (standard: 0 = slå beskæring af blokke fra, &gt;%u = målstørrelse i MiB der skal bruges til blokfiler)</translation>
+ </message>
+ <message>
<source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
<translation>Sæt antallet af scriptverificeringstråde (%u til %d, 0 = auto, &lt;0 = efterlad det antal kernet fri, standard: %d)</translation>
</message>
@@ -2927,16 +2913,12 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Tilvalg for fejlfinding/test:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Find egen IP-adresse (standard: 1 når lytter og ingen -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Indlæs ikke tegnebogen og slå tegnebogs-RPC-kald fra</translation>
</message>
<message>
<source>Do you want to rebuild the block database now?</source>
- <translation>Ønsker du at genbygge blokdatabasen nu?</translation>
+ <translation>Ønsker du at genopbygge blokdatabasen nu?</translation>
</message>
<message>
<source>Error initializing block database</source>
@@ -2963,10 +2945,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Fejl: Mangel på ledig diskplads!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Fejl: Tegnebog låst, kan ikke oprette transaktion!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Lytning på enhver port mislykkedes. Brug -listen=0, hvis du ønsker dette.</translation>
</message>
@@ -2995,8 +2973,12 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Tilslut kun til knuder i netværk &lt;net&gt; (IPv4, IPv6 eller Onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Genbyg blokkædeindeks fra nuværende blk000??.dat filer</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>Beskæring kan ikke opsættes med en negativ værdi.</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Beskæringstilstand er ikke kompatibel med -txindex.</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -3035,6 +3017,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Tilvalg for tegnebog:</translation>
</message>
<message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>Advarsel: Denne version er forældet; opgradering påkrævet!</translation>
+ </message>
+ <message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>Du er nødt til at genopbygge databasen ved hjælp af -reindex for at ændre -txindex</translation>
</message>
@@ -3063,14 +3049,14 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Kan ikke opnå en lås på datamappe %s. Bitcoin Core kører sansynligvis allerede.</translation>
</message>
<message>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
- <translation>Rate-begræns kontinuerligt gratis transaktioner til &lt;n&gt;*1000 byte i minuttet (standard: %u)</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Opret nye filer med systemstandard for rettigheder i stedet for umask 077 (kun virksomt med tegnebogsfunktionalitet slået fra)</translation>
</message>
<message>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Opdag egne IP-adresser (standard: 1 under lytning og ingen -externalip eller -proxy)</translation>
+ </message>
+ <message>
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
<translation>Fejl: Lytning efter indkommende forbindelser mislykkedes (lytning resultarede i fejl %s)</translation>
</message>
@@ -3091,14 +3077,34 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Gebyrer (i BTC/Kb) mindre end dette opfattes som nulgebyr for oprettelse af transaktion (standard: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Hvis paytxfee ikke er sat, inkluderes nok gebyr til at transaktioner begynder at blive bekræftet ingen for gennemsnitligt n blokke (standard: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Ugyldigt beløb for -maxtxfee=&lt;beløb&gt;: "%s" (skal være på mindst minrelay-gebyret på %s for at undgå hængende transaktioner)</translation>
+ </message>
+ <message>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation>Maksimal størrelse på data i transaktioner til dataoverførsel, som vi videresender og miner (standard: %u)</translation>
</message>
<message>
+ <source>Prune configured below the minimum of %d MB. Please use a higher number.</source>
+ <translation>Beskæring opsat under minimumsværdien %d MB. Brug venligst en højere værdi.</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Forespørgsel</translation>
</message>
<message>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>Brug tilfældige akkreditiver for hver proxy-forbindelse. Dette tillader strømisolation med Tor (standard: %u)</translation>
+ </message>
+ <message>
+ <source>Require high priority for relaying free or low-fee transactions (default: %u)</source>
+ <translation>Kræv høj prioritet for at videresende transaktioner uden eller med lavt gebyr (standard: %u)</translation>
+ </message>
+ <message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation>Sæt maksimumstørrelse for højprioritet/lavgebyr-transaktioner i byte (standard: %d)</translation>
</message>
@@ -3107,10 +3113,42 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Sæt antaller af tråde for coin-generering, hvis aktiveret (-1 = alle kerner, standard: %d)</translation>
</message>
<message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>Transaktionsbeløbet er for lille til at sende, når gebyret er trukket fra</translation>
+ </message>
+ <message>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation>Dette produkt indeholder software, der er udviklet af OpenSSL-projektet for brug i OpenSSL-værktøjskassen &lt;https://www.openssl.org/&gt;, samt kryptografisk software, der er skrevet af Eric Young, samt UPnP-software, der er skrevet af Thomas Bernard.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>For at bruge bitcoind eller valgmuligheden -server i bitcoin-qt skal du oprette et rpcpassword i konfigurationsfilen:
+%s
+Det anbefales, at du bruger følgende tilfældige adgangskode:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(du behøver ikke at huske adgangskoden)
+Brugernavnet og adgangskoden MÅ IKKE være det samme.
+Hvis filen ikke eksisterer, opret den da så kun ejeren har læserettigheder.
+Det anbefales også at sætte alertnotify, så du får besked omkring problemer;
+for eksempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Advarsel: -maxtxfee er sat meget højt! Så store gebyrer kan betales på en enkelt transaktion.</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Advarsel: Undersøg venligst at din computers dato og klokkeslet er korrekt indstillet! Hvis der er fejl i disse vil Bitcoin Core ikke fungere korrekt.</translation>
</message>
@@ -3119,10 +3157,38 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Andre knuder på hvidliste kan ikke DoS-bandlyses, og deres transaktioner videresendes altid, selv hvis de allerede er i mempool'en. Brugbart til fx et adgangspunkt</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>Du er nødt til at genopbygge databasen ved hjælp af -reindex for at gå tilbage til ikke-beskåret tilstand. Dette vil downloade hele blokkæden igen</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(standard: %u)</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Acceptér offentlige REST-anmodninger (standard: %u)</translation>
+ </message>
+ <message>
+ <source>Activating best chain...</source>
+ <translation>Aktiverer bedste kæde …</translation>
+ </message>
+ <message>
+ <source>Allow self signed root certificates (default: 0)</source>
+ <translation>Tillad selvsignerede rodcertifikater (standard: 0)</translation>
+ </message>
+ <message>
+ <source>Can't run with a wallet in prune mode.</source>
+ <translation>Kan ikke køre med en tegnebog i beskåret tilstand.</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>Kan ikke løse -whitebind adresse: "%s"</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Vælg datamappe ved opstart (standard: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Forbind gennem SOCKS5-proxy</translation>
</message>
@@ -3139,6 +3205,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Fejl ved indlæsning af wallet.dat: Tegnebog kræver en nyere version af Bitcoin Core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Fejl under læsning fra database; lukker ned.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Fejl: Ikke understøttet argument -tor fundet, brug -onion.</translation>
</message>
@@ -3155,6 +3225,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Sundhedstjek under klargøring mislykkedes. Bitcoin Core lukker ned.</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Ugyldigt beløb for -maxtxfee=&lt;beløb&gt;: "%s"</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Ugyldigt beløb til -minrelaytxfee=&lt;beløb&gt;: "%s"</translation>
</message>
@@ -3171,10 +3245,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ugyldig netmaske angivet i -whitelist: "%s"</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Behold højest &lt;n&gt; uforbindelige blokke i hukommelsen (standard: %u)</translation>
- </message>
- <message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>Behold højest &lt;n&gt; uforbindelige transaktioner i hukommelsen (standard: %u)</translation>
</message>
@@ -3187,10 +3257,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Videresendelsesvalgmuligheder for knude:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Udskriv blok under opstart, hvis den findes i blokindeks</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Tilvalg for RPC SSL: (se Bitcoin Wiki for instruktioner i SSL-opstart)</translation>
</message>
@@ -3199,6 +3265,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Tilvalg for RPC-server:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>RPC-understøttelse for HTTP-persistente forbindelser (standard: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Drop tilfældigt 1 ud af hver &lt;n&gt; netværksbeskeder</translation>
</message>
@@ -3207,6 +3277,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Slør tilfældigt 1 ud af hver &lt;n&gt; netværksbeskeder</translation>
</message>
<message>
+ <source>Rebuild block chain index from current blk000??.dat files on startup</source>
+ <translation>Genopbyg blokkædeindeks fra nuværende blk000??.dat-filer ved opstart</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Send sporings-/fejlsøgningsinformation til konsollen i stedet for debug.log filen</translation>
</message>
@@ -3215,10 +3289,22 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Send transaktioner som nul-gebyr-transaktioner hvis muligt (standard: %u)</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Sæt SSL-rodcertifikater for betalingsanmodning (standard: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Angiv sprog, fx "da_DK" (standard: systemlokalitet)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Vis alle tilvalg for fejlsøgning (brug: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Vis opstartsbillede ved opstart (standard: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Formindsk debug.log filen ved klientopstart (standard: 1 hvis ikke -debug)</translation>
</message>
@@ -3227,6 +3313,14 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Underskrift af transaktion mislykkedes</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Start minimeret</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>Transaktionsbeløbet er for lille til at betale gebyret</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Dette er eksperimentelt software.</translation>
</message>
@@ -3239,10 +3333,18 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Transaktionsbeløb skal være positive</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transaktion for stor til gebyrretningslinjer</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Transaktionen er for stor</translation>
</message>
<message>
+ <source>UI Options:</source>
+ <translation>Indstillinger for brugerflade:</translation>
+ </message>
+ <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation>Ikke i stand til at tildele til %s på denne computer (bind returnerede fejl %s)</translation>
</message>
@@ -3263,10 +3365,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Advarsel</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Advarsel: Denne version er forældet, opgradering påkrævet!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Advarsel: Ikke understøttet argument -benchmark ignoreret, brug -debug=bench.</translation>
</message>
@@ -3335,10 +3433,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Hvor gennemarbejdet blokverificeringen for -checkblocks er (0-4; standard: %u)</translation>
</message>
<message>
- <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
- <translation>Hvis paytxfee ikke er angivet, inkludér da nok gebyr til at transaktioner gennemsnitligt bekræftes inden for n blokke (standard: %u)</translation>
- </message>
- <message>
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
<translation>Prioritet for transaktionslog og gebyr pr. kB under udvinding af blokke (standard: %u)</translation>
</message>
@@ -3415,6 +3509,10 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Oprethold højest &lt;n&gt; forbindelser til andre knuder (standard: %u)</translation>
</message>
<message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>Få tegnebogen til at transmittere transaktioner</translation>
+ </message>
+ <message>
<source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
<translation>Maksimum for modtagelsesbuffer pr. forbindelse, &lt;n&gt;*1000 byte (standard: %u)</translation>
</message>
@@ -3431,10 +3529,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Føj tidsstempel foran fejlsøgningsoutput (standard: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Udskriv bloktræ under opstart (standard: %u)</translation>
- </message>
- <message>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation>Videresend og udvind databærer-transaktioner (standard: %u)</translation>
</message>
@@ -3513,10 +3607,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ugyldigt beløb for -paytxfee=&lt;beløb&gt;: "%s"</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Ugyldigt beløb</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Manglende dækning</translation>
</message>
@@ -3549,10 +3639,6 @@ fx: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Indlæsning gennemført</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>For at bruge %s mulighed</translation>
- </message>
- <message>
<source>Error</source>
<translation>Fejl</translation>
</message>
diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts
index 2804d2d665..ab0367dbab 100644
--- a/src/qt/locale/bitcoin_de.ts
+++ b/src/qt/locale/bitcoin_de.ts
@@ -1,9 +1,9 @@
-<TS language="de" version="2.0">
+<TS language="de" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Doppelklick zum Bearbeiten der Adresse oder der Bezeichnung</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Rechtsklick zum Bearbeiten der Adresse oder der Bezeichnung</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>Passphrase ändern</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Geben Sie die alte und neue Wallet-Passphrase ein.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Wallet-Verschlüsselung bestätigen</translation>
</message>
@@ -172,6 +168,10 @@
<translation>Sind Sie sich sicher, dass Sie Ihre Wallet verschlüsseln möchten?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Bitcoin Core wird jetzt beendet, um den Verschlüsselungsprozess abzuschließen. Vergessen Sie nicht, dass eine Wallet-Verschlüsselung nicht vollständig vor Diebstahl Ihrer Bitcoins durch Schadsoftware schützen kann, die Ihren Computer infiziert.</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>WICHTIG: Alle vorherigen Wallet-Sicherungen sollten durch die neu erzeugte, verschlüsselte Wallet ersetzt werden. Aus Sicherheitsgründen werden vorherige Sicherungen der unverschlüsselten Wallet nutzlos, sobald Sie die neue, verschlüsselte Wallet verwenden.</translation>
</message>
@@ -188,8 +188,8 @@
<translation>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>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin wird jetzt beendet, um den Verschlüsselungsprozess abzuschließen. Bitte beachten Sie, dass die Wallet-Verschlüsselung nicht vollständig vor Diebstahl Ihrer Bitcoins durch Schadprogramme schützt, die Ihren Computer befällt.</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Geben Sie die alte und neue Wallet-Passphrase ein.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -311,10 +311,6 @@
<translation>Bitcoins an eine Bitcoin-Adresse überweisen</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Die Konfiguration des Clients bearbeiten</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Eine Wallet-Sicherungskopie erstellen und abspeichern</translation>
</message>
@@ -403,6 +399,10 @@
<translation>&amp;Über Bitcoin Core</translation>
</message>
<message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Konfiguration von Bitcoin Core bearbeiten</translation>
+ </message>
+ <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Liste verwendeter Zahlungsadressen und Bezeichnungen anzeigen</translation>
</message>
@@ -431,6 +431,10 @@
<translation>Keine Blockquelle verfügbar...</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>%n Block des Transaktionsverlaufs verarbeitet.</numerusform><numerusform>%n Blöcke des Transaktionsverlaufs verarbeitet.</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n Stunde</numerusform><numerusform>%n Stunden</numerusform></translation>
</message>
@@ -483,6 +487,36 @@
<translation>Hole auf...</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation>Datum: %1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation>Betrag: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation>Typ: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>Bezeichnung: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Adresse: %1
+</translation>
+ </message>
+ <message>
<source>Sent transaction</source>
<translation>Gesendete Transaktion</translation>
</message>
@@ -491,17 +525,6 @@
<translation>Eingehende Transaktion</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Datum: %1
-Betrag: %2
-Typ: %3
-Adresse: %4</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Wallet ist &lt;b&gt;verschlüsselt&lt;/b&gt; und aktuell &lt;b&gt;entsperrt&lt;/b&gt;</translation>
</message>
@@ -692,6 +715,18 @@ Adresse: %4</translation>
<translation>keine</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Diese Bezeichnung wird rot, wenn die Transaktion größer als 1000 Byte ist.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Diese Bezeichnung wird rot, wenn die Priorität niedriger als "mittel" ist.</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>Diese Bezeichnung wird rot, wenn irgendein Empfänger einen Betrag kleiner als %1 erhält.</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation>Kann pro Eingabe um +/- %1 Satoshi(s) abweichen.</translation>
</message>
@@ -704,10 +739,6 @@ Adresse: %4</translation>
<translation>nein</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Diese Bezeichnung wird rot, wenn die Transaktion größer als 1000 Byte ist.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Das bedeutet, dass eine Gebühr von mindestens %1 pro kB erforderlich ist.</translation>
</message>
@@ -720,14 +751,6 @@ Adresse: %4</translation>
<translation>Transaktionen mit höherer Priorität haben eine größere Chance in einen Block aufgenommen zu werden.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Diese Bezeichnung wird rot, wenn die Priorität niedriger als "mittel" ist.</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Diese Bezeichnung wird rot, wenn irgendein Empfänger einen Betrag kleiner als %1 erhält.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(keine Bezeichnung)</translation>
</message>
@@ -848,30 +871,6 @@ Adresse: %4</translation>
<source>command-line options</source>
<translation>Kommandozeilenoptionen</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI-Optionen</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Sprache festlegen, z.B. "de_DE" (Standard: Systemstandard)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Minimiert starten</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>SSL-Wurzelzertifikate für Zahlungsanforderungen festlegen (Standard: Systemstandard)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Startbildschirm beim Starten anzeigen (Standard: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Datenverzeichnis beim Starten auswählen (Standard: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -954,14 +953,6 @@ Adresse: %4</translation>
<translation>&amp;Allgemein</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Bitcoin nach der Anmeldung am System automatisch ausführen.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Starte Bitcoin nach Systemanmeldung</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Größe des &amp;Datenbankcaches</translation>
</message>
@@ -986,6 +977,14 @@ Adresse: %4</translation>
<translation>IP-Adresse des Proxies (z.B. IPv4: 127.0.0.1 / IPv6: ::1)</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>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>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>Legt die Sprache der Benutzeroberfläche fest. Diese Einstellung wird erst nach einem Neustart von Bitcoin Core aktiv.</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>Externe URLs (z.B. ein Block-Explorer), die im Kontextmenü des Transaktionsverlaufs eingefügt werden. In der URL wird %s durch den Transaktionshash ersetzt. Bei Angabe mehrerer URLs müssen diese durch "|" voneinander getrennt werden.</translation>
</message>
@@ -1010,6 +1009,14 @@ Adresse: %4</translation>
<translation>&amp;Netzwerk</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>Bitcoin Core nach der Anmeldung am System automatisch starten.</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>&amp;Bitcoin Core nach Systemanmeldung starten</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = automatisch, &lt;0 = so viele Kerne frei lassen)</translation>
</message>
@@ -1074,10 +1081,6 @@ Adresse: %4</translation>
<translation>In den Infobereich anstatt in die Taskleiste &amp;minimieren</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 Quit in the menu.</source>
- <translation>Minimiert die Anwendung anstatt sie zu beenden wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie das Programm über "Beenden" im Menü schließen.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>Beim Schließen m&amp;inimieren</translation>
</message>
@@ -1090,10 +1093,6 @@ Adresse: %4</translation>
<translation>&amp;Sprache der Benutzeroberfläche:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Legt die Sprache der Benutzeroberfläche fest. Diese Einstellung wird erst nach einem Neustart von Bitcoin aktiv.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Einheit der Beträge:</translation>
</message>
@@ -1130,8 +1129,8 @@ Adresse: %4</translation>
<translation>Clientneustart nötig, um die Änderungen zu aktivieren.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Client wird beendet, wollen Sie fortfahren?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>Client wird beendet. Möchten Sie den Vorgang fortsetzen?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1216,10 +1215,6 @@ Adresse: %4</translation>
<source>Current total balance in watch-only addresses</source>
<translation>Aktueller Gesamtbetrag in beobachteten Adressen aus obigen Kategorien</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>nicht synchron</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1240,10 +1235,6 @@ Adresse: %4</translation>
<translation>Netzwerk der Zahlungsanforderung stimmt nicht mit dem Client-Netzwerk überein.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Zahlungsanforderung ist abgelaufen.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>Zahlungsanforderung ist nicht initialisiert.</translation>
</message>
@@ -1276,14 +1267,30 @@ Adresse: %4</translation>
<translation>Zahlungsanforderungsdatei kann nicht gelesen werden! Dies kann durch eine ungültige Zahlungsanforderungsdatei verursacht werden.</translation>
</message>
<message>
+ <source>Payment request expired.</source>
+ <translation>Zahlungsanforderung abgelaufen.</translation>
+ </message>
+ <message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>Unverifizierte Zahlungsanforderungen an benutzerdefinierte Zahlungsskripte werden nicht unterstützt.</translation>
</message>
<message>
+ <source>Invalid payment request.</source>
+ <translation>Ungültige Zahlungsanforderung.</translation>
+ </message>
+ <message>
<source>Refund from %1</source>
<translation>Rücküberweisung von %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>Zahlungsanforderung %1 ist zu groß (%2 Byte, erlaubt sind %3 Byte).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Zahlungsanforderungs-DoS-Schutz</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Kommunikationsfehler mit %1: %2</translation>
</message>
@@ -1311,8 +1318,8 @@ Adresse: %4</translation>
<translation>User-Agent</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adresse/Hostname</translation>
+ <source>Node/Service</source>
+ <translation>Knoten/Dienst</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1346,14 +1353,6 @@ Adresse: %4</translation>
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>NETZWERK</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>UNBEKANNT</translation>
- </message>
- <message>
<source>None</source>
<translation>Keine</translation>
</message>
@@ -1444,6 +1443,10 @@ Adresse: %4</translation>
<translation>Aktuelle Anzahl Blöcke</translation>
</message>
<message>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Öffnet die "Bitcoin Core"-Debugprotokolldatei aus dem aktuellen Datenverzeichnis. Dies kann bei großen Protokolldateien einige Sekunden dauern.</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Empfangen</translation>
</message>
@@ -1512,6 +1515,10 @@ Adresse: %4</translation>
<translation>Pingzeit</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation>Zeitversatz</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Letzte Blockzeit</translation>
</message>
@@ -1552,16 +1559,12 @@ Adresse: %4</translation>
<translation>Debugprotokolldatei</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Öffnet die Bitcoin-Debugprotokolldatei aus dem aktuellen Datenverzeichnis. Dies kann bei großen Protokolldateien einige Sekunden dauern.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Konsole zurücksetzen</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Willkommen in der Bitcoin-RPC-Konsole.</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Willkommen in der "Bitcoin Core"-RPC-Konsole.</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
@@ -1852,14 +1855,6 @@ Adresse: %4</translation>
<translation>Transaktionsgebühreneinstellungen ausblenden</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Minimieren</translation>
- </message>
- <message>
- <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
- <translation>Wenn die benutzerdefinierte Gebühr 1000 Satoshis beträgt und die Transaktion nur 250 Byte groß ist, wird bei Auswahl von "pro Kilobyte" eine Gebühr in Höhe von 250 Satoshis, bei Auswahl von "Mindestbetrag" eine Gebühr in Höhe von 1000 Satoshis bezahlt. Bei Transaktionen die Größer als ein Kilobyte sind, werden bei beiden Optionen die Gebühren pro Kilobyte bezahlt.</translation>
- </message>
- <message>
<source>per kilobyte</source>
<translation>pro Kilobyte</translation>
</message>
@@ -1868,6 +1863,10 @@ Adresse: %4</translation>
<translation>Wenn die benutzerdefinierte Gebühr 1000 Satoshis beträgt und die Transaktion nur 250 Byte groß ist, wird bei Auswahl von "pro Kilobyte" eine Gebühr in Höhe von 250 Satoshis, bei Auswahl von "Mindestbetrag" eine Gebühr in Höhe von 1000 Satoshis bezahlt. Bei Transaktionen die Größer als ein Kilobyte sind, werden bei beiden Optionen die Gebühren pro Kilobyte bezahlt.</translation>
</message>
<message>
+ <source>Hide</source>
+ <translation>Ausblenden</translation>
+ </message>
+ <message>
<source>total at least</source>
<translation>Mindestbetrag</translation>
</message>
@@ -1988,10 +1987,6 @@ Adresse: %4</translation>
<translation>oder</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Die Zahlungsadresse ist ungültig, bitte nochmals überprüfen.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Der zu zahlende Betrag muss größer als 0 sein.</translation>
</message>
@@ -2004,10 +1999,6 @@ Adresse: %4</translation>
<translation>Der angegebene Betrag übersteigt aufgrund der Transaktionsgebühr in Höhe von %1 Ihren Kontostand.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Doppelte Zahlungsadresse gefunden, pro Überweisung kann an jede Adresse nur einmalig etwas überwiesen werden.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Transaktionserstellung fehlgeschlagen!</translation>
</message>
@@ -2016,16 +2007,28 @@ Adresse: %4</translation>
<translation>Die Transaktion wurde abgelehnt! Dies kann passieren, wenn einige Bitcoins aus Ihrer Wallet bereits ausgegeben wurden. Beispielsweise weil Sie eine Kopie Ihrer wallet.dat genutzt, die Bitcoins dort ausgegeben haben und dies daher in der derzeit aktiven Wallet nicht vermerkt ist.</translation>
</message>
<message>
- <source>A fee higher than %1 is considered an insanely high fee.</source>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation>Eine höhere Gebühr als %1 wird als unsinnig hohe Gebühr angesehen.</translation>
</message>
<message>
+ <source>Payment request expired.</source>
+ <translation>Zahlungsanforderung abgelaufen.</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation><numerusform>Voraussichtlicher Beginn der Bestätigung innerhalb von %n Block.</numerusform><numerusform>Voraussichtlicher Beginn der Bestätigung innerhalb von %n Blöcken.</numerusform></translation>
+ </message>
+ <message>
<source>Pay only the minimum fee of %1</source>
<translation>Nur die minimale Gebühr in Höhe von %1 zahlen</translation>
</message>
<message>
- <source>Estimated to begin confirmation within %1 block(s).</source>
- <translation>Voraussichtlicher Beginn der Bestätigung innerhalb von %1 Blöcken.</translation>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>Die Zahlungsadresse ist ungültig, bitte nochmals überprüfen.</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation>Doppelte Adresse entdeckt: Adressen dürfen jeweils nur einmal vorkommen.</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
@@ -2099,12 +2102,24 @@ Adresse: %4</translation>
<translation>Diesen Eintrag entfernen</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>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>Gebühr vom Betrag ab&amp;ziehen</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Nachricht:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Dies is eine verifizierte Zahlungsanforderung.</translation>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>Dies ist keine beglaubigte Zahlungsanforderung.</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>Dies ist eine beglaubigte Zahlungsanforderung.</translation>
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
@@ -2115,10 +2130,6 @@ Adresse: %4</translation>
<translation>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>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Dies is eine unverifizierte Zahlungsanforderung.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Empfänger:</translation>
</message>
@@ -2149,8 +2160,8 @@ Adresse: %4</translation>
<translation>Nachricht &amp;signieren</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Sie können Nachrichten mit Ihren Adressen signieren, um den Besitz dieser Adressen zu beweisen. Bitte nutzen Sie diese Funktion mit Vorsicht und nehmen Sie sich vor Phishingangriffen in Acht. Signieren Sie nur Nachrichten, mit denen Sie vollständig einverstanden sind.</translation>
+ <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>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>
@@ -2205,8 +2216,8 @@ Adresse: %4</translation>
<translation>Nachricht &amp;verifizieren</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Geben Sie die signierende Adresse, 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.</translation>
+ <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>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 beweißt, dass die signierende Partei über diese Adresse Überweisungen empfangen kann.</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
@@ -2472,10 +2483,6 @@ Adresse: %4</translation>
<translation>Typ</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Unreif (%1 Bestätigungen, wird verfügbar sein nach %2)</translation>
</message>
@@ -2504,6 +2511,10 @@ Adresse: %4</translation>
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Bezeichnung</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Unbestätigt</translation>
</message>
@@ -2560,8 +2571,8 @@ Adresse: %4</translation>
<translation>Zeigt an, ob eine beobachtete Adresse in diese Transaktion involviert ist.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Zieladresse der Transaktion.</translation>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation>Benutzerdefinierte Absicht bzw. Verwendungszweck der Transaktion</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2802,34 +2813,14 @@ Adresse: %4</translation>
<translation>Eingehende Verbindungen annehmen (Standard: 1, wenn nicht -proxy oder -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, Sie müssen den Wert rpcpasswort in dieser Konfigurationsdatei angeben:
-%s
-Es wird empfohlen das folgende Zufallspasswort zu verwenden:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(Sie müssen sich dieses Passwort nicht merken!)
-Der Benutzername und das Passwort dürfen NICHT identisch sein.
-Falls die Konfigurationsdatei nicht existiert, erzeugen Sie diese bitte mit Leserechten nur für den Dateibesitzer.
-Es wird ebenfalls empfohlen alertnotify anzugeben, um im Problemfall benachrichtig zu werden;
-zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>An die angegebene Adresse binden und immer abhören. Für IPv6 "[Host]:Port"-Notation verwenden</translation>
</message>
<message>
+ <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default: %u)</source>
+ <translation>Durchgehend die Anzahl freier Transaktionen auf &lt;n&gt; * 1000 Byte pro Minute begrenzen (Standard: %u)</translation>
+ </message>
+ <message>
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
<translation>Alle Wallet-Transaktionen löschen und nur diese Teilbereiche der Blockkette durch -rescan beim Starten wiederherstellen</translation>
</message>
@@ -2842,14 +2833,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Regressionstest-Modus aktivieren, der eine spezielle Blockkette nutzt, in der Blöcke sofort gelöst werden können.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Fehler: Die Transaktion wurde abgelehnt! Dies kann passieren, wenn einige Bitcoins aus Ihrer Wallet bereits ausgegeben wurden. Beispielsweise weil Sie eine Kopie Ihrer wallet.dat genutzt, die Bitcoins dort ausgegeben haben und dies daher in der derzeit aktiven Wallet nicht vermerkt ist.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Fehler: Diese Transaktion benötigt aufgrund Ihres Betrags, Ihrer Komplexität oder der Nutzung erst kürzlich erhaltener Zahlungen eine Transaktionsgebühr in Höhe von mindestens %s!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Befehl ausführen wenn sich eine Wallet-Transaktion verändert (%s im Befehl wird durch die Transaktions-ID ersetzt)</translation>
</message>
@@ -2858,6 +2841,14 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>In diesem Modus legt -genproclimit fest, wie viele Blöcke sofort erzeugt werden.</translation>
</message>
<message>
+ <source>Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Maximale Gesamtgebühren je Wallet-Transaktion, ein zu niedriger Wert kann große Transaktionen abbrechen (Standard: %s)</translation>
+ </message>
+ <message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, &gt;%u = target size in MiB to use for block files)</source>
+ <translation>Speicherplatzanforderung durch kürzen (löschen) alter Blöcke reduzieren. Dieser Modus deaktiviert die Wallet-Unterstützung und ist nicht mit -txindex kompatibel. Warnung: Die Umkehr dieser Einstellung erfordert das erneute Herunterladen der gesamten Blockkette. (Standard: 0 = deaktiviert das Kürzen von Blöcken, &gt;%u = Zielgröße in MiB, die für Blockdateien verwendet werden darf)</translation>
+ </message>
+ <message>
<source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
<translation>Maximale Anzahl an Skript-Verifizierungs-Threads festlegen (%u bis %d, 0 = automatisch, &lt;0 = so viele Kerne frei lassen, Standard: %d)</translation>
</message>
@@ -2926,10 +2917,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Debugging-/Testoptionen:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Eigene IP-Adresse erkennen (Standard: 1, wenn abgehört wird und nicht -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Die Wallet nicht laden und Wallet-RPC-Aufrufe deaktivieren</translation>
</message>
@@ -2962,10 +2949,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Fehler: Zu wenig freier Speicherplatz auf dem Datenträger!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Fehler: Wallet gesperrt, Transaktion kann nicht erstellt werden!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Fehler, es konnte kein Port abgehört werden. Wenn dies so gewünscht wird -listen=0 verwenden.</translation>
</message>
@@ -2994,8 +2977,12 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Nur zu Knoten des Netzwerktyps &lt;net&gt; verbinden (ipv4, ipv6 oder onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Blockkettenindex aus aktuellen Dateien blk000??.dat wiederaufbauen</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>Kürzungsmodus kann nicht mit einem negativen Wert konfiguriert werden.</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Kürzungsmodus ist nicht mit -txindex kompatibel.</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -3034,6 +3021,10 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Wallet-Optionen:</translation>
</message>
<message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>Warnung: Diese Version is veraltet, Aktualisierung erforderlich!</translation>
+ </message>
+ <message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>Sie müssen die Datenbank mit Hilfe von -reindex neu aufbauen, um -txindex zu verändern</translation>
</message>
@@ -3062,14 +3053,14 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Datenverzeichnis %s kann nicht gesperrt werden, da Bitcoin Core wahrscheinlich bereits gestartet wurde.</translation>
</message>
<message>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
- <translation>Anzahl der freien Transaktionen auf &lt;n&gt; * 1000 Byte pro Minute begrenzen (Standard: %u)</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Neue Dateien mit Standard-Systemrechten erzeugen, anstatt mit umask 077 (nur mit deaktivierter Walletfunktion nutzbar)</translation>
</message>
<message>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Eigene IP-Adressen ermitteln (Standard: 1, wenn abgehört wird und nicht -externalip oder -proxy)</translation>
+ </message>
+ <message>
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
<translation>Fehler: Abhören nach eingehenden Verbindungen fehlgeschlagen (listen meldete Fehler %s)</translation>
</message>
@@ -3090,14 +3081,34 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Niedrigere Gebühren (in BTC/Kb) als diese werden bei der Transaktionserstellung als gebührenfrei angesehen (Standard: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Wenn -paytxfee nicht festgelegt wurde Gebühren einschließen, so dass mit der Bestätigung von Transaktionen im Schnitt innerhalb von n Blöcken begonnen wird (Standard: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Ungültiger Betrag für -maxtxfee=&lt;amount&gt;: '%s' (muss mindestens die minimale Weiterleitungsgebühr in Höhe von %s sein, um zu verhindern dass Transaktionen nicht bearbeitet werden)</translation>
+ </message>
+ <message>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation>Maximale Datengröße in "Data Carrier"-Transaktionen die weitergeleitet und erarbeitet werden (Standard: %u)</translation>
</message>
<message>
+ <source>Prune configured below the minimum of %d MB. Please use a higher number.</source>
+ <translation>Kürzungsmodus wurde kleiner als das Minimum in Höhe von %d MiB konfiguriert. Bitte verwenden Sie einen größeren Wert.</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Adressen von Gegenstellen via DNS-Namensauflösung finden, falls zu wenige Adressen verfügbar sind (Standard: 1, außer bei -connect)</translation>
</message>
<message>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>Zufällige Anmeldedaten für jede Proxyverbindung verwenden. Dies aktiviert Tor-Datenflussisolation (Standard: %u)</translation>
+ </message>
+ <message>
+ <source>Require high priority for relaying free or low-fee transactions (default: %u)</source>
+ <translation>Hohe Priorität zum Weiterleiten von freien bzw. Transaktionen mit niedrigen Gebühren voraussetzen (Standard: %u)</translation>
+ </message>
+ <message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation>Maximale Größe in Byte von "high-priority/low-fee"-Transaktionen festlegen (Standard: %d)</translation>
</message>
@@ -3106,10 +3117,42 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Maximale Anzahl an Threads zur Bitcoinerzeugung, wenn aktiviert, festlegen (-1 = alle Kerne, Standard: %d)</translation>
</message>
<message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>Der Transaktionsbetrag ist zum senden zu niedrig, nachdem die Gebühr abgezogen wurde.</translation>
+ </message>
+ <message>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation>Dieses Produkt enthält Software, die vom OpenSSL-Projekt zur Verwendung im OpenSSL-Toolkit &lt;https://www.openssl.org/&gt; entwickelt wird, sowie von Eric Young geschriebene kryptographische Software und von Thomas Bernard geschriebene UPnP-Software.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>Um bitcoind oder die Option -server mit bitcoin-qt verwenden zu können, müssen Sie rpcpassword in der Konfigurationsdatei angeben:
+%s
+Es wird empfohlen das folgende Zufallspasswort zu verwenden.
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(Sie müssen sich dieses Passwort nicht merken!)
+Der Benutzername und das Passwort dürfen NICHT identisch sein.
+Falls die Konfigurationsdatei nicht existiert, erzeugen Sie diese bitte mit Leserechten nur für den Dateibesitzer.
+Es wird ebenfalls empfohlen alertnotify anzugeben, um im Problemfall benachrichtigt zu werden.
+Beispiel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Warnung: -maxtxfee ist auf einen sehr hohen Wert festgelegt! Gebühren dieser Höhe könnten für eine einzelne Transaktion bezahlt werden.</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Warnung: Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da Bitcoin Core ansonsten nicht ordnungsgemäß funktionieren wird.</translation>
</message>
@@ -3118,10 +3161,38 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Erlaubte Gegenstellen werden nicht für DoS-Attacken gesperrt und ihre Transkationen werden immer weitergeleitet, auch wenn sie sich bereits im Speicherpool befinden, was z.B. für Gateways sinnvoll ist.</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>Sie müssen die Datenbank mit Hilfe von -reindex neu aufbauen, um zum ungekürzten Modus zurückzukehren. Dies erfordert, dass die gesamte Blockkette erneut heruntergeladen wird.</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(Standard: %u)</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Öffentliche REST-Anfragen annehmen (Standard: %u)</translation>
+ </message>
+ <message>
+ <source>Activating best chain...</source>
+ <translation>Aktiviere beste Blockkette...</translation>
+ </message>
+ <message>
+ <source>Allow self signed root certificates (default: 0)</source>
+ <translation>Selbstunterschriebene Stammzertifikate erlauben (Standard: 0)</translation>
+ </message>
+ <message>
+ <source>Can't run with a wallet in prune mode.</source>
+ <translation>Eine Wallet kann im Kürzungsmodus nicht verwendet werden.</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>Kann Adresse in -whitebind nicht auflösen: '%s'</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Datenverzeichnis beim Starten auswählen (Standard: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Über einen SOCKS5-Proxy &amp;verbinden</translation>
</message>
@@ -3138,6 +3209,10 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Fehler beim Laden von wallet.dat: Wallet benötigt neuere Version von Bitcoin Core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Fehler beim lesen der Datenbank, Ausführung wird beendet.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Fehler: Nicht unterstütztes Argument -tor gefunden, bitte -onion verwenden.</translation>
</message>
@@ -3154,6 +3229,10 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Initialisierungsplausibilitätsprüfung fehlgeschlagen. Bitcoin Core wird beendet.</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Ungültiger Betrag für -maxtxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Ungültiger Betrag für -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
</message>
@@ -3170,10 +3249,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Ungültige Netzmaske angegeben in -whitelist: '%s'</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Maximal &lt;n&gt; nicht-verbindbare Blöcke im Speicher halten (Standard: %u)</translation>
- </message>
- <message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>Maximal &lt;n&gt; nicht-verbindbare Transaktionen im Speicher halten (Standard: %u)</translation>
</message>
@@ -3186,10 +3261,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Knoten-Weiterleitungsoptionen:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Block beim Starten ausgeben, wenn dieser im Blockindex gefunden wurde.</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>RPC-SSL-Optionen (siehe Bitcoin-Wiki für SSL-Einrichtung):</translation>
</message>
@@ -3198,6 +3269,10 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>RPC-Serveroptionen:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>Unterstützung für persistente HTTP-Verbindungen bei RPC (Standard: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Zufällig eine von &lt;n&gt; Netzwerknachrichten verwerfen</translation>
</message>
@@ -3206,6 +3281,10 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Zufällig eine von &lt;n&gt; Netzwerknachrichten verwürfeln</translation>
</message>
<message>
+ <source>Rebuild block chain index from current blk000??.dat files on startup</source>
+ <translation>Blockkettenindex aus aktuellen Dateien blk000??.dat beim Starten wiederaufbauen</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Rückverfolgungs- und Debuginformationen an die Konsole senden, anstatt sie in debug.log zu schreiben</translation>
</message>
@@ -3214,10 +3293,22 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Transaktionen, wenn möglich, als gebührenfreie Transaktion senden (Standard: %u)</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>SSL-Wurzelzertifikate für Zahlungsanforderungen festlegen (Standard: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Sprache festlegen, z.B. "de_DE" (Standard: Systemstandard)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Zeige alle Debuggingoptionen (Benutzung: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Startbildschirm beim Starten anzeigen (Standard: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Protokolldatei debug.log beim Starten des Clients kürzen (Standard: 1, wenn kein -debug)</translation>
</message>
@@ -3226,6 +3317,14 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Signierung der Transaktion fehlgeschlagen</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Minimiert starten</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>Der Transaktionsbetrag ist zu niedrig, um die Gebühr zu bezahlen.</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Dies ist experimentelle Software.</translation>
</message>
@@ -3238,10 +3337,18 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Transaktionsbeträge müssen positiv sein</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transaktion ist für die Gebührenrichtlinie zu groß</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Transaktion zu groß</translation>
</message>
<message>
+ <source>UI Options:</source>
+ <translation>Benutzeroberflächenoptionen:</translation>
+ </message>
+ <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation>Kann auf diesem Computer nicht an %s binden (bind meldete Fehler %s)</translation>
</message>
@@ -3262,10 +3369,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Warnung</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Warnung: Diese Version is veraltet, Aktualisierung erforderlich!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Warnung: Nicht unterstütztes Argument -benchmark wurde ignoriert, bitte -debug=bench verwenden.</translation>
</message>
@@ -3334,10 +3437,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Legt fest, wie gründlich die Blockverifikation von -checkblocks ist (0-4, Standard: %u)</translation>
</message>
<message>
- <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
- <translation>Wenn keine Transaktionsgebühr festgelegt wurde eine Gebühr einbeziehen, sodass Transaktionen im Schnitt innerhalb von &lt;n&gt; Blöcken bestätigt werden (Standard: %u)</translation>
- </message>
- <message>
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
<translation>Transaktionspriorität und Gebühr pro kB beim Erzeugen von Blöcken protokollieren (Standard: %u)</translation>
</message>
@@ -3410,6 +3509,10 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Maximal &lt;n&gt; Verbindungen zu Gegenstellen aufrechterhalten (Standard: %u)</translation>
</message>
<message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>Die Wallet soll Transaktionen übertragen/broadcasten</translation>
+ </message>
+ <message>
<source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
<translation>Maximale Größe des Empfangspuffers pro Verbindung, &lt;n&gt; * 1000 Byte (Standard: %u)</translation>
</message>
@@ -3426,10 +3529,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Debugausgaben einen Zeitstempel voranstellen (Standard: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Blockbaum beim Starten ausgeben (Standard: %u)</translation>
- </message>
- <message>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation>"Data Carrier"-Transaktionen weiterleiten und erarbeiten (Standard: %u)</translation>
</message>
@@ -3506,10 +3605,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Ungültiger Betrag für -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Ungültiger Betrag</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Unzureichender Kontostand</translation>
</message>
@@ -3542,10 +3637,6 @@ zum Beispiel: alertnotify=echo %%s | mail -s \"Bitcoin Alert\" admin@foo.com
<translation>Laden abgeschlossen</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Zur Nutzung der %s-Option</translation>
- </message>
- <message>
<source>Error</source>
<translation>Fehler</translation>
</message>
diff --git a/src/qt/locale/bitcoin_el_GR.ts b/src/qt/locale/bitcoin_el_GR.ts
index cf29c222ed..a4c95857ba 100644
--- a/src/qt/locale/bitcoin_el_GR.ts
+++ b/src/qt/locale/bitcoin_el_GR.ts
@@ -1,9 +1,9 @@
-<TS language="el_GR" version="2.0">
+<TS language="el_GR" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Διπλό-κλικ για επεξεργασία της διεύθυνσης ή της ετικέτας</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Δεξί-κλικ για επεξεργασία της διεύθυνσης ή της ετικέτας</translation>
</message>
<message>
<source>Create a new address</source>
@@ -11,7 +11,7 @@
</message>
<message>
<source>&amp;New</source>
- <translation>&amp;Νέα</translation>
+ <translation>&amp;Νέo</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
@@ -91,7 +91,7 @@
</message>
<message>
<source>Exporting Failed</source>
- <translation>Η εξαγωγή απέτυχε</translation>
+ <translation>Η Εξαγωγή Απέτυχε</translation>
</message>
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
@@ -102,7 +102,7 @@
<name>AddressTableModel</name>
<message>
<source>Label</source>
- <translation>Ετικέτα</translation>
+ <translation>Επιγραφή</translation>
</message>
<message>
<source>Address</source>
@@ -156,10 +156,6 @@
<translation>Άλλαξε κωδικο πρόσβασης</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Εισάγετε τον παλιό και τον νεο κωδικο στο πορτοφολι.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Επιβεβαίωσε την κρυπτογραφηση του πορτοφολιού</translation>
</message>
@@ -189,10 +185,6 @@
<translation>Εισάγετε τον νέο κωδικό πρόσβασης στον πορτοφόλι &lt;br/&gt; Παρακαλώ χρησιμοποιείστε ένα κωδικό με &lt;b&gt; 10 ή περισσότερους τυχαίους χαρακτήρες&lt;/b&gt; ή &lt;b&gt; οχτώ ή παραπάνω λέξεις&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Το Bitcoin θα κλεισει τώρα για να τελειώσει την διαδικασία κρυπτογραφησης. Θυμησου ότι κρυπτογραφώντας το πορτοφολι σου δεν μπορείς να προστατέψεις πλήρως τα bitcoins σου από κλοπή στην περίπτωση όπου μολυνθεί ο υπολογιστής σου με κακόβουλο λογισμικό.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Η κρυπτογραφηση του πορτοφολιού απέτυχε</translation>
</message>
@@ -312,10 +304,6 @@
<translation>Στείλε νομίσματα σε μια διεύθυνση bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Επεργασία ρυθμισεων επιλογών για το Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Δημιουργία αντιγράφου ασφαλείας πορτοφολιού σε άλλη τοποθεσία</translation>
</message>
@@ -423,34 +411,14 @@
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
<translation>Εμφανιση του Bitcoin-Qt μήνυματος βοήθειας για να πάρετε μια λίστα με τις πιθανές επιλογές Bitcoin γραμμής εντολών.</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n ενεργή σύνδεση στο δίκτυο Bitcoin</numerusform><numerusform>%n ενεργές συνδέσεις στο δίκτυο Βitcoin</numerusform></translation>
- </message>
<message>
<source>No block source available...</source>
<translation>Η πηγή του μπλοκ δεν ειναι διαθέσιμη... </translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n ώρες </numerusform><numerusform>%n ώρες </numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n ημέρες </numerusform><numerusform>%n ημέρες </numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n εβδομαδες</numerusform><numerusform>%n εβδομαδες</numerusform></translation>
- </message>
<message>
<source>%1 and %2</source>
<translation>%1 και %2</translation>
</message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation><numerusform>%n έτος</numerusform><numerusform>%n έτη</numerusform></translation>
- </message>
<message>
<source>%1 behind</source>
<translation>%1 πίσω</translation>
@@ -492,18 +460,6 @@
<translation>Εισερχόμενη συναλλαγή</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Ημερομηνία: %1
-Ποσό: %2
-Τύπος: %3
-Διεύθυνση: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Το πορτοφόλι είναι &lt;b&gt;κρυπτογραφημένο&lt;/b&gt; και &lt;b&gt;ξεκλείδωτο&lt;/b&gt;</translation>
</message>
@@ -631,7 +587,7 @@ Address: %4
</message>
<message>
<source>Copy after fee</source>
- <translation>Αντιγραφή ταρίφας</translation>
+ <translation>Αντιγραφή μετα-ταρίφας</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -702,10 +658,6 @@ Address: %4
<translation>όχι</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Η ετικετα γινετε κοκκινη , αν το μεγεθος της συναλαγης ειναι μεγαλητερο απο 1000 bytes.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Ελάχιστο χρεώσιμο ποσό τουλάχιστο %1 ανα kB</translation>
</message>
@@ -714,14 +666,6 @@ Address: %4
<translation>Συναλλαγές με υψηλότερη προτεραιότητα είναι πιο πιθανό να περιλαμβάνονται σε ένα μπλοκ.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Η ετικέτα γίνεται κόκκινη , αν το μέγεθος της συναλαγής είναι μεγαλύτερο απο το ",μεσαίο",</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Η ετικέτα γίνεται κόκκινη , αν ο παραλήπτης παραλάβει ένα ποσό μικρότερο απο %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(χωρίς ετικέτα)</translation>
</message>
@@ -843,30 +787,6 @@ Address: %4
<source>command-line options</source>
<translation>επιλογής γραμμής εντολών</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>επιλογές UI</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Όρισε γλώσσα, για παράδειγμα "de_DE"(προεπιλογή:τοπικές ρυθμίσεις)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Έναρξη ελαχιστοποιημένο</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Ορίστε SSL root certificates για αίτηση πληρωμής (default: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Εμφάνισε την οθόνη εκκίνησης κατά την εκκίνηση(προεπιλογή:1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Επιλογή καταλόγου</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -941,14 +861,6 @@ Address: %4
<translation>&amp;Κύριο</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Αυτόματη εκκίνηση του Bitcoin μετά την εισαγωγή στο σύστημα</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Έναρξη του Βιtcoin κατά την εκκίνηση του συστήματος</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Μέγεθος κρυφής μνήμης βάσης δεδομένων.</translation>
</message>
@@ -973,10 +885,18 @@ Address: %4
<translation>Διεύθυνση IP του διαμεσολαβητή (π.χ. 127.0.0.1 / IPv6: ::1)</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>URLs από τρίτους (π.χ. ένας εξερευνητής μπλοκ) τα οποία εμφανίζονται στην καρτέλα συναλλαγών ως στοιχεία μενού. Το %s στα URL αντικαθιστάται από την τιμή της κατατεμαχισμένης συναλλαγής.</translation>
+ </message>
+ <message>
<source>Third party transaction URLs</source>
<translation>Διευθύνσεις τρίτων συναλλαγών.</translation>
</message>
<message>
+ <source>Active command-line options that override above options:</source>
+ <translation>Ενεργές επιλογές γραμμής-εντολών που παρακάμπτουν τις παραπάνω επιλογές:</translation>
+ </message>
+ <message>
<source>Reset all client options to default.</source>
<translation>Επαναφορα όλων των επιλογων του πελάτη σε default.</translation>
</message>
@@ -989,6 +909,10 @@ Address: %4
<translation>&amp;Δίκτυο</translation>
</message>
<message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation>(0 = αυτόματο, &lt;0 = ελεύθεροι πυρήνες)</translation>
+ </message>
+ <message>
<source>W&amp;allet</source>
<translation>Π&amp;ορτοφόλι</translation>
</message>
@@ -1001,6 +925,14 @@ Address: %4
<translation>Επιλογή κατα πόσο να αναδείχνονται οι δυνατότητες ελέγχου κερμάτων.</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>Εάν απενεργοποιήσετε το ξόδεμα μη επικυρωμένων ρέστων, τα ρέστα από μια συναλλαγή δεν μπορούν να χρησιμοποιηθούν έως ότου αυτή η συναλλαγή έχει έστω μια επικύρωση. Αυτό επίσης επηρεάζει το πως υπολογίζεται το υπόλοιπό σας.</translation>
+ </message>
+ <message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation>&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>Αυτόματο άνοιγμα των θυρών Bitcoin στον δρομολογητή. Λειτουργεί μόνο αν ο δρομολογητής σας υποστηρίζει τη λειτουργία UPnP.</translation>
</message>
@@ -1041,10 +973,6 @@ Address: %4
<translation>&amp;Ελαχιστοποίηση στην περιοχή ειδοποιήσεων αντί της γραμμής εργασιών</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 Quit in the menu.</source>
- <translation>Ελαχιστοποίηση αντί για έξοδο κατά το κλείσιμο του παραθύρου</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>Ε&amp;λαχιστοποίηση κατά το κλείσιμο</translation>
</message>
@@ -1057,10 +985,6 @@ Address: %4
<translation>Γλώσσα περιβάλλοντος εργασίας: </translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Εδώ μπορεί να ρυθμιστεί η γλώσσα διεπαφής χρήστη. Αυτή η ρύθμιση θα ισχύσει μετά την επανεκκίνηση του Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Μονάδα μέτρησης:</translation>
</message>
@@ -1070,7 +994,8 @@ Address: %4
</message>
<message>
<source>Whether to show coin control features or not.</source>
- <translation>Επιλογή κατα πόσο να αναδείχνονται οι δυνατότητες ελέγχου κερμάτων.</translation>
+ <translation>Επιλογή κατα πόσο να αναδείχνονται οι δυνατότητες ελέγχου κερμάτων.
+</translation>
</message>
<message>
<source>&amp;OK</source>
@@ -1097,10 +1022,6 @@ Address: %4
<translation>Χρειάζεται επανεκκίνηση του προγράμματος για να ενεργοποιηθούν οι αλλαγές.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Η εφαρμογή θα τερματιστεί. Θέλετε να προχωρήσετε;</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Η αλλαγή αυτή θα χρειαστεί επανεκκίνηση του προγράμματος</translation>
</message>
@@ -1160,6 +1081,10 @@ Address: %4
<translation>Το τρέχον συνολικό υπόλοιπο</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation>Το τρέχον υπόλοιπο σας σε διευθύνσεις παρακολούθησης μόνο</translation>
+ </message>
+ <message>
<source>Spendable:</source>
<translation>Ξοδεμένα:</translation>
</message>
@@ -1168,8 +1093,16 @@ Address: %4
<translation>Πρόσφατες συναλλαγές</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>εκτός συγχρονισμού</translation>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation>Μη επικυρωμένες συναλλαγές σε διευθύνσεις παρακολούθησης μόνο</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation>Εξορυγμένο υπόλοιπο σε διευθύνσεις παρακολούθησης μόνο που δεν έχει ωριμάσει ακόμα</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation>Το τρέχον συνολικό υπόλοιπο σε διευθύνσεις παρακολούθησης μόνο</translation>
</message>
</context>
<context>
@@ -1187,14 +1120,14 @@ Address: %4
<translation>Η αίτηση πληρωμής έχει αρνηθεί.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Η αίτηση πληρωμής έχει λήξει.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>Η αίτηση πληρωμής δεν έχει αρχίζει ακόμα.</translation>
</message>
<message>
+ <source>Requested payment amount of %1 is too small (considered dust).</source>
+ <translation>Το ζητούμενο ποσό πληρωμής του %1 είναι πολύ μικρό (θεωρείται σκόνη)</translation>
+ </message>
+ <message>
<source>Payment request error</source>
<translation>Σφάλμα αιτήματος πληρωμής</translation>
</message>
@@ -1215,6 +1148,18 @@ Address: %4
<translation>Επιστροφή ποσού από %1</translation>
</message>
<message>
+ <source>Error communicating with %1: %2</source>
+ <translation>Σφάλμα επικοινωνίας με %1: %2</translation>
+ </message>
+ <message>
+ <source>Payment request cannot be parsed!</source>
+ <translation>Η αίτηση πληρωμής δεν μπορεί να αναλυθεί!</translation>
+ </message>
+ <message>
+ <source>Bad response from server %1</source>
+ <translation>Κακή απάντηση από διακομιστή %1</translation>
+ </message>
+ <message>
<source>Payment acknowledged</source>
<translation>Πληρωμή αναγνωρίστηκε</translation>
</message>
@@ -1226,10 +1171,6 @@ Address: %4
<context>
<name>PeerTableModel</name>
<message>
- <source>Address/Hostname</source>
- <translation>Διεύθυθνση/Όνομα υπολογιστή</translation>
- </message>
- <message>
<source>Ping Time</source>
<translation>Χρόνος καθυστέρησης</translation>
</message>
@@ -1261,14 +1202,6 @@ Address: %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>Δίκτυο</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>Άγνωστο(α)</translation>
- </message>
- <message>
<source>None</source>
<translation>Κανένα</translation>
</message>
@@ -1331,6 +1264,10 @@ Address: %4
<translation>Χρησιμοποιηση της OpenSSL εκδοσης</translation>
</message>
<message>
+ <source>Using BerkeleyDB version</source>
+ <translation>Χρήση BerkeleyDB έκδοσης</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Χρόνος εκκίνησης</translation>
</message>
@@ -1359,6 +1296,18 @@ Address: %4
<translation>Παραλήφθησαν</translation>
</message>
<message>
+ <source>Sent</source>
+ <translation>Αποστολή</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation>&amp;Χρήστες</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>Επιλέξτε ένα χρήστη για να δείτε αναλυτικές πληροφορίες.</translation>
+ </message>
+ <message>
<source>Version</source>
<translation>Έκδοση</translation>
</message>
@@ -1367,6 +1316,38 @@ Address: %4
<translation>Υπηρεσίες</translation>
</message>
<message>
+ <source>Starting Height</source>
+ <translation>Αρχικό ύψος</translation>
+ </message>
+ <message>
+ <source>Sync Height</source>
+ <translation>Ύψος συγχονισμού</translation>
+ </message>
+ <message>
+ <source>Ban Score</source>
+ <translation>Σκορ αποκλησμού</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation>Χρόνος σύνδεσης</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation>Τελευταία αποστολή</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation>Τελευταία λήψη</translation>
+ </message>
+ <message>
+ <source>Bytes Sent</source>
+ <translation>Σταλθέντα bytes</translation>
+ </message>
+ <message>
+ <source>Bytes Received</source>
+ <translation>Ληφθέντα bytes</translation>
+ </message>
+ <message>
<source>Ping Time</source>
<translation>Χρόνος καθυστέρησης</translation>
</message>
@@ -1411,18 +1392,10 @@ Address: %4
<translation>Αρχείο καταγραφής εντοπισμού σφαλμάτων </translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Ανοίξτε το αρχείο καταγραφής εντοπισμού σφαλμάτων από τον τρέχοντα κατάλογο δεδομένων. Αυτό μπορεί να πάρει μερικά δευτερόλεπτα για τα μεγάλα αρχεία καταγραφής. </translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Καθαρισμός κονσόλας</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Καλώς ήρθατε στην Bitcoin RPC κονσόλα.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Χρησιμοποιήστε το πάνω και κάτω βέλος για να περιηγηθείτε στο ιστορικο, και &lt;b&gt;Ctrl-L&lt;/b&gt; για εκκαθαριση οθονης.</translation>
</message>
@@ -1466,7 +1439,11 @@ Address: %4
<source>Unknown</source>
<translation>Άγνωστο(α)</translation>
</message>
- </context>
+ <message>
+ <source>Fetching...</source>
+ <translation>Ανάκτηση...</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
@@ -1482,6 +1459,10 @@ Address: %4
<translation>&amp;Μήνυμα:</translation>
</message>
<message>
+ <source>R&amp;euse an existing receiving address (not recommended)</source>
+ <translation>Ε&amp;παναχρησιμοποίηση υπάρχουσας διεύθυνσης λήψης (δεν συνιστάται)</translation>
+ </message>
+ <message>
<source>Clear all fields of the form.</source>
<translation>Καθαρισμός όλων των πεδίων της φόρμας.</translation>
</message>
@@ -1498,6 +1479,10 @@ Address: %4
<translation>Εμφάνιση</translation>
</message>
<message>
+ <source>Remove the selected entries from the list</source>
+ <translation>Αφαίρεση επιλεγμένων καταχωρίσεων από τη λίστα</translation>
+ </message>
+ <message>
<source>Remove</source>
<translation>Αφαίρεση</translation>
</message>
@@ -1525,10 +1510,18 @@ Address: %4
<translation>Αντιγραφη της επιλεγμενης διεύθυνσης στο πρόχειρο του συστηματος</translation>
</message>
<message>
+ <source>Copy &amp;Address</source>
+ <translation>Αντιγραφή &amp;Διεύθυνσης</translation>
+ </message>
+ <message>
<source>&amp;Save Image...</source>
<translation>&amp;Αποθήκευση εικόνας...</translation>
</message>
<message>
+ <source>Request payment to %1</source>
+ <translation>Αίτηση πληρωμής για %1</translation>
+ </message>
+ <message>
<source>Payment information</source>
<translation>Πληροφορίες πληρωμής</translation>
</message>
@@ -1546,7 +1539,7 @@ Address: %4
</message>
<message>
<source>Label</source>
- <translation>Ετικέτα</translation>
+ <translation>Επιγραφή</translation>
</message>
<message>
<source>Message</source>
@@ -1569,7 +1562,7 @@ Address: %4
</message>
<message>
<source>Label</source>
- <translation>Ετικέτα</translation>
+ <translation>Επιγραφή</translation>
</message>
<message>
<source>Message</source>
@@ -1603,6 +1596,10 @@ Address: %4
<translation>Χαρακτηρηστικά επιλογής κερμάτων</translation>
</message>
<message>
+ <source>Inputs...</source>
+ <translation>Εισροές...</translation>
+ </message>
+ <message>
<source>automatically selected</source>
<translation>επιλεγμένο αυτόματα</translation>
</message>
@@ -1639,6 +1636,14 @@ Address: %4
<translation>Ρέστα:</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>Όταν ενεργό, αλλά η διεύθυνση ρέστων είναι κενή ή άκυρη, τα ρέστα θα σταλούν σε μία πρόσφατα δημιουργημένη διεύθυνση.</translation>
+ </message>
+ <message>
+ <source>Custom change address</source>
+ <translation>Προσαρμοσμένη διεύθυνση ρέστων</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation>Τέλος συναλλαγής:</translation>
</message>
@@ -1647,14 +1652,34 @@ Address: %4
<translation>Επιλογή...</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Ελαχιστοποίηση</translation>
+ <source>per kilobyte</source>
+ <translation>ανά kilobyte</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Προτεινόμενο: </translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>Προσαρμογή:</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Χρόνος επικύρωσης:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>κανονικό</translation>
</message>
<message>
<source>fast</source>
<translation>Γρήγορο</translation>
</message>
<message>
+ <source>(confirmation may take longer)</source>
+ <translation>(η επικύρωση ίσως χρειαστεί περισσότερο χρόνο)</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Αποστολή σε πολλούς αποδέκτες ταυτόχρονα</translation>
</message>
@@ -1731,10 +1756,6 @@ Address: %4
<translation>ή</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Η διεύθυνση του αποδέκτη δεν είναι σωστή. Παρακαλώ ελέγξτε ξανά.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Το ποσό πληρωμής πρέπει να είναι μεγαλύτερο από 0.</translation>
</message>
@@ -1747,10 +1768,6 @@ Address: %4
<translation>Το σύνολο υπερβαίνει το υπόλοιπό σας όταν συμπεριληφθεί και η αμοιβή %1</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Βρέθηκε η ίδια διεύθυνση δύο φορές. Επιτρέπεται μία μόνο εγγραφή για κάθε διεύθυνση, σε κάθε διαδικασία αποστολής.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Η δημιουργία της συναλλαγής απέτυχε!</translation>
</message>
@@ -1798,12 +1815,20 @@ Address: %4
<translation>Επιλογή διεύθυνσης που έχει ήδη χρησιμοποιηθεί</translation>
</message>
<message>
+ <source>This is a normal payment.</source>
+ <translation>Αυτή είναι μια απλή πληρωμή.</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation>Η διεύθυνση Bitcoin που θα σταλεί η πληρωμή</translation>
+ </message>
+ <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
<message>
<source>Paste address from clipboard</source>
- <translation>Επικόλληση διεύθυνσης από το πρόχειρο</translation>
+ <translation>Επικόλληση διεύθυνσης από το βιβλίο διευθύνσεων</translation>
</message>
<message>
<source>Alt+P</source>
@@ -1818,6 +1843,10 @@ Address: %4
<translation>Μήνυμα:</translation>
</message>
<message>
+ <source>Enter a label for this address to add it to the list of used addresses</source>
+ <translation>Εισάγεται μία ετικέτα για αυτή την διεύθυνση για να προστεθεί στη λίστα με τις χρησιμοποιημένες διευθύνσεις</translation>
+ </message>
+ <message>
<source>Pay To:</source>
<translation>Πληρωμή σε:</translation>
</message>
@@ -1848,10 +1877,6 @@ Address: %4
<translation>&amp;Υπογραφή Μηνύματος</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Μπορείτε να υπογράφετε μηνύματα με τις διευθύνσεις σας, ώστε ν' αποδεικνύετε πως αυτές σας ανήκουν. Αποφεύγετε να υπογράφετε κάτι αόριστο καθώς ενδέχεται να εξαπατηθείτε. Υπογράφετε μόνο πλήρης δηλώσεις με τις οποίες συμφωνείτε.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>Διεύθυνση Bitcoin που θα σταλεί το μήνυμα</translation>
</message>
@@ -1904,10 +1929,6 @@ Address: %4
<translation>&amp;Επιβεβαίωση μηνύματος</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Πληκτρολογήστε την υπογραφή διεύθυνσης, μήνυμα (βεβαιωθείτε ότι έχετε αντιγράψει τις αλλαγές γραμμής, κενά, tabs, κ.λπ. ακριβώς) και την υπογραφή παρακάτω, για να ελέγξει το μήνυμα. Να είστε προσεκτικοί για να μην διαβάσετε περισσότερα στην υπογραφή ό, τι είναι στην υπογραφή ίδιο το μήνυμα , για να μην εξαπατηθούν από έναν άνθρωπο -in - the-middle επίθεση.</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>Διεύθυνση Bitcoin η οποία το μήνυμα έχει υπογραφεί</translation>
</message>
@@ -2024,10 +2045,6 @@ Address: %4
<source>Status</source>
<translation>Κατάσταση</translation>
</message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, έχει μεταδοθεί μέσω %n κόμβων</numerusform><numerusform>, έχει μεταδοθεί μέσω %n κόμβων</numerusform></translation>
- </message>
<message>
<source>Date</source>
<translation>Ημερομηνία</translation>
@@ -2064,10 +2081,6 @@ Address: %4
<source>Credit</source>
<translation>Πίστωση </translation>
</message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>ωρίμανση σε %n επιπλέον μπλοκ</numerusform><numerusform>ωρίμανση σε %n επιπλέον μπλοκ</numerusform></translation>
- </message>
<message>
<source>not accepted</source>
<translation>μη αποδεκτό</translation>
@@ -2140,10 +2153,6 @@ Address: %4
<source>, has not been successfully broadcast yet</source>
<translation>, δεν έχει ακόμα μεταδοθεί μ' επιτυχία</translation>
</message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Ανοιχτό για %n μπλοκ</numerusform><numerusform>Ανοιχτό για %n μπλοκ</numerusform></translation>
- </message>
<message>
<source>unknown</source>
<translation>άγνωστο</translation>
@@ -2171,14 +2180,6 @@ Address: %4
<translation>Τύπος</translation>
</message>
<message>
- <source>Address</source>
- <translation>Διεύθυνση</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Ανοιχτό για %n μπλοκ</numerusform><numerusform>Ανοιχτό για %n μπλοκ</numerusform></translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Ανοιχτό μέχρι %1</translation>
</message>
@@ -2199,6 +2200,10 @@ Address: %4
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Επιγραφή</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Ανεπιβεβαίωτες</translation>
</message>
@@ -2208,7 +2213,7 @@ Address: %4
</message>
<message>
<source>Received with</source>
- <translation>Παραλαβή με</translation>
+ <translation>Ελήφθη με</translation>
</message>
<message>
<source>Received from</source>
@@ -2216,7 +2221,7 @@ Address: %4
</message>
<message>
<source>Sent to</source>
- <translation>Αποστολή προς</translation>
+ <translation>Απεστάλη προς</translation>
</message>
<message>
<source>Payment to yourself</source>
@@ -2247,10 +2252,6 @@ Address: %4
<translation>Είδος συναλλαγής.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Διεύθυνση αποστολής της συναλλαγής.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Ποσό που αφαιρέθηκε ή προστέθηκε στο υπόλοιπο.</translation>
</message>
@@ -2358,6 +2359,10 @@ Address: %4
<translation>Επιτυχής εξαγωγή</translation>
</message>
<message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation>Το ιστορικό συναλλαγών αποθηκεύτηκε επιτυχώς στο %1.</translation>
+ </message>
+ <message>
<source>Comma separated file (*.csv)</source>
<translation>Αρχείο οριοθετημένο με κόμματα (*.csv)</translation>
</message>
@@ -2396,7 +2401,11 @@ Address: %4
</context>
<context>
<name>UnitDisplayStatusBarControl</name>
- </context>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Μονάδα μέτρησης προβολής ποσών. Κάντε κλικ για επιλογή άλλης μονάδας.</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2434,6 +2443,10 @@ Address: %4
<translation>Αποτυχία κατά τη δημιουργία αντιγράφου</translation>
</message>
<message>
+ <source>There was an error trying to save the wallet data to %1.</source>
+ <translation>Παρουσιάστηκε σφάλμα κατά την αποθήκευση των δεδομένων πορτοφολιού στο %1.</translation>
+ </message>
+ <message>
<source>The wallet data was successfully saved to %1.</source>
<translation>Τα δεδομένα πορτοφολιού αποθηκεύτηκαν με επιτυχία στο %1.</translation>
</message>
@@ -2477,41 +2490,12 @@ Address: %4
<translation>Να δέχεσαι συνδέσεις από έξω(προεπιλογή:1)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Αποθηκευση σε συγκεκριμένη διεύθυνση. Χρησιμοποιήστε τα πλήκτρα [Host] : συμβολισμός θύρα για IPv6</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Σφάλμα: Η συναλλαγή απορρίφθηκε.
-Αυτό ίσως οφείλεται στο ότι τα νομίσματά σας έχουν ήδη ξοδευτεί, π.χ. με την αντιγραφή του wallet.dat σε άλλο σύστημα και την χρήση τους εκεί, χωρίς η συναλλαγή να έχει καταγραφεί στο παρόν σύστημα.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Σφάλμα: Αυτή η συναλλαγή απαιτεί αμοιβή συναλλαγής τουλάχιστον %s λόγω του μεγέθους, πολυπλοκότητας ή της χρήσης πρόσφατης παραλαβής κεφαλαίου</translation>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>Εισαγωγή δοκιμαστικής λειτουργίας παλινδρόμησης, που χρησιμοποιεί μια ειδική αλυσίδα στην οποία τα μπλοκ επιλύονται στιγμιαία.</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
@@ -2558,10 +2542,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Εντοπισθηκε διεφθαρμενη βαση δεδομενων των μπλοκ</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Ανακαλύψτε την δικη σας IP διεύθυνση (προεπιλογή: 1 όταν ακούει και δεν - externalip) </translation>
- </message>
- <message>
<source>Do you want to rebuild the block database now?</source>
<translation>Θελετε να δημιουργηθει τωρα η βαση δεδομενων του μπλοκ? </translation>
</message>
@@ -2590,10 +2570,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Προειδοποίηση: Χαμηλός χώρος στο δίσκο </translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Σφάλμα: το πορτοφόλι είναι κλειδωμένο, δεν μπορεί να δημιουργηθεί συναλλαγή</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>ταλαιπωρηθειτε για να ακούσετε σε οποιαδήποτε θύρα. Χρήση - ακούστε = 0 , αν θέλετε αυτό.</translation>
</message>
@@ -2610,14 +2586,18 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Δεν ειναι αρκετες περιγραφες αρχείων διαθέσιμες.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Εισαγωγή μπλοκ από εξωτερικό αρχείο blk000?.dat</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Μόνο σύνδεση σε κόμβους του δικτύου &lt;net&gt; (ipv4, ipv6 ή onion)</translation>
</message>
<message>
<source>Specify wallet file (within data directory)</source>
<translation>Επιλέξτε αρχείο πορτοφολιού (μέσα απο κατάλογο δεδομένων)</translation>
</message>
<message>
+ <source>This is intended for regression testing tools and app development.</source>
+ <translation>Αυτό προορίζεται για εργαλεία δοκιμών παλινδρόμησης και την ανάπτυξη εφαρμογών.</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Επαλήθευση των μπλοκ... </translation>
</message>
@@ -2626,6 +2606,10 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Επαλήθευση πορτοφολιου... </translation>
</message>
<message>
+ <source>Wallet %s resides outside data directory %s</source>
+ <translation>Το πορτοφόλι %s βρίσκεται έξω από το φάκελο δεδομένων %s</translation>
+ </message>
+ <message>
<source>Wallet options:</source>
<translation>Επιλογές πορτοφολιού:</translation>
</message>
@@ -2638,6 +2622,14 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Αδυναμία κλειδώματος του φακέλου δεδομένων %s. Πιθανώς το Bitcoin να είναι ήδη ενεργό.</translation>
</message>
<message>
+ <source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
+ <translation>Προειδοποίηση: Παρακαλώ ελέγξτε ότι η ημερομηνία και ώρα του υπολογιστή σας είναι σωστά ρυθμισμένες! Εάν το ρολόι σας είναι λάθος το Bitcoin Core δεν θα λειτουργήσει σωστά. </translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Επιλογή φακέλου δεδομένων στην εκκίνηση (προεπιλεγμένο: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Σύνδεση μέσω διαμεσολαβητή SOCKS5</translation>
</message>
@@ -2650,6 +2642,10 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Σφάλμα φόρτωσης wallet.dat: Το Πορτοφόλι απαιτεί μια νεότερη έκδοση του Bitcoin</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Σφάλμα ανάγνωσης από τη βάση δεδομένων, γίνεται τερματισμός.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Σφάλμα: Μη συμβατή παράμετρος -tor. Χρησιμοποιήσε την παράμετρο -onion</translation>
</message>
@@ -2658,6 +2654,10 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Πληροφορία</translation>
</message>
<message>
+ <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
+ <translation>Η εκκίνηση ελέγχου ορθότητας απέτυχε. Γίνεται τερματισμός του Bitcoin Core.</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Μη έγκυρο ποσό για την παράμετρο -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
@@ -2666,14 +2666,38 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Μη έγκυρο ποσό για την παράμετρο -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
+ <source>Node relay options:</source>
+ <translation>Επιλογές αναμετάδοσης κόμβου: </translation>
+ </message>
+ <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Ρυθμίσεις SSL: (ανατρέξτε στο Bitcoin Wiki για οδηγίες ρυθμίσεων SSL)</translation>
</message>
<message>
+ <source>RPC server options:</source>
+ <translation>Επιλογές διακομιστή RPC:</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Αποστολή πληροφοριών εντοπισμού σφαλμάτων στην κονσόλα αντί του αρχείου debug.log</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Ορίστε SSL root certificates για αίτηση πληρωμής (default: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Όρισε γλώσσα, για παράδειγμα "de_DE"(προεπιλογή:τοπικές ρυθμίσεις)</translation>
+ </message>
+ <message>
+ <source>Show all debugging options (usage: --help -help-debug)</source>
+ <translation>Προβολή όλων των επιλογών εντοπισμού σφαλμάτων (χρήση: --help -help-debug)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Εμφάνισε την οθόνη εκκίνησης κατά την εκκίνηση(προεπιλογή:1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Συρρίκνωση του αρχείο debug.log κατα την εκκίνηση του πελάτη (προεπιλογή: 1 όταν δεν-debug)</translation>
</message>
@@ -2682,6 +2706,10 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Η υπογραφή συναλλαγής απέτυχε </translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Έναρξη ελαχιστοποιημένο</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Η εφαρμογή είναι σε πειραματικό στάδιο.</translation>
</message>
@@ -2710,10 +2738,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Προειδοποίηση</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Προειδοποίηση: Αυτή η έκδοση είναι ξεπερασμένη, απαιτείται αναβάθμιση </translation>
- </message>
- <message>
<source>Zapping all transactions from wallet...</source>
<translation>Μεταφορά όλων των συναλλαγών απο το πορτοφόλι</translation>
</message>
@@ -2798,10 +2822,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Δεν είναι έγκυρη η διεύθυνση διαμεσολαβητή: '%s'</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Εκτύπωση μπλοκ δέντρου κατά την εκκίνηση (προεπιλογή: %u)</translation>
- </message>
- <message>
<source>Server certificate file (default: %s)</source>
<translation>Αρχείο πιστοποιητικού του διακομιστή (προεπιλογή: %s)</translation>
</message>
@@ -2834,10 +2854,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Μη έγκυρο ποσό για την παράμετρο -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Λάθος ποσότητα</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Ανεπαρκές κεφάλαιο</translation>
</message>
@@ -2870,10 +2886,6 @@ for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Η φόρτωση ολοκληρώθηκε</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Χρήση της %s επιλογής</translation>
- </message>
- <message>
<source>Error</source>
<translation>Σφάλμα</translation>
</message>
diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts
index 71c626be4b..90a13feaca 100644
--- a/src/qt/locale/bitcoin_en.ts
+++ b/src/qt/locale/bitcoin_en.ts
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="en">
+<TS version="2.1" language="en">
<context>
<name>AddressBookPage</name>
<message>
<location filename="../forms/addressbookpage.ui" line="+30"/>
- <source>Double-click to edit address or label</source>
- <translation>Double-click to edit address or label</translation>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
@@ -34,7 +34,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../addressbookpage.cpp" line="+74"/>
+ <location filename="../addressbookpage.cpp" line="+80"/>
<source>&amp;Copy Address</source>
<translation>&amp;Copy Address</translation>
</message>
@@ -127,7 +127,7 @@
<context>
<name>AddressTableModel</name>
<message>
- <location filename="../addresstablemodel.cpp" line="+168"/>
+ <location filename="../addresstablemodel.cpp" line="+170"/>
<source>Label</source>
<translation>Label</translation>
</message>
@@ -195,12 +195,7 @@
<translation>Change passphrase</translation>
</message>
<message>
- <location line="+1"/>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Enter the old and new passphrase to the wallet.</translation>
- </message>
- <message>
- <location line="+45"/>
+ <location line="+46"/>
<source>Confirm wallet encryption</source>
<translation>Confirm wallet encryption</translation>
</message>
@@ -215,7 +210,12 @@
<translation>Are you sure you wish to encrypt your wallet?</translation>
</message>
<message>
- <location line="+15"/>
+ <location line="+11"/>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
<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>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.</translation>
</message>
@@ -237,12 +237,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+80"/>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</translation>
+ <location line="+23"/>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+13"/>
+ <location line="+70"/>
<location line="+7"/>
<location line="+42"/>
<location line="+6"/>
@@ -286,32 +286,32 @@
<context>
<name>BitcoinGUI</name>
<message>
- <location filename="../bitcoingui.cpp" line="+311"/>
+ <location filename="../bitcoingui.cpp" line="+326"/>
<source>Sign &amp;message...</source>
<translation>Sign &amp;message...</translation>
</message>
<message>
- <location line="+339"/>
+ <location line="+342"/>
<source>Synchronizing with network...</source>
<translation>Synchronizing with network...</translation>
</message>
<message>
- <location line="-407"/>
+ <location line="-418"/>
<source>&amp;Overview</source>
<translation>&amp;Overview</translation>
</message>
<message>
- <location line="-129"/>
+ <location line="-134"/>
<source>Node</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+130"/>
+ <location line="+135"/>
<source>Show general overview of wallet</source>
<translation>Show general overview of wallet</translation>
</message>
<message>
- <location line="+20"/>
+ <location line="+28"/>
<source>&amp;Transactions</source>
<translation>&amp;Transactions</translation>
</message>
@@ -321,7 +321,7 @@
<translation>Browse transaction history</translation>
</message>
<message>
- <location line="+19"/>
+ <location line="+23"/>
<source>E&amp;xit</source>
<translation>E&amp;xit</translation>
</message>
@@ -331,13 +331,12 @@
<translation>Quit application</translation>
</message>
<message>
- <location line="+7"/>
- <location line="+2"/>
+ <location line="+6"/>
<source>About &amp;Qt</source>
<translation>About &amp;Qt</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+1"/>
<source>Show information about Qt</source>
<translation>Show information about Qt</translation>
</message>
@@ -377,7 +376,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+172"/>
+ <location line="+175"/>
<source>Bitcoin Core client</source>
<translation type="unfinished"></translation>
</message>
@@ -392,17 +391,12 @@
<translation>Reindexing blocks on disk...</translation>
</message>
<message>
- <location line="-405"/>
+ <location line="-416"/>
<source>Send coins to a Bitcoin address</source>
<translation>Send coins to a Bitcoin address</translation>
</message>
<message>
- <location line="+48"/>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modify configuration options for Bitcoin</translation>
- </message>
- <message>
- <location line="+9"/>
+ <location line="+65"/>
<source>Backup wallet to another location</source>
<translation>Backup wallet to another location</translation>
</message>
@@ -427,32 +421,32 @@
<translation>&amp;Verify message...</translation>
</message>
<message>
- <location line="+437"/>
+ <location line="+439"/>
<source>Bitcoin</source>
<translation>Bitcoin</translation>
</message>
<message>
- <location line="-638"/>
+ <location line="-653"/>
<source>Wallet</source>
<translation>Wallet</translation>
</message>
<message>
- <location line="+138"/>
+ <location line="+143"/>
<source>&amp;Send</source>
<translation>&amp;Send</translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+11"/>
<source>&amp;Receive</source>
<translation>&amp;Receive</translation>
</message>
<message>
- <location line="+32"/>
+ <location line="+40"/>
<source>Show information about Bitcoin Core</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+12"/>
+ <location line="+8"/>
<source>&amp;Show / Hide</source>
<translation>&amp;Show / Hide</translation>
</message>
@@ -477,7 +471,7 @@
<translation>Verify messages to ensure they were signed with specified Bitcoin addresses</translation>
</message>
<message>
- <location line="+48"/>
+ <location line="+49"/>
<source>&amp;File</source>
<translation>&amp;File</translation>
</message>
@@ -497,22 +491,27 @@
<translation>Tabs toolbar</translation>
</message>
<message>
- <location line="-297"/>
+ <location line="-311"/>
<source>Bitcoin Core</source>
<translation type="unfinished">Bitcoin Core</translation>
</message>
<message>
- <location line="+155"/>
+ <location line="+164"/>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+30"/>
+ <location line="+38"/>
<source>&amp;About Bitcoin Core</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+32"/>
+ <location line="+7"/>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+21"/>
<source>Show the list of used sending addresses and labels</source>
<translation type="unfinished"></translation>
</message>
@@ -532,12 +531,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+307"/>
+ <location line="+309"/>
<source>%n active connection(s) to Bitcoin network</source>
<translation>
<numerusform>%n active connection to Bitcoin network</numerusform>
@@ -550,7 +549,15 @@
<translation>No block source available...</translation>
</message>
<message numerus="yes">
- <location line="+36"/>
+ <location line="+9"/>
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation>
+ <numerusform>Processed %n block of transaction history.</numerusform>
+ <numerusform>Processed %n blocks of transaction history.</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <location line="+26"/>
<source>%n hour(s)</source>
<translation>
<numerusform>%n hour</numerusform>
@@ -622,21 +629,43 @@
<source>Up to date</source>
<translation>Up to date</translation>
</message>
- <message numerus="yes">
- <location line="-5"/>
- <source>Processed %n blocks of transaction history.</source>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
- </translation>
- </message>
<message>
- <location line="+49"/>
+ <location line="+44"/>
<source>Catching up...</source>
<translation>Catching up...</translation>
</message>
<message>
- <location line="+126"/>
+ <location line="+129"/>
+ <source>Date: %1
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Amount: %1
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Type: %1
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Label: %1
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Address: %1
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Sent transaction</source>
<translation>Sent transaction</translation>
</message>
@@ -646,20 +675,7 @@
<translation>Incoming transaction</translation>
</message>
<message>
- <location line="+1"/>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</translation>
- </message>
- <message>
- <location line="+68"/>
+ <location line="+62"/>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</translation>
</message>
@@ -672,7 +688,7 @@ Address: %4
<context>
<name>ClientModel</name>
<message>
- <location filename="../clientmodel.cpp" line="+140"/>
+ <location filename="../clientmodel.cpp" line="+141"/>
<source>Network Alert</source>
<translation>Network Alert</translation>
</message>
@@ -775,7 +791,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../coincontroldialog.cpp" line="+44"/>
+ <location filename="../coincontroldialog.cpp" line="+46"/>
<source>Copy address</source>
<translation type="unfinished">Copy address</translation>
</message>
@@ -841,7 +857,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+347"/>
+ <location line="+351"/>
<source>highest</source>
<translation type="unfinished"></translation>
</message>
@@ -896,7 +912,22 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+165"/>
+ <location line="+161"/>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>This label turns red if the priority is smaller than &quot;medium&quot;.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished"></translation>
</message>
@@ -911,12 +942,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+16"/>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
+ <location line="+17"/>
<location line="+5"/>
<source>This means a fee of at least %1 per kB is required.</source>
<translation type="unfinished"></translation>
@@ -932,17 +958,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
- <source>This label turns red, if the priority is smaller than &quot;medium&quot;.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+55"/>
+ <location line="+59"/>
<location line="+61"/>
<source>(no label)</source>
<translation type="unfinished">(no label)</translation>
@@ -1029,7 +1045,7 @@ Address: %4
<context>
<name>FreespaceChecker</name>
<message>
- <location filename="../intro.cpp" line="+68"/>
+ <location filename="../intro.cpp" line="+69"/>
<source>A new data directory will be created.</source>
<translation>A new data directory will be created.</translation>
</message>
@@ -1057,7 +1073,7 @@ Address: %4
<context>
<name>HelpMessageDialog</name>
<message>
- <location filename="../utilitydialog.cpp" line="+31"/>
+ <location filename="../utilitydialog.cpp" line="+33"/>
<source>Bitcoin Core</source>
<translation type="unfinished">Bitcoin Core</translation>
</message>
@@ -1078,7 +1094,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+18"/>
+ <location line="+19"/>
<source>Command-line options</source>
<translation type="unfinished"></translation>
</message>
@@ -1092,36 +1108,6 @@ Address: %4
<source>command-line options</source>
<translation type="unfinished">command-line options</translation>
</message>
- <message>
- <location line="+4"/>
- <source>UI options</source>
- <translation type="unfinished">UI options</translation>
- </message>
- <message>
- <location line="+2"/>
- <source>Set language, for example &quot;de_DE&quot; (default: system locale)</source>
- <translation type="unfinished">Set language, for example &quot;de_DE&quot; (default: system locale)</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Start minimized</source>
- <translation type="unfinished">Start minimized</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Show splash screen on startup (default: 1)</source>
- <translation type="unfinished">Show splash screen on startup (default: 1)</translation>
- </message>
- <message>
- <location line="-4"/>
- <source>Choose data directory on startup (default: 0)</source>
- <translation type="unfinished">Choose data directory on startup (default: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -1228,17 +1214,7 @@ Address: %4
<translation>&amp;Main</translation>
</message>
<message>
- <location line="+6"/>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Automatically start Bitcoin after logging in to the system.</translation>
- </message>
- <message>
- <location line="+3"/>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Start Bitcoin on system login</translation>
- </message>
- <message>
- <location line="+9"/>
+ <location line="+18"/>
<source>Size of &amp;database cache</source>
<translation type="unfinished"></translation>
</message>
@@ -1268,7 +1244,17 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+164"/>
+ <location line="+84"/>
+ <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>
+ <location line="+45"/>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+35"/>
<location line="+13"/>
<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"></translation>
@@ -1299,7 +1285,17 @@ Address: %4
<translation>&amp;Network</translation>
</message>
<message>
- <location line="-85"/>
+ <location line="-153"/>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+65"/>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation type="unfinished"></translation>
</message>
@@ -1379,12 +1375,7 @@ Address: %4
<translation>&amp;Minimize to the tray instead of the taskbar</translation>
</message>
<message>
- <location line="+7"/>
- <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</source>
- <translation>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+10"/>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimize on close</translation>
</message>
@@ -1399,12 +1390,7 @@ Address: %4
<translation>User Interface &amp;language:</translation>
</message>
<message>
- <location line="+13"/>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</translation>
- </message>
- <message>
- <location line="+11"/>
+ <location line="+24"/>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unit to show amounts in:</translation>
</message>
@@ -1429,12 +1415,12 @@ Address: %4
<translation>&amp;Cancel</translation>
</message>
<message>
- <location filename="../optionsdialog.cpp" line="+76"/>
+ <location filename="../optionsdialog.cpp" line="+75"/>
<source>default</source>
<translation>default</translation>
</message>
<message>
- <location line="+60"/>
+ <location line="+59"/>
<source>none</source>
<translation type="unfinished"></translation>
</message>
@@ -1451,7 +1437,7 @@ Address: %4
</message>
<message>
<location line="-29"/>
- <source>Client will be shutdown, do you want to proceed?</source>
+ <source>Client will be shut down. Do you want to proceed?</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -1473,13 +1459,13 @@ Address: %4
<translation>Form</translation>
</message>
<message>
- <location line="+53"/>
- <location line="+372"/>
+ <location line="+59"/>
+ <location line="+386"/>
<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>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.</translation>
</message>
<message>
- <location line="-133"/>
+ <location line="-139"/>
<source>Watch-only:</source>
<translation type="unfinished"></translation>
</message>
@@ -1514,12 +1500,12 @@ Address: %4
<translation>Mined balance that has not yet matured</translation>
</message>
<message>
- <location line="-163"/>
+ <location line="-177"/>
<source>Balances</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+147"/>
+ <location line="+161"/>
<source>Total:</source>
<translation>Total:</translation>
</message>
@@ -1558,17 +1544,11 @@ Address: %4
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../overviewpage.cpp" line="+131"/>
- <location line="+1"/>
- <source>out of sync</source>
- <translation>out of sync</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
<message>
- <location filename="../paymentserver.cpp" line="+410"/>
+ <location filename="../paymentserver.cpp" line="+434"/>
<location line="+14"/>
<location line="+7"/>
<source>URI handling</source>
@@ -1580,49 +1560,46 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+84"/>
+ <location line="+88"/>
<location line="+9"/>
- <location line="+32"/>
+ <location line="+31"/>
+ <location line="+10"/>
+ <location line="+17"/>
<source>Payment request rejected</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-41"/>
+ <location line="-67"/>
<source>Payment request network doesn&apos;t match client network.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+9"/>
- <source>Payment request has expired.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+7"/>
+ <location line="+15"/>
<source>Payment request is not initialized.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+34"/>
+ <location line="+42"/>
<source>Requested payment amount of %1 is too small (considered dust).</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-253"/>
- <location line="+219"/>
- <location line="+34"/>
- <location line="+98"/>
+ <location line="-263"/>
+ <location line="+221"/>
+ <location line="+42"/>
+ <location line="+114"/>
<location line="+14"/>
<location line="+18"/>
<source>Payment request error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-382"/>
+ <location line="-408"/>
<source>Cannot start bitcoin: click-to-pay handler</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+105"/>
+ <location line="+104"/>
<source>Payment request fetch URL is invalid: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -1642,17 +1619,38 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+104"/>
+ <location line="+75"/>
+ <source>Payment request expired.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+32"/>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+58"/>
+ <location line="+9"/>
+ <location line="+17"/>
+ <source>Invalid payment request.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+45"/>
<source>Refund from %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Payment request DoS protection</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
<source>Error communicating with %1: %2</source>
<translation type="unfinished"></translation>
</message>
@@ -1686,7 +1684,7 @@ Address: %4
</message>
<message>
<location line="+0"/>
- <source>Address/Hostname</source>
+ <source>Node/Service</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -1698,17 +1696,17 @@ Address: %4
<context>
<name>QObject</name>
<message>
- <location filename="../bitcoinunits.cpp" line="+196"/>
+ <location filename="../bitcoinunits.cpp" line="+183"/>
<source>Amount</source>
<translation type="unfinished">Amount</translation>
</message>
<message>
- <location filename="../guiutil.cpp" line="+106"/>
+ <location filename="../guiutil.cpp" line="+110"/>
<source>Enter a Bitcoin address (e.g. %1)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+698"/>
+ <location line="+748"/>
<source>%1 d</source>
<translation type="unfinished"></translation>
</message>
@@ -1724,21 +1722,12 @@ Address: %4
</message>
<message>
<location line="+2"/>
+ <location line="+41"/>
<source>%1 s</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
- <source>NETWORK</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+3"/>
- <source>UNKNOWN</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
+ <location line="-10"/>
<source>None</source>
<translation type="unfinished"></translation>
</message>
@@ -1807,11 +1796,12 @@ Address: %4
<location line="+23"/>
<location line="+23"/>
<location line="+23"/>
+ <location line="+23"/>
<source>N/A</source>
<translation>N/A</translation>
</message>
<message>
- <location line="-967"/>
+ <location line="-990"/>
<source>Client version</source>
<translation>Client version</translation>
</message>
@@ -1871,7 +1861,12 @@ Address: %4
<translation>Current number of blocks</translation>
</message>
<message>
- <location line="+303"/>
+ <location line="+72"/>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+231"/>
<source>Received</source>
<translation type="unfinished"></translation>
</message>
@@ -1887,8 +1882,8 @@ Address: %4
</message>
<message>
<location line="+39"/>
- <location filename="../rpcconsole.cpp" line="+236"/>
- <location line="+327"/>
+ <location filename="../rpcconsole.cpp" line="+238"/>
+ <location line="+326"/>
<source>Select a peer to view detailed information.</source>
<translation type="unfinished"></translation>
</message>
@@ -1958,7 +1953,12 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-741"/>
+ <location line="+23"/>
+ <source>Time Offset</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-764"/>
<source>Last block time</source>
<translation>Last block time</translation>
</message>
@@ -1988,7 +1988,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../rpcconsole.cpp" line="-165"/>
+ <location filename="../rpcconsole.cpp" line="-164"/>
<source>In:</source>
<translation type="unfinished"></translation>
</message>
@@ -2008,19 +2008,14 @@ Address: %4
<translation>Debug log file</translation>
</message>
<message>
- <location line="+7"/>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</translation>
- </message>
- <message>
- <location line="+76"/>
+ <location line="+83"/>
<source>Clear console</source>
<translation>Clear console</translation>
</message>
<message>
- <location filename="../rpcconsole.cpp" line="-35"/>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Welcome to the Bitcoin RPC console.</translation>
+ <location filename="../rpcconsole.cpp" line="-36"/>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
@@ -2064,7 +2059,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+8"/>
<source>Inbound</source>
<translation type="unfinished"></translation>
</message>
@@ -2176,7 +2171,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../receivecoinsdialog.cpp" line="+39"/>
+ <location filename="../receivecoinsdialog.cpp" line="+45"/>
<source>Copy label</source>
<translation type="unfinished">Copy label</translation>
</message>
@@ -2262,7 +2257,7 @@ Address: %4
<context>
<name>RecentRequestsTableModel</name>
<message>
- <location filename="../recentrequeststablemodel.cpp" line="+28"/>
+ <location filename="../recentrequeststablemodel.cpp" line="+29"/>
<source>Date</source>
<translation type="unfinished">Date</translation>
</message>
@@ -2301,7 +2296,7 @@ Address: %4
<name>SendCoinsDialog</name>
<message>
<location filename="../forms/sendcoinsdialog.ui" line="+14"/>
- <location filename="../sendcoinsdialog.cpp" line="+529"/>
+ <location filename="../sendcoinsdialog.cpp" line="+543"/>
<source>Send Coins</source>
<translation>Send Coins</translation>
</message>
@@ -2381,32 +2376,28 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+37"/>
<source>collapse fee-settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
- <source>Minimize</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+78"/>
- <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then &quot;per kilobyte&quot; only pays 250 satoshis in fee, while &quot;at least&quot; pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <location line="+54"/>
+ <source>per kilobyte</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
- <source>per kilobyte</source>
+ <location line="-3"/>
+ <location line="+16"/>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then &quot;per kilobyte&quot; only pays 250 satoshis in fee, while &quot;total at least&quot; pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+13"/>
- <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then &quot;per kilobyte&quot; only pays 250 satoshis in fee, while &quot;total at least&quot; pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <location line="-64"/>
+ <source>Hide</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+67"/>
<source>total at least</source>
<translation type="unfinished"></translation>
</message>
@@ -2502,12 +2493,12 @@ Address: %4
<translation>S&amp;end</translation>
</message>
<message>
- <location filename="../sendcoinsdialog.cpp" line="-221"/>
+ <location filename="../sendcoinsdialog.cpp" line="-226"/>
<source>Confirm send coins</source>
<translation>Confirm send coins</translation>
</message>
<message>
- <location line="-77"/>
+ <location line="-48"/>
<location line="+5"/>
<location line="+5"/>
<location line="+4"/>
@@ -2515,7 +2506,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-192"/>
+ <location line="-221"/>
<source>Copy quantity</source>
<translation type="unfinished"></translation>
</message>
@@ -2560,12 +2551,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+192"/>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>The recipient address is not valid, please recheck.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+196"/>
<source>The amount to pay must be larger than 0.</source>
<translation>The amount to pay must be larger than 0.</translation>
</message>
@@ -2580,12 +2566,7 @@ Address: %4
<translation>The total exceeds your balance when the %1 transaction fee is included.</translation>
</message>
<message>
- <location line="+3"/>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Duplicate address found, can only send to each address once per send operation.</translation>
- </message>
- <message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Transaction creation failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -2596,21 +2577,39 @@ Address: %4
</message>
<message>
<location line="+4"/>
- <source>A fee higher than %1 is considered an insanely high fee.</source>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+87"/>
+ <location line="+3"/>
+ <source>Payment request expired.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <location line="+110"/>
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform>Estimated to begin confirmation within %n block.</numerusform>
+ <numerusform>Estimated to begin confirmation within %n blocks.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <location line="-22"/>
<source>Pay only the minimum fee of %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+22"/>
- <source>Estimated to begin confirmation within %1 block(s).</source>
+ <location line="-114"/>
+ <source>The recipient address is not valid. Please recheck.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+107"/>
+ <location line="+12"/>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+231"/>
<source>Warning: Invalid Bitcoin address</source>
<translation type="unfinished"></translation>
</message>
@@ -2625,7 +2624,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-687"/>
+ <location line="-692"/>
<source>Copy dust</source>
<translation type="unfinished"></translation>
</message>
@@ -2643,44 +2642,44 @@ Address: %4
<context>
<name>SendCoinsEntry</name>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="+131"/>
- <location line="+521"/>
- <location line="+536"/>
+ <location filename="../forms/sendcoinsentry.ui" line="+155"/>
+ <location line="+539"/>
+ <location line="+533"/>
<source>A&amp;mount:</source>
<translation>A&amp;mount:</translation>
</message>
<message>
- <location line="-1152"/>
+ <location line="-1185"/>
<source>Pay &amp;To:</source>
<translation>Pay &amp;To:</translation>
</message>
<message>
- <location filename="../sendcoinsentry.cpp" line="+30"/>
+ <location filename="../sendcoinsentry.cpp" line="+37"/>
<source>Enter a label for this address to add it to your address book</source>
<translation>Enter a label for this address to add it to your address book</translation>
</message>
<message>
- <location filename="../forms/sendcoinsentry.ui" line="+75"/>
+ <location filename="../forms/sendcoinsentry.ui" line="+93"/>
<source>&amp;Label:</source>
<translation>&amp;Label:</translation>
</message>
<message>
- <location line="-50"/>
+ <location line="-68"/>
<source>Choose previously used address</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-40"/>
+ <location line="-46"/>
<source>This is a normal payment.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+33"/>
+ <location line="+39"/>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+23"/>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -2690,51 +2689,61 @@ Address: %4
<translation>Paste address from clipboard</translation>
</message>
<message>
- <location line="+10"/>
+ <location line="+16"/>
<source>Alt+P</source>
<translation>Alt+P</translation>
</message>
<message>
<location line="+7"/>
- <location line="+524"/>
- <location line="+536"/>
+ <location line="+548"/>
+ <location line="+533"/>
<source>Remove this entry</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-1008"/>
+ <location line="-1021"/>
+ <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>
+ <location line="+3"/>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
<source>Message:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+968"/>
- <source>This is a verified payment request.</source>
+ <location line="+443"/>
+ <source>This is an unauthenticated payment request.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-991"/>
- <source>Enter a label for this address to add it to the list of used addresses</source>
+ <location line="+529"/>
+ <source>This is an authenticated payment request.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+33"/>
- <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>
+ <location line="-1009"/>
+ <source>Enter a label for this address to add it to the list of used addresses</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+426"/>
- <source>This is an unverified payment request.</source>
+ <location line="+47"/>
+ <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>
<message>
- <location line="+18"/>
- <location line="+532"/>
+ <location line="+448"/>
+ <location line="+529"/>
<source>Pay To:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-498"/>
- <location line="+536"/>
+ <location line="-495"/>
+ <location line="+533"/>
<source>Memo:</source>
<translation type="unfinished"></translation>
</message>
@@ -2742,7 +2751,7 @@ Address: %4
<context>
<name>ShutdownWindow</name>
<message>
- <location filename="../utilitydialog.cpp" line="+47"/>
+ <location filename="../utilitydialog.cpp" line="+81"/>
<source>Bitcoin Core is shutting down...</source>
<translation type="unfinished"></translation>
</message>
@@ -2766,8 +2775,8 @@ Address: %4
</message>
<message>
<location line="+6"/>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</translation>
+ <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>
<location line="+18"/>
@@ -2839,8 +2848,8 @@ Address: %4
</message>
<message>
<location line="+6"/>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</translation>
+ <source>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>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
@@ -2863,7 +2872,7 @@ Address: %4
<translation>Reset all verify message fields</translation>
</message>
<message>
- <location filename="../signverifymessagedialog.cpp" line="+29"/>
+ <location filename="../signverifymessagedialog.cpp" line="+40"/>
<source>Click &quot;Sign Message&quot; to generate signature</source>
<translation>Click &quot;Sign Message&quot; to generate signature</translation>
</message>
@@ -2937,7 +2946,7 @@ Address: %4
<context>
<name>SplashScreen</name>
<message>
- <location filename="../splashscreen.cpp" line="+35"/>
+ <location filename="../splashscreen.cpp" line="+41"/>
<source>Bitcoin Core</source>
<translation type="unfinished">Bitcoin Core</translation>
</message>
@@ -2947,7 +2956,7 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../networkstyle.cpp" line="+19"/>
+ <location filename="../networkstyle.cpp" line="+20"/>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
@@ -3187,7 +3196,7 @@ Address: %4
<context>
<name>TransactionTableModel</name>
<message>
- <location filename="../transactiontablemodel.cpp" line="+229"/>
+ <location filename="../transactiontablemodel.cpp" line="+230"/>
<source>Date</source>
<translation>Date</translation>
</message>
@@ -3197,11 +3206,6 @@ Address: %4
<translation>Type</translation>
</message>
<message>
- <location line="+0"/>
- <source>Address</source>
- <translation>Address</translation>
- </message>
- <message>
<location line="+79"/>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation type="unfinished"></translation>
@@ -3240,7 +3244,12 @@ Address: %4
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="-64"/>
+ <source>Label</source>
+ <translation type="unfinished">Label</translation>
+ </message>
+ <message>
+ <location line="+67"/>
<source>Unconfirmed</source>
<translation type="unfinished"></translation>
</message>
@@ -3290,7 +3299,7 @@ Address: %4
<translation>(n/a)</translation>
</message>
<message>
- <location line="+210"/>
+ <location line="+215"/>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
<translation>Transaction status. Hover over this field to show number of confirmations.</translation>
</message>
@@ -3311,8 +3320,8 @@ Address: %4
</message>
<message>
<location line="+2"/>
- <source>Destination address of transaction.</source>
- <translation>Destination address of transaction.</translation>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
@@ -3323,7 +3332,7 @@ Address: %4
<context>
<name>TransactionView</name>
<message>
- <location filename="../transactionview.cpp" line="+67"/>
+ <location filename="../transactionview.cpp" line="+68"/>
<location line="+16"/>
<source>All</source>
<translation>All</translation>
@@ -3518,7 +3527,7 @@ Address: %4
<context>
<name>WalletModel</name>
<message>
- <location filename="../walletmodel.cpp" line="+276"/>
+ <location filename="../walletmodel.cpp" line="+288"/>
<source>Send Coins</source>
<translation>Send Coins</translation>
</message>
@@ -3526,7 +3535,7 @@ Address: %4
<context>
<name>WalletView</name>
<message>
- <location filename="../walletview.cpp" line="+44"/>
+ <location filename="../walletview.cpp" line="+45"/>
<source>&amp;Export</source>
<translation>&amp;Export</translation>
</message>
@@ -3536,7 +3545,7 @@ Address: %4
<translation>Export the data in the current tab to a file</translation>
</message>
<message>
- <location line="+187"/>
+ <location line="+189"/>
<source>Backup Wallet</source>
<translation>Backup Wallet</translation>
</message>
@@ -3569,82 +3578,62 @@ Address: %4
<context>
<name>bitcoin-core</name>
<message>
- <location filename="../bitcoinstrings.cpp" line="+239"/>
+ <location filename="../bitcoinstrings.cpp" line="+268"/>
<source>Options:</source>
<translation>Options:</translation>
</message>
<message>
- <location line="+31"/>
+ <location line="+35"/>
<source>Specify data directory</source>
<translation>Specify data directory</translation>
</message>
<message>
- <location line="-91"/>
+ <location line="-94"/>
<source>Connect to a node to retrieve peer addresses, and disconnect</source>
<translation>Connect to a node to retrieve peer addresses, and disconnect</translation>
</message>
<message>
- <location line="+94"/>
+ <location line="+97"/>
<source>Specify your own public address</source>
<translation>Specify your own public address</translation>
</message>
<message>
- <location line="-109"/>
+ <location line="-117"/>
<source>Accept command line and JSON-RPC commands</source>
<translation>Accept command line and JSON-RPC commands</translation>
</message>
<message>
- <location line="+90"/>
+ <location line="+95"/>
<source>Run in the background as a daemon and accept commands</source>
<translation>Run in the background as a daemon and accept commands</translation>
</message>
<message>
- <location line="+36"/>
+ <location line="+42"/>
<source>Use the test network</source>
<translation>Use the test network</translation>
</message>
<message>
- <location line="-125"/>
+ <location line="-136"/>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
<translation>Accept connections from outside (default: 1 if no -proxy or -connect)</translation>
</message>
<message>
- <location line="-153"/>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.com
-</source>
- <translation>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.com
-</translation>
- </message>
- <message>
- <location line="+22"/>
+ <location line="-168"/>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Bind to given address and always listen on it. Use [host]:port notation for IPv6</translation>
</message>
<message>
- <location line="+19"/>
+ <location line="+13"/>
+ <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default: %u)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+6"/>
<source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
<translation type="unfinished"></translation>
</message>
@@ -3654,17 +3643,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+5"/>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</translation>
- </message>
- <message>
- <location line="+4"/>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</translation>
- </message>
- <message>
- <location line="+9"/>
+ <location line="+11"/>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</translation>
</message>
@@ -3674,22 +3653,32 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+20"/>
+ <location line="+14"/>
+ <source>Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+15"/>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, &gt;%u = target size in MiB to use for block files)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+10"/>
<source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+8"/>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+20"/>
<source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+9"/>
<source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
<translation>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</translation>
</message>
@@ -3719,7 +3708,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+11"/>
<source>(default: 1)</source>
<translation type="unfinished"></translation>
</message>
@@ -3729,7 +3718,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+10"/>
<source>Attempt to recover private keys from a corrupt wallet.dat</source>
<translation>Attempt to recover private keys from a corrupt wallet.dat</translation>
</message>
@@ -3739,7 +3728,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation>Block creation options:</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+8"/>
<source>Connect only to the specified node(s)</source>
<translation>Connect only to the specified node(s)</translation>
</message>
@@ -3760,11 +3749,6 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
</message>
<message>
<location line="+2"/>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Discover own IP address (default: 1 when listening and no -externalip)</translation>
- </message>
- <message>
- <location line="+1"/>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation type="unfinished"></translation>
</message>
@@ -3794,7 +3778,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation>Error opening block database</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Error: A fatal internal error occured, see debug.log for details</source>
<translation type="unfinished"></translation>
</message>
@@ -3805,11 +3789,6 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
</message>
<message>
<location line="+2"/>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Error: Wallet locked, unable to create transaction!</translation>
- </message>
- <message>
- <location line="+1"/>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Failed to listen on any port. Use -listen=0 if you want this.</translation>
</message>
@@ -3844,32 +3823,37 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+10"/>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Rebuild block chain index from current blk000??.dat files</translation>
+ <location line="+4"/>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+11"/>
+ <location line="+1"/>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+18"/>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Set maximum block size in bytes (default: %d)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+11"/>
+ <location line="+12"/>
<source>Specify wallet file (within data directory)</source>
<translation>Specify wallet file (within data directory)</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+8"/>
<source>This is intended for regression testing tools and app development.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+10"/>
+ <location line="+11"/>
<source>Use UPnP to map the listening port (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -3894,17 +3878,22 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+2"/>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>You need to rebuild the database using -reindex to change -txindex</translation>
</message>
<message>
- <location line="-92"/>
+ <location line="-99"/>
<source>Imports blocks from external blk000??.dat file</source>
<translation>Imports blocks from external blk000??.dat file</translation>
</message>
<message>
- <location line="-182"/>
+ <location line="-223"/>
<source>Allow JSON-RPC connections from specified source. Valid for &lt;ip&gt; are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
<translation type="unfinished"></translation>
</message>
@@ -3929,22 +3918,22 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
+ <location line="+6"/>
+ <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
- <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
+ <location line="+6"/>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+12"/>
+ <location line="+9"/>
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+2"/>
<source>Error: Unsupported argument -socks found. Setting SOCKS version isn&apos;t possible anymore, only SOCKS5 proxies are supported.</source>
<translation type="unfinished"></translation>
</message>
@@ -3964,17 +3953,42 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+19"/>
+ <location line="+8"/>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: &apos;%s&apos; (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+8"/>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+7"/>
+ <location line="+10"/>
+ <source>Prune configured below the minimum of %d MB. Please use a higher number.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+9"/>
+ <source>Require high priority for relaying free or low-fee transactions (default: %u)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation type="unfinished"></translation>
</message>
@@ -3984,12 +3998,37 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+3"/>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+13"/>
+ <location line="+4"/>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.com
+</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+19"/>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+6"/>
<source>Warning: Please check that your computer&apos;s date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation type="unfinished"></translation>
</message>
@@ -3999,12 +4038,47 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
- <source>Cannot resolve -whitebind address: &apos;%s&apos;</source>
+ <location line="+3"/>
+ <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"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>(default: %u)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Activating best chain...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
+ <source>Allow self signed root certificates (default: 0)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Can&apos;t run with a wallet in prune mode.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Cannot resolve -whitebind address: &apos;%s&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation type="unfinished">Choose data directory on startup (default: 0)</translation>
+ </message>
+ <message>
+ <location line="+2"/>
<source>Connect through SOCKS5 proxy</source>
<translation type="unfinished"></translation>
</message>
@@ -4019,17 +4093,22 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+12"/>
+ <location line="+11"/>
<source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+2"/>
+ <source>Error reading from database, shutting down.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
<source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
<translation type="unfinished"></translation>
</message>
@@ -4045,6 +4124,11 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
</message>
<message>
<location line="+4"/>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: &apos;%s&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: &apos;%s&apos;</source>
<translation>Invalid amount for -minrelaytxfee=&lt;amount&gt;: &apos;%s&apos;</translation>
</message>
@@ -4059,22 +4143,17 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
<source>Invalid netmask specified in -whitelist: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+10"/>
+ <location line="+11"/>
<source>Need to specify a port with -whitebind: &apos;%s&apos;</source>
<translation type="unfinished"></translation>
</message>
@@ -4084,18 +4163,18 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+7"/>
- <source>Print block on startup, if found in block index</source>
+ <location line="+9"/>
+ <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
+ <location line="+1"/>
+ <source>RPC server options:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
- <source>RPC server options:</source>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -4109,7 +4188,12 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+1"/>
+ <source>Rebuild block chain index from current blk000??.dat files on startup</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+7"/>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Send trace/debug info to console instead of debug.log file</translation>
</message>
@@ -4119,12 +4203,27 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+3"/>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+3"/>
+ <source>Set language, for example &quot;de_DE&quot; (default: system locale)</source>
+ <translation type="unfinished">Set language, for example &quot;de_DE&quot; (default: system locale)</translation>
+ </message>
+ <message>
+ <location line="+5"/>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation type="unfinished">Show splash screen on startup (default: 1)</translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Shrink debug.log file on client startup (default: 1 when no -debug)</translation>
</message>
@@ -4134,12 +4233,22 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation>Signing transaction failed</translation>
</message>
<message>
- <location line="+10"/>
+ <location line="+8"/>
+ <source>Start minimized</source>
+ <translation type="unfinished">Start minimized</translation>
+ </message>
+ <message>
+ <location line="+2"/>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
<source>This is experimental software.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+3"/>
<source>Transaction amount too small</source>
<translation>Transaction amount too small</translation>
</message>
@@ -4150,11 +4259,21 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
</message>
<message>
<location line="+1"/>
+ <source>Transaction too large for fee policy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Transaction too large</source>
<translation>Transaction too large</translation>
</message>
<message>
<location line="+1"/>
+ <source>UI Options:</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>
@@ -4179,12 +4298,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation>Warning</translation>
</message>
<message>
- <location line="+1"/>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Warning: This version is obsolete, upgrade required!</translation>
- </message>
- <message>
- <location line="+1"/>
+ <location line="+2"/>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation type="unfinished"></translation>
</message>
@@ -4209,57 +4323,57 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation>wallet.dat corrupt, salvage failed</translation>
</message>
<message>
- <location line="-64"/>
+ <location line="-71"/>
<source>Password for JSON-RPC connections</source>
<translation>Password for JSON-RPC connections</translation>
</message>
<message>
- <location line="-160"/>
+ <location line="-205"/>
<source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
<translation>Execute command when the best block changes (%s in cmd is replaced by block hash)</translation>
</message>
<message>
- <location line="+206"/>
+ <location line="+258"/>
<source>Upgrade wallet to latest format</source>
<translation>Upgrade wallet to latest format</translation>
</message>
<message>
- <location line="-35"/>
+ <location line="-41"/>
<source>Rescan the block chain for missing wallet transactions</source>
<translation>Rescan the block chain for missing wallet transactions</translation>
</message>
<message>
- <location line="+36"/>
+ <location line="+42"/>
<source>Use OpenSSL (https) for JSON-RPC connections</source>
<translation>Use OpenSSL (https) for JSON-RPC connections</translation>
</message>
<message>
- <location line="-11"/>
+ <location line="-12"/>
<source>This help message</source>
<translation>This help message</translation>
</message>
<message>
- <location line="-108"/>
+ <location line="-116"/>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
<translation>Allow DNS lookups for -addnode, -seednode and -connect</translation>
</message>
<message>
- <location line="+60"/>
+ <location line="+61"/>
<source>Loading addresses...</source>
<translation>Loading addresses...</translation>
</message>
<message>
- <location line="-34"/>
+ <location line="-33"/>
<source>Error loading wallet.dat: Wallet corrupted</source>
<translation>Error loading wallet.dat: Wallet corrupted</translation>
</message>
<message>
- <location line="-170"/>
+ <location line="-211"/>
<source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+65"/>
+ <location line="+61"/>
<source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4269,12 +4383,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
+ <location line="+11"/>
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4284,7 +4393,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+9"/>
<source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4294,32 +4403,32 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+23"/>
+ <location line="+51"/>
<source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+28"/>
+ <location line="+34"/>
<source>(default: %s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+7"/>
<source>Acceptable ciphers (default: %s)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+5"/>
<source>Always query for peer addresses via DNS lookup (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+16"/>
+ <location line="+18"/>
<source>Disable safemode, override a real safe mode event (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+7"/>
<source>Error loading wallet.dat</source>
<translation>Error loading wallet.dat</translation>
</message>
@@ -4349,7 +4458,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation>Invalid -proxy address: &apos;%s&apos;</translation>
</message>
<message>
- <location line="+9"/>
+ <location line="+8"/>
<source>Limit size of signature cache to &lt;n&gt; entries (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4370,6 +4479,11 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
</message>
<message>
<location line="+1"/>
+ <source>Make the wallet broadcast transactions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4389,12 +4503,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
- <source>Print block tree on startup (default: %u)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+6"/>
+ <location line="+9"/>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4419,12 +4528,12 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Set key pool size to &lt;n&gt; (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Set minimum block size in bytes (default: %u)</source>
<translation type="unfinished"></translation>
</message>
@@ -4439,7 +4548,7 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+5"/>
<source>Specify configuration file (default: %s)</source>
<translation type="unfinished"></translation>
</message>
@@ -4459,22 +4568,22 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>Stop running after importing blocks from disk (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="+5"/>
<source>Threshold for disconnecting misbehaving peers (default: %u)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+7"/>
<source>Unknown network specified in -onlynet: &apos;%s&apos;</source>
<translation>Unknown network specified in -onlynet: &apos;%s&apos;</translation>
</message>
<message>
- <location line="-112"/>
+ <location line="-119"/>
<source>Cannot resolve -bind address: &apos;%s&apos;</source>
<translation>Cannot resolve -bind address: &apos;%s&apos;</translation>
</message>
@@ -4484,37 +4593,32 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation>Cannot resolve -externalip address: &apos;%s&apos;</translation>
</message>
<message>
- <location line="+46"/>
+ <location line="+47"/>
<source>Invalid amount for -paytxfee=&lt;amount&gt;: &apos;%s&apos;</source>
<translation>Invalid amount for -paytxfee=&lt;amount&gt;: &apos;%s&apos;</translation>
</message>
<message>
- <location line="+1"/>
- <source>Invalid amount</source>
- <translation>Invalid amount</translation>
- </message>
- <message>
<location line="-7"/>
<source>Insufficient funds</source>
<translation>Insufficient funds</translation>
</message>
<message>
- <location line="+15"/>
+ <location line="+14"/>
<source>Loading block index...</source>
<translation>Loading block index...</translation>
</message>
<message>
- <location line="-62"/>
+ <location line="-63"/>
<source>Add a node to connect to and attempt to keep the connection open</source>
<translation>Add a node to connect to and attempt to keep the connection open</translation>
</message>
<message>
- <location line="+63"/>
+ <location line="+64"/>
<source>Loading wallet...</source>
<translation>Loading wallet...</translation>
</message>
<message>
- <location line="-58"/>
+ <location line="-57"/>
<source>Cannot downgrade wallet</source>
<translation>Cannot downgrade wallet</translation>
</message>
@@ -4524,22 +4628,17 @@ for example: alertnotify=echo %%s | mail -s &quot;Bitcoin Alert&quot; admin@foo.
<translation>Cannot write default address</translation>
</message>
<message>
- <location line="+76"/>
+ <location line="+77"/>
<source>Rescanning...</source>
<translation>Rescanning...</translation>
</message>
<message>
- <location line="-63"/>
+ <location line="-64"/>
<source>Done loading</source>
<translation>Done loading</translation>
</message>
<message>
- <location line="+91"/>
- <source>To use the %s option</source>
- <translation>To use the %s option</translation>
- </message>
- <message>
- <location line="-83"/>
+ <location line="+9"/>
<source>Error</source>
<translation>Error</translation>
</message>
diff --git a/src/qt/locale/bitcoin_eo.ts b/src/qt/locale/bitcoin_eo.ts
index 5189310e64..007acbc495 100644
--- a/src/qt/locale/bitcoin_eo.ts
+++ b/src/qt/locale/bitcoin_eo.ts
@@ -1,11 +1,7 @@
-<TS language="eo" version="2.0">
+<TS language="eo" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Duoble-klaku por redakti adreson aŭ etikedon</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Krei novan adreson</translation>
</message>
@@ -35,7 +31,7 @@
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation>Eksporti al dosiero la datumojn el la aktuala langeto</translation>
+ <translation>Eksporti la datumojn el la aktuala langeto al dosiero</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -89,6 +85,10 @@
<source>Comma separated file (*.csv)</source>
<translation>Perkome disigita dosiero (*.csv)</translation>
</message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation>ekspotado malsukcesinta</translation>
+ </message>
</context>
<context>
<name>AddressTableModel</name>
@@ -148,10 +148,6 @@
<translation>Ŝanĝi la pasfrazon</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Tajpu la malnovan kaj novan monujajn pasfrazojn.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Konfirmo de ĉifrado de la monujo</translation>
</message>
@@ -176,10 +172,6 @@
<translation>La monujo estas ĉifrita</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitmono nun fermiĝos por fini la ĉifradon. Memoru, ke eĉ ĉifrado ne protektas kontraŭ ĉiu atako, ekz. se viruso infektus vian komputilon.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Ĉifrado de la monujo fiaskis</translation>
</message>
@@ -283,6 +275,10 @@
<translation>Malfermi &amp;URI-on...</translation>
</message>
<message>
+ <source>Bitcoin Core client</source>
+ <translation>kliento de bitmon-kerno</translation>
+ </message>
+ <message>
<source>Importing blocks from disk...</source>
<translation>Importado de blokoj el disko...</translation>
</message>
@@ -295,10 +291,6 @@
<translation>Sendi monon al Bitmon-adreso</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modifi agordaĵojn por Bitmono</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Krei alilokan sekurkopion de monujo</translation>
</message>
@@ -398,26 +390,10 @@
<source>&amp;Command-line options</source>
<translation>&amp;Komandliniaj agordaĵoj</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n aktiva konekto al la bitmona reto</numerusform><numerusform>%n aktivaj konektoj al la bitmona reto</numerusform></translation>
- </message>
<message>
<source>No block source available...</source>
<translation>Neniu fonto de blokoj trovebla...</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n horo</numerusform><numerusform>%n horoj</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n tago</numerusform><numerusform>%n tagoj</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n semajno</numerusform><numerusform>%n semajnoj</numerusform></translation>
- </message>
<message>
<source>%1 and %2</source>
<translation>%1 kaj %2</translation>
@@ -463,18 +439,6 @@
<translation>Envenanta transakcio</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Dato: %1
-Sumo: %2
-Tipo: %3
-Adreso: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Monujo estas &lt;b&gt;ĉifrita&lt;/b&gt; kaj aktuale &lt;b&gt;malŝlosita&lt;/b&gt;</translation>
</message>
@@ -653,10 +617,6 @@ Adreso: %4
<translation>ne</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Tiu ĉi etikedo ruĝiĝas se la grando de la transakcio estas pli ol 1000 bajtoj.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Tio signifas, ke krompago de almenaŭ po %1 por ĉiu kB estas deviga.</translation>
</message>
@@ -669,10 +629,6 @@ Adreso: %4
<translation>Transakcioj kun pli alta prioritato havas pli altan ŝancon inkluziviĝi en bloko.</translation>
</message>
<message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Tiu ĉi etikedo ruĝiĝas se iu ajn ricevonto ricevos sumon malpli ol %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(neniu etikedo)</translation>
</message>
@@ -789,26 +745,6 @@ Adreso: %4
<source>command-line options</source>
<translation>komandliniaj agordaĵoj</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI-agordaĵoj</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Agordi lingvon, ekzemple "de_DE" (defaŭlte: tiu de la sistemo)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Lanĉiĝi plejete</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Montri salutŝildon dum lanĉo (defaŭlte: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Elekti dosierujon por datumoj dum lanĉo (defaŭlte: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -879,14 +815,6 @@ Adreso: %4
<translation>Ĉ&amp;efa</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Aŭtomate lanĉi Bitmonon post ensaluto al la sistemo.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Lanĉi Bitmonon tuj post ensaluto al la sistemo</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Dosiergrando de &amp;datumbasa kaŝmemoro</translation>
</message>
@@ -939,10 +867,6 @@ Adreso: %4
<translation>&amp;Minimumigi al la sistempleto anstataŭ al la taskopleto</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 Quit in the menu.</source>
- <translation>Minimumigi la aplikaĵon anstataŭ eliri kaj ĉesi kiam la fenestro estas fermita. Se tiu ĉi estas agordita, la aplikaĵo ĉesas nur kiam oni elektas "Eliri" el la menuo.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimumigi je fermo</translation>
</message>
@@ -955,10 +879,6 @@ Adreso: %4
<translation>&amp;Lingvo de la fasado:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Vi povas elekti la lingvon uzata en la aplikaĵo ĉi tie. Tiu ekefikos nur post relanĉo de Bitmono.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unuo por vidigi sumojn:</translation>
</message>
@@ -1029,11 +949,7 @@ Adreso: %4
<source>Your current total balance</source>
<translation>via aktuala totala saldo</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>nesinkronigita</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -1213,18 +1129,10 @@ Adreso: %4
<translation>Sencimiga protokoldosiero</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Malfermi la sencimiga protokoldosiero de Bitmono el la aktuala dosierujo por datumoj. Tio eble daŭros plurajn sekundojn por granda protokoldosiero.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Malplenigi konzolon</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bonvenon al la RPC-konzolo de Bitmono.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Uzu la sagojn supran kaj malsupran por esplori la historion, kaj &lt;b&gt;stir-L&lt;/b&gt; por malplenigi la ekranon.</translation>
</message>
@@ -1390,7 +1298,7 @@ Adreso: %4
<name>SendCoinsDialog</name>
<message>
<source>Send Coins</source>
- <translation>Sendi Monon</translation>
+ <translation>Sendi Bitmonon</translation>
</message>
<message>
<source>Coin Control Features</source>
@@ -1446,7 +1354,7 @@ Adreso: %4
</message>
<message>
<source>Clear &amp;All</source>
- <translation>&amp;Forigi ĉion</translation>
+ <translation>&amp;Forigi Ĉion</translation>
</message>
<message>
<source>Balance:</source>
@@ -1505,10 +1413,6 @@ Adreso: %4
<translation>aŭ</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>La adreso de la ricevonto ne validas. Bonvolu kontroli.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>La pagenda sumo devas esti pli ol 0.</translation>
</message>
@@ -1521,10 +1425,6 @@ Adreso: %4
<translation>La sumo kun la %1 krompago estas pli granda ol via saldo.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Iu adreso estas ripetita. Vi povas sendi al ĉiu adreso po unufoje en iu send-operacio.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Kreo de transakcio fiaskis!</translation>
</message>
@@ -1577,7 +1477,7 @@ Adreso: %4
</message>
<message>
<source>Paste address from clipboard</source>
- <translation>Alglui adreson el tondejo</translation>
+ <translation>Alglui adreson de tondejo</translation>
</message>
<message>
<source>Alt+P</source>
@@ -1622,10 +1522,6 @@ Adreso: %4
<translation>&amp;Subskribi Mesaĝon</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Vi povas subskribi mesaĝon per viaj adresoj, por pravigi ke vi estas la posedanto de tiuj adresoj. Atentu, ke vi ne subskriu ion neprecizan, ĉar trompisto povus ruzi kontraŭ vi kaj ŝteli vian identecon. Subskribu nur plene detaligitaj deklaroj pri kiuj vi konsentas.</translation>
- </message>
- <message>
<source>Choose previously used address</source>
<translation>Elektu la jam uzitan adreson</translation>
</message>
@@ -1674,10 +1570,6 @@ Adreso: %4
<translation>&amp;Kontroli Mesaĝon</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Enmeti la subskriban adreson, la mesaĝon (kune kun ĉiu linisalto, spaceto, taboj, ktp. precize) kaj la subskribon ĉi sube por kontroli la mesaĝon. Atentu, ke vi ne komprenu per la subskribo pli ol la enhavo de la mesaĝo mem, por eviti homo-en-la-mezo-atakon.</translation>
- </message>
- <message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
<translation>Kontroli la mesaĝon por pravigi, ke ĝi ja estas subskribita per la specifa Bitmon-adreso</translation>
</message>
@@ -1786,10 +1678,6 @@ Adreso: %4
<source>Status</source>
<translation>Stato</translation>
</message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, elsendita(j) tra %n nodo</numerusform><numerusform>, elsendita(j) tra %n nodoj</numerusform></translation>
- </message>
<message>
<source>Date</source>
<translation>Dato</translation>
@@ -1822,10 +1710,6 @@ Adreso: %4
<source>Credit</source>
<translation>Kredito</translation>
</message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>maturiĝos post %n bloko</numerusform><numerusform>maturiĝos post %n blokoj</numerusform></translation>
- </message>
<message>
<source>not accepted</source>
<translation>ne akceptita</translation>
@@ -1890,10 +1774,6 @@ Adreso: %4
<source>, has not been successfully broadcast yet</source>
<translation>, ankoraŭ ne elsendita sukcese</translation>
</message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Malferma dum ankoraŭ %n bloko</numerusform><numerusform>Malferma dum ankoraŭ %n blokoj</numerusform></translation>
- </message>
<message>
<source>unknown</source>
<translation>nekonata</translation>
@@ -1921,14 +1801,6 @@ Adreso: %4
<translation>Tipo</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adreso</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Malferma dum ankoraŭ %n bloko</numerusform><numerusform>Malferma dum ankoraŭ %n blokoj</numerusform></translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Malferma ĝis %1</translation>
</message>
@@ -1949,6 +1821,10 @@ Adreso: %4
<translation>Senkonekte</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etikedo</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Nekonfirmita</translation>
</message>
@@ -1989,10 +1865,6 @@ Adreso: %4
<translation>Tipo de transakcio.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Celadreso de la transakcio.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Sumo elprenita de aŭ aldonita al la saldo.</translation>
</message>
@@ -2080,6 +1952,10 @@ Adreso: %4
<translation>Montri detalojn de transakcio</translation>
</message>
<message>
+ <source>Exporting Failed</source>
+ <translation>ekspotado malsukcesinta</translation>
+ </message>
+ <message>
<source>Comma separated file (*.csv)</source>
<translation>Perkome disigita dosiero (*.csv)</translation>
</message>
@@ -2191,42 +2067,10 @@ Adreso: %4
<translation>Akcepti konektojn el ekstere (defaŭlte: 1 se ne estas -proxy nek -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, vi devas specifi rpcpassword en la konfigura dosiero:
-%s
-Estas konsilinde uzi tiun ĉi aleatore kreitan pasvorton:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(ne utilas al vi memorigi tiun ĉi pasvorton)
-La salutnomo kaj la pasvorto estu nepre MALSAMAJ.
-Se la dosiero ne ekzistas, kreu ĝin kun permeso "nur posedanto rajtas legi".
-Estas konsilinde ankaŭ agordi alertnotify por ke vi ricevu avertojn pri eventualaj problemoj;
-ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Bindi al donita adreso kaj ĉiam aŭskulti per ĝi. Uzu la formaton [gastigo]:pordo por IPv6</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Eraro: la transakcio estas rifuzita. Tio povas okazi se iom da Bitmono en via monujo jam elspeziĝis (ekz. se vi uzis kopion de wallet.dat kies Bitmono jam elspeziĝis, sed ne estis markita kiel elspezita ĉi tie).</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Eraro: tiu ĉi transakcio bezonas krompagon de almenaŭ %s pro la sumo, la komplekseco, aŭ la uzo de ĵus ricevita mono!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Plenumi komandon kiam monuja transakcio ŝanĝiĝas (%s en cmd anstataŭiĝas per TxID)</translation>
</message>
@@ -2275,10 +2119,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
<translation>Difektita blokdatumbazo trovita</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Malkovri la propran IP-adreson (defaŭlte: 1 dum aŭskultado sen -externalip)</translation>
- </message>
- <message>
<source>Do you want to rebuild the block database now?</source>
<translation>Ĉu vi volas rekonstrui la blokdatumbazon nun?</translation>
</message>
@@ -2303,10 +2143,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
<translation>Eraro: restas malmulte da diskospaco!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Eraro: monujo ŝlosita, ne eblas krei transakcion!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Ne sukcesis aŭskulti ajnan pordon. Uzu -listen=0 se tion vi volas.</translation>
</message>
@@ -2323,10 +2159,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
<translation>Nesufiĉa nombro de dosierpriskribiloj disponeblas.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Rekontrui blokĉenan indekson el la aktualaj blk000??.dat dosieroj</translation>
- </message>
- <message>
<source>Specify wallet file (within data directory)</source>
<translation>Specifi monujan dosieron (ene de dosierujo por datumoj)</translation>
</message>
@@ -2359,6 +2191,10 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
<translation>Plenumi komandon kiam rilata alerto riceviĝas, aŭ kiam ni vidas tre longan forkon (%s en cms anstataŭiĝas per mesaĝo)</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Elekti dosierujon por datumoj dum lanĉo (defaŭlte: 0)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Informoj</translation>
</message>
@@ -2375,6 +2211,14 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
<translation>Sendi spurajn/sencimigajn informojn al la konzolo anstataŭ al dosiero debug.log</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Agordi lingvon, ekzemple "de_DE" (defaŭlte: tiu de la sistemo)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Montri salutŝildon dum lanĉo (defaŭlte: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Malpligrandigi la sencimigan protokol-dosieron kiam kliento lanĉiĝas (defaŭlte: 1 kiam mankas -debug)</translation>
</message>
@@ -2383,6 +2227,14 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
<translation>Subskriba transakcio fiaskis</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Lanĉiĝi plejete</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation>ĝi estas eksperimenta programo</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Transakcia sumo tro malgranda</translation>
</message>
@@ -2407,10 +2259,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
<translation>Averto</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Averto: tiu ĉi versio estas eksdata. Vi bezonas ĝisdatigon!</translation>
- </message>
- <message>
<source>wallet.dat corrupt, salvage failed</source>
<translation>wallet.dat estas difektita, riparo malsukcesis</translation>
</message>
@@ -2475,10 +2323,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
<translation>Nevalida sumo por -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Nevalida sumo</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nesufiĉa mono</translation>
</message>
@@ -2511,10 +2355,6 @@ ekzemple: alertnotify=echo %%s | mail -s "Averto de Bitmono" admin@foo.com
<translation>Ŝargado finiĝis</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Por uzi la agordon %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Eraro</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts
index b701366706..17ec4dca5d 100644
--- a/src/qt/locale/bitcoin_es.ts
+++ b/src/qt/locale/bitcoin_es.ts
@@ -1,9 +1,9 @@
-<TS language="es" version="2.0">
+<TS language="es" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Haga doble clic para editar la etiqueta o dirección </translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Haz-clic para editar la dirección o etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
@@ -31,11 +31,11 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation>Borrar de la lista la dirección seleccionada</translation>
+ <translation>Eliminar la dirección seleccionada de la lista</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation>Exportar a un archivo los datos de esta pestaña</translation>
+ <translation>Exportar los datos en la ficha actual a un archivo</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -47,11 +47,11 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation>Escoja la dirección a la que enviar bitcoins</translation>
+ <translation>Elije la dirección para enviar monedas a</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation>Escoja la dirección de la que recibir bitcoins</translation>
+ <translation>Elije la dirección para recibir monedas con</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -67,11 +67,11 @@
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Estas son sus direcciones Bitcoin para enviar pagos. Compruebe siempre la cantidad y la dirección receptora antes de enviar bitcoins.</translation>
+ <translation>Estas son tus direcciones Bitcoin para enviar los pagos. Comprueba siempre la cantidad y la dirección receptora antes de enviar las monedas.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
- <translation>Estas son sus direcciones de Bitcoin para recibir pagos. Se recomienda utilizar una nueva dirección de recepción para cada transacción.</translation>
+ <translation>Estas son tus direcciones de Bitcoin para recibir los pagos. Se recomienda utilizar una nueva dirección de recepción para cada transacción.</translation>
</message>
<message>
<source>Copy &amp;Label</source>
@@ -87,17 +87,13 @@
</message>
<message>
<source>Comma separated file (*.csv)</source>
- <translation>Archivos de columnas separadas por coma (*.csv)</translation>
+ <translation>Archivos separados por coma (*.csv)</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation>Error exportando</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Se ha producido un error al intentar guardar la lista de direcciones en %1. Por favor vuelva a intentarlo.</translation>
+ <translation>Fallo al exportar</translation>
</message>
-</context>
+ </context>
<context>
<name>AddressTableModel</name>
<message>
@@ -156,10 +152,6 @@
<translation>Cambiar contraseña</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Introduzca la contraseña anterior del monedero y la nueva. </translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirmar cifrado del monedero</translation>
</message>
@@ -169,7 +161,11 @@
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
- <translation>¿Seguro que desea cifrar su monedero?</translation>
+ <translation>¿Estás seguro que deseas cifrar tu monedero ?</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Bitcoin Core se cerrará ahora para completar el procedo de encriptación. Recuerda que encriptar tu cartera no te protegerá completamente de la pérdida de bitcoins por infección de malware en tu computadora.</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>
@@ -177,7 +173,7 @@
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
- <translation>Aviso: ¡La tecla de bloqueo de mayúsculas está activada!</translation>
+ <translation>Aviso: ¡La tecla de Mayúsculas está activada!</translation>
</message>
<message>
<source>Wallet encrypted</source>
@@ -188,8 +184,8 @@
<translation>Introduzca la nueva contraseña para el monedero.&lt;br/&gt;Utilice por favor una contraseña con &lt;b&gt;diez o más caracteres aleatorios&lt;/b&gt; o con &lt;b&gt;ocho o más palabras&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin se cerrará para finalizar el proceso de cifrado. Recuerde que el cifrado de su monedero no puede proteger totalmente sus bitcoins de robo por malware que infecte su sistema.</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Introduce la antigua y la nueva contraseña de la cartera.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -311,10 +307,6 @@
<translation>Enviar bitcoins a una dirección Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modificar las opciones de configuración de Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Copia de seguridad del monedero en otra ubicación</translation>
</message>
@@ -324,7 +316,7 @@
</message>
<message>
<source>&amp;Debug window</source>
- <translation>Ventana de &amp;depuración</translation>
+ <translation>&amp;Ventana de depuración</translation>
</message>
<message>
<source>Open debugging and diagnostic console</source>
@@ -478,35 +470,37 @@
<source>Up to date</source>
<translation>Actualizado</translation>
</message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>%n bloques procesados del historial de transacciones</numerusform><numerusform>Procesados %n bloques del historial de transacciones</numerusform></translation>
- </message>
<message>
<source>Catching up...</source>
<translation>Actualizando...</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>Transacción enviada</translation>
+ <source>Date: %1
+</source>
+ <translation>Fecha: %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>Transacción entrante</translation>
+ <source>Label: %1
+</source>
+ <translation>Etiqueta: %1
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Address: %1
</source>
- <translation>Fecha: %1
-Cantidad: %2
-Tipo: %3
-Dirección: %4
+ <translation>Dirección: %1
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation>Transacción enviada</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Transacción entrante</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>El monedero está &lt;b&gt;cifrado&lt;/b&gt; y actualmente &lt;b&gt;desbloqueado&lt;/b&gt;</translation>
</message>
@@ -697,6 +691,14 @@ Dirección: %4
<translation>ninguna</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Esta etiqueta se mostrará en rojo si el tamaño de la transacción es mayor de 1000 bytes.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Esta etiqueta se mostrará en rojo si la prioridad es menor a "media"</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation>Puede variar en +/- %1 satoshi(s) por entrada.</translation>
</message>
@@ -709,10 +711,6 @@ Dirección: %4
<translation>no</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Esta etiqueta se torna roja si el tamaño de la transacción es mayor de 1000 bytes.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Esto implica que se requiere una comisión de al menos %1 por kB</translation>
</message>
@@ -725,14 +723,6 @@ Dirección: %4
<translation>Las transacciones con mayor prioridad tienen mayor probabilidad de ser incluidas en un bloque.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Esta etiqueta se torna roja si la prioridad es menor que "media".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Esta etiqueta se torna roja si cualquier destinatario recibe una cantidad menor de %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(sin etiqueta)</translation>
</message>
@@ -853,30 +843,6 @@ Dirección: %4
<source>command-line options</source>
<translation>opciones de la consola de comandos</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Opciones de interfaz de usuario</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Establecer el idioma, por ejemplo, "es_ES" (predeterminado: configuración regional del sistema)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Arrancar minimizado</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Establecer los certificados raíz SSL para solicitudes de pago (predeterminado: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Mostrar pantalla de bienvenida en el inicio (predeterminado: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Elegir directorio de datos al iniciar (predeterminado: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -959,14 +925,6 @@ Dirección: %4
<translation>&amp;Principal</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Iniciar Bitcoin automáticamente al encender el sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Iniciar Bitcoin al iniciar el sistema</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Tamaño de cache de la &amp;base de datos</translation>
</message>
@@ -1015,6 +973,14 @@ Dirección: %4
<translation>&amp;Red</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>Iniciar automáticamente Bitcoin Core al iniciar el sistema.</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>&amp;Iniciar Bitcoin Core al inicio del sistema</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = automático, &lt;0 = dejar libres ese número de núcleos)</translation>
</message>
@@ -1079,10 +1045,6 @@ Dirección: %4
<translation>&amp;Minimizar a la bandeja en vez de a la barra de tareas</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 Quit in the menu.</source>
- <translation>Minimizar en lugar de salir de la aplicación al cerrar la ventana. Cuando esta opción está activa, la aplicación solo se puede cerrar seleccionando Salir desde el menú.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimizar al cerrar</translation>
</message>
@@ -1095,10 +1057,6 @@ Dirección: %4
<translation>I&amp;dioma de la interfaz de usuario</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>El idioma de la interfaz de usuario puede establecerse aquí. Este ajuste se aplicará cuando se reinicie Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>Mostrar las cantidades en la &amp;unidad:</translation>
</message>
@@ -1135,10 +1093,6 @@ Dirección: %4
<translation>Se necesita reiniciar el cliente para activar los cambios.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>El cliente se cerrará. ¿Desea continuar?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Este cambio exige el reinicio del cliente.</translation>
</message>
@@ -1221,10 +1175,6 @@ Dirección: %4
<source>Current total balance in watch-only addresses</source>
<translation>Saldo total en las direcciones watch-only</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>desincronizado</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1245,10 +1195,6 @@ Dirección: %4
<translation>La red de solicitud de pago no coincide con la red cliente</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>La solicitud de pago ha cadiucado</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>La solicitud de pago no está inicializada</translation>
</message>
@@ -1281,14 +1227,30 @@ Dirección: %4
<translation>¡No puede leerse el archivo de solicitud de pago! Esto puede deberse a un archivo inválido de solicitud de pago.</translation>
</message>
<message>
+ <source>Payment request expired.</source>
+ <translation>Solicitud de pago caducada.</translation>
+ </message>
+ <message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>No están soportadas las peticiones inseguras a scripts de pago personalizados</translation>
</message>
<message>
+ <source>Invalid payment request.</source>
+ <translation>Petición de pago no válida.</translation>
+ </message>
+ <message>
<source>Refund from %1</source>
<translation>Devolución desde %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>La petición de pago %1 es demasiado grande (%2 bytes, permitidos %3 bytes).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation> Solicitud pago de protección DoS</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Error en la comunicación con %1: %2</translation>
</message>
@@ -1316,8 +1278,8 @@ Dirección: %4
<translation>User Agent</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>DIrección/Nombre de host</translation>
+ <source>Node/Service</source>
+ <translation>Nodo/Servicio</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1351,14 +1313,6 @@ Dirección: %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>RED</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>DESCONOCIDO</translation>
- </message>
- <message>
<source>None</source>
<translation>Ninguno</translation>
</message>
@@ -1557,16 +1511,12 @@ Dirección: %4
<translation>Archivo de registro de depuración</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Abrir el archivo de registro de depuración en el directorio actual de datos. Esto puede llevar varios segundos para archivos de registro grandes.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Borrar consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bienvenido a la consola RPC de Bitcoin</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Bienvenido a la consola RPC de Bitcoin Core.</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
@@ -1849,18 +1799,38 @@ Dirección: %4
<translation>Comisión de Transacción:</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Minimizar</translation>
+ <source>Choose...</source>
+ <translation>Elija...</translation>
+ </message>
+ <message>
+ <source>collapse fee-settings</source>
+ <translation>Colapsar ajustes de cuota</translation>
</message>
<message>
<source>per kilobyte</source>
<translation>por kilobyte</translation>
</message>
<message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>Si la tarifa de aduana se establece en 1000 satoshis y la transacción está a sólo 250 bytes, entonces "por kilobyte" sólo paga 250 satoshis de cuota, mientras que "el mínimo total" pagaría 1.000 satoshis. Para las transacciones más grandes que un kilobyte ambos pagan por kilobyte</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation>Ocultar</translation>
+ </message>
+ <message>
<source>total at least</source>
<translation>total por lo menos</translation>
</message>
<message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>Pagando solamente la cuota mínima es correcto, siempre y cuando haya menos volumen de transacciones que el espacio en los bloques. Pero tenga en cuenta que esto puede terminar en una transacción nunca confirmada, una vez que haya más demanda para transacciones Bitcoin que la red pueda procesar.</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(leer la sugerencia)</translation>
+ </message>
+ <message>
<source>Recommended:</source>
<translation>Recomendado:</translation>
</message>
@@ -1885,6 +1855,10 @@ Dirección: %4
<translation>rápido</translation>
</message>
<message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Enviar transacción, si es posible, sin comisión</translation>
+ </message>
+ <message>
<source>(confirmation may take longer)</source>
<translation>(confirmación puede tardar más tiempo)</translation>
</message>
@@ -1965,10 +1939,6 @@ Dirección: %4
<translation>o</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>La dirección de recepción no es válida, compruébela de nuevo.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>La cantidad por pagar tiene que ser mayor de 0.</translation>
</message>
@@ -1981,10 +1951,6 @@ Dirección: %4
<translation>El total sobrepasa su saldo cuando se incluye la tasa de envío de %1</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Se ha encontrado una dirección duplicada. Solo se puede enviar a cada dirección una vez por operación de envío.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>¡Ha fallado la creación de la transacción!</translation>
</message>
@@ -1993,12 +1959,12 @@ Dirección: %4
<translation>¡La transacción fue rechazada! Esto puede haber ocurrido si alguno de los bitcoins de su monedero ya estaba gastado o si ha usado una copia de wallet.dat y los bitcoins estaban gastados en la copia pero no se habían marcado como gastados aqui.</translation>
</message>
<message>
- <source>Pay only the minimum fee of %1</source>
- <translation>Paga sólo la cuota mínima de %1</translation>
+ <source>Payment request expired.</source>
+ <translation>Solicitud de pago caducada.</translation>
</message>
<message>
- <source>Estimated to begin confirmation within %1 block(s).</source>
- <translation>Estimado para comenzar confirmación dentro de %1 bloque(s)</translation>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Paga sólo la cuota mínima de %1</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
@@ -2072,12 +2038,20 @@ Dirección: %4
<translation>Eliminar esta transacción</translation>
</message>
<message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation>Restar comisiones a la cantidad</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Mensaje:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Esto es una petición de pago verificado.</translation>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>Esta es una petición de pago no autentificada.</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>Esta es una petición de pago autentificada.</translation>
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
@@ -2088,10 +2062,6 @@ Dirección: %4
<translation>Un mensaje que se adjuntó a la bitcoin: URL que será almacenada con la transacción para su referencia. Nota: Este mensaje no se envía a través de la red Bitcoin.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Esto es una petición de pago no verificado.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Paga a:</translation>
</message>
@@ -2122,10 +2092,6 @@ Dirección: %4
<translation>&amp;Firmar mensaje</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Puede firmar mensajes con sus direcciones para demostrar que las posee. Tenga cuidado de no firmar cualquier cosa vaga, ya que los ataques de phishing pueden tratar de engañarle para suplantar su identidad. Firme solo declaraciones totalmente detalladas con las que usted esté de acuerdo.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>Dirección Bitcoin con la que firmar el mensaje</translation>
</message>
@@ -2178,10 +2144,6 @@ Dirección: %4
<translation>&amp;Verificar mensaje</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Introduzca la dirección para la firma, el mensaje (asegurándose de copiar tal cual los saltos de línea, espacios, tabulaciones, etc.) y la firma a continuación para verificar el mensaje. Tenga cuidado de no asumir más información de lo que dice el propio mensaje firmado para evitar fraudes basados en ataques de tipo man-in-the-middle.</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>La dirección Bitcoin con la que se firmó el mensaje</translation>
</message>
@@ -2445,10 +2407,6 @@ Dirección: %4
<translation>Tipo</translation>
</message>
<message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>No vencidos (%1 confirmaciones. Estarán disponibles al cabo de %2)</translation>
</message>
@@ -2477,6 +2435,10 @@ Dirección: %4
<translation>Sin conexión</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Sin confirmar</translation>
</message>
@@ -2533,10 +2495,6 @@ Dirección: %4
<translation>Sea o no una dirección sólo está involucrada en esta transacción.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Dirección de destino de la transacción.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Cantidad retirada o añadida al saldo.</translation>
</message>
@@ -2779,30 +2737,6 @@ Dirección: %4
<translation>Aceptar conexiones desde el exterior (predeterminado: 1 si no -proxy o -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, debe establecer un valor rpcpassword en el archivo de configuración:
-%s
-Se recomienda utilizar la siguiente contraseña aleatoria:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(no es necesario recordar esta contraseña)
-El nombre de usuario y la contraseña DEBEN NO ser iguales.
-Si el archivo no existe, créelo con permisos de archivo de solo lectura.
-Se recomienda también establecer alertnotify para recibir notificaciones de problemas.
-Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Vincular a la dirección dada y escuchar siempre en ella. Utilice la notación [host]:port para IPv6</translation>
</message>
@@ -2819,14 +2753,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ingresar en el modo de prueba de regresión, que utiliza una cadena especial en la que los bloques se pueden resolver instantáneamente.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>¡Error: se ha rechazado la transacción! Esto puede ocurrir si ya se han gastado algunos de los bitcoins del monedero, como ocurriría si hubiera hecho una copia de wallet.dat y se hubieran gastado bitcoins a partir de la copia, con lo que no se habrían marcado aquí como gastados.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>¡Error: Esta transacción requiere una comisión de al menos %s debido a su cantidad, complejidad, o al uso de fondos recién recibidos!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Ejecutar comando cuando una transacción del monedero cambia (%s en cmd se remplazará por TxID)</translation>
</message>
@@ -2903,10 +2829,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opciones de depuración/pruebas:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Descubrir dirección IP propia (predeterminado: 1 al escuchar sin -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>No cargar el monedero y desactivar las llamadas RPC del monedero</translation>
</message>
@@ -2939,10 +2861,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Error: ¡Espacio en disco bajo!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Error: ¡El monedero está bloqueado; no se puede crear la transacción!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Ha fallado la escucha en todos los puertos. Use -listen=0 si desea esto.</translation>
</message>
@@ -2971,10 +2889,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Sólo conectar a nodos en redes &lt;net&gt; (ipv4, ipv6 o onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Reconstruir el índice de la cadena de bloques a partir de los archivos blk000??.dat actuales</translation>
- </message>
- <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>Asignar tamaño de cache en megabytes (entre %d y %d; predeterminado: %d)</translation>
</message>
@@ -3011,6 +2925,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opciones de monedero:</translation>
</message>
<message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>Peligro: Esta versión es obsoleta; actualización requerida!</translation>
+ </message>
+ <message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>Usted necesita reconstruir la base de datos utilizando -reindex para cambiar -txindex</translation>
</message>
@@ -3039,10 +2957,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>No se ha podido bloquear el directorio de datos %s. Probablemente ya se está ejecutando Bitcoin Core.</translation>
</message>
<message>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
- <translation>Limitar continuamente las transacciones gratuitas a &lt;n&gt;*1000 bytes por minuto (predeterminado:%u)</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Crear nuevos archivos con permisos por defecto del sistema, en lugar de umask 077 (sólo efectivo con la funcionalidad de monedero desactivada)</translation>
</message>
@@ -3067,6 +2981,14 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Tarifas (en BTC/Kb) más pequeños que esto se consideran cero cuota para la creación de la transacción (por defecto: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Si el pago de comisión no está establecido, incluir la cuota suficiente para que las transacciones comiencen la confirmación en una media de n bloques ( por defecto :%u)</translation>
+ </message>
+ <message>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>El tamaño máximo de los datos en las operaciones de transporte de datos que transmitimos y el mio (default: %u)</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Consulta de direcciones pares mediante búsqueda de DNS, si bajo en direcciones (por defecto: 1 a menos que - conectar)</translation>
</message>
@@ -3075,10 +2997,42 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Establecer tamaño máximo de las transacciones de alta prioridad/baja comisión en bytes (predeterminado: %d)</translation>
</message>
<message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>Ajuste el número de hilos para la generación de moneda si está habilitado (-1 = all cores, default: %d)</translation>
+ </message>
+ <message>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation>Este producto incluye software desarrollado por el OpenSSL Project para su uso en OpenSSL Toolkit &lt;https://www.openssl.org/&gt;, software de cifrado escrito por Eric Young y software UPnP escrito por Thomas Bernard.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>Para utilizar bitcoind, o la -opción servidor a bitcoin-qt, debes establecer una rpcpassword en el fichero de configuración:
+%s
+Se recomienda utilizar la siguiente contraseña aleatoria:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(no es necesario que recuerdes esta contraseña)
+El nombre de usuario y contraseña NO DEBEN ser la misma.
+Si no existe el archivo, crearlo con los permisos de archivos de propietarios de -sólo lectura-.
+También se recomienda establecer una notificación de alerta para ser notificado de problemas;
+por ejemplo: alertnotify=echo %% s | correo -s "Alerta Bitcoin" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Advertencia: ¡-maxtxfee se establece muy alta! Esta gran tarifa podría ser pagada en una sola transacción .</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Aviso: ¡Comprueba la fecha y hora de tu ordenador y verifica si es correcta! Si no es correcta Bitcoin Core no funcionará adecuadamente.</translation>
</message>
@@ -3087,6 +3041,18 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>A los equipos en lista blanca no se les pueden prohibir los ataques DoS y sus transacciones siempre son retransmitidas, incluso si ya están en el mempool, es útil por ejemplo para un gateway.</translation>
</message>
<message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Aceptar solicitudes públicas en FERIADOS (por defecto: %u)</translation>
+ </message>
+ <message>
+ <source>Cannot resolve -whitebind address: '%s'</source>
+ <translation>No se puede resolver -whitebind address: '%s'</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Elegir directorio de datos al iniciar (predeterminado: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Conectar usando SOCKS5 proxy</translation>
</message>
@@ -3095,10 +3061,22 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Copyright (C) 2009-%i The Bitcoin Core Developers</translation>
</message>
<message>
+ <source>Could not parse -rpcbind value %s as network address</source>
+ <translation>No se pudo analizar -rpcbind valor%s como dirección de red</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
<translation>Error al cargar wallet.dat: El monedero requiere una versión más reciente de Bitcoin Core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Error al leer la base de datos, cerrando.</translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -tor found, use -onion.</source>
+ <translation>Error: Argumento encontrado -tor no soportado, utilice -onion</translation>
+ </message>
+ <message>
<source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
<translation>Cuota (in BTC/kB) para añadir a las transacciones que envíes (por defecto: %s)</translation>
</message>
@@ -3111,6 +3089,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>La inicialización de la verificación de validez falló. Se está apagando Bitcoin Core.</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Monto inválido para -maxtxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Cantidad inválida para -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
</message>
@@ -3127,10 +3109,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Máscara de red inválida especificada en -whitelist: '%s'</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Mantener como máximo &lt;n&gt; bloques no conectables en memoria (por defecto: %u)</translation>
- </message>
- <message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>Mantener como máximo &lt;n&gt; transacciones no conectables en memoria (por defecto: %u)</translation>
</message>
@@ -3143,10 +3121,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opciones de nodos de retransmisión:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Imprimir bloque al iniciar, si se encuentra en el índice de bloques</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Opciones SSL de RPC: (véase la wiki de Bitcoin para las instrucciones de instalación de SSL)</translation>
</message>
@@ -3155,6 +3129,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Opciones de servidor RPC:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>Soporte RPC para conexiones HTTP persistentes (por defecto: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Ignorar 1 de cada &lt;n&gt; mensajes de red al azar</translation>
</message>
@@ -3167,10 +3145,26 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Enviar información de trazas/depuración a la consola en lugar de al archivo debug.log</translation>
</message>
<message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>Mandar transacciones como comisión-cero si es posible (por defecto: %u)</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Establecer los certificados raíz SSL para solicitudes de pago (predeterminado: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Establecer el idioma, por ejemplo, "es_ES" (predeterminado: configuración regional del sistema)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Muestra todas las opciones de depuración (uso: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Mostrar pantalla de bienvenida en el inicio (predeterminado: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Reducir el archivo debug.log al iniciar el cliente (predeterminado: 1 sin -debug)</translation>
</message>
@@ -3179,6 +3173,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Transacción falló</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Arrancar minimizado</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Este software es experimental.</translation>
</message>
@@ -3191,6 +3189,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Las cantidades en las transacciones deben ser positivas</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Operación demasiado grande para la política de tasas</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Transacción demasiado grande</translation>
</message>
@@ -3216,8 +3218,8 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Aviso</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Aviso: Esta versión es obsoleta, actualización necesaria!</translation>
+ <source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Advertencia: Argumento no soportado -benchmark ignored, use -debug=bench.</translation>
</message>
<message>
<source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source>
@@ -3275,6 +3277,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Error al cargar wallet.dat: el monedero está dañado</translation>
</message>
<message>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</translation>
+ </message>
+ <message>
<source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</source>
<translation>Volcar la actividad de la base de datos de memoria al registro en disco cada &lt;n&gt; megabytes (predeterminado: %u)</translation>
</message>
@@ -3375,14 +3381,14 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Anteponer marca temporal a la información de depuración (por defecto: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Imprimir árbol de bloques al iniciar (predeterminado: %u)</translation>
- </message>
- <message>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation>Retransmitir y minar transacciones de transporte de datos (por defecto: %u)</translation>
</message>
<message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>Relay non-P2SH multisig (default: %u)</translation>
+ </message>
+ <message>
<source>Run a thread to flush wallet periodically (default: %u)</source>
<translation>Ejecutar un hilo para limpiar de la memoria el monedero periódicamente (predeterminado: %u)</translation>
</message>
@@ -3451,10 +3457,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Cantidad inválida para -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Cuantía no válida</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fondos insuficientes</translation>
</message>
@@ -3487,10 +3489,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Se terminó de cargar</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Para utilizar la opción %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Error</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_CL.ts b/src/qt/locale/bitcoin_es_CL.ts
index e6f81e650f..f50aa49110 100644
--- a/src/qt/locale/bitcoin_es_CL.ts
+++ b/src/qt/locale/bitcoin_es_CL.ts
@@ -1,27 +1,47 @@
-<TS language="es_CL" version="2.0">
+<TS language="es_CL" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Haz doble clic para editar una dirección o etiqueta</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Haga clic para editar la dirección o etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
- <translation>Crea una nueva dirección</translation>
+ <translation>Crea una nueva direCrea una nueva direccióncción</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation>y nueva</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
<translation>Copia la dirección seleccionada al portapapeles</translation>
</message>
<message>
+ <source>&amp;Copy</source>
+ <translation>y copiar</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>C y perder</translation>
+ </message>
+ <message>
<source>&amp;Copy Address</source>
<translation>&amp;Copia dirección</translation>
</message>
<message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Eliminar la dirección seleccionada de la lista</translation>
+ </message>
+ <message>
<source>Export the data in the current tab to a file</source>
<translation>Exportar los datos de la pestaña actual a un archivo</translation>
</message>
<message>
+ <source>&amp;Export</source>
+ <translation>y exportar</translation>
+ </message>
+ <message>
<source>&amp;Delete</source>
<translation>&amp;Borrar</translation>
</message>
@@ -92,10 +112,6 @@
<translation>Cambia contraseña</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Introduce la contraseña anterior y la nueva de cartera</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirma la codificación de cartera</translation>
</message>
@@ -120,10 +136,6 @@
<translation>Billetera codificada</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin se cerrará para finalizar el proceso de encriptación. Recuerde que encriptar su billetera no protegera completatamente sus bitcoins de ser robados por malware que infecte su computador</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Falló la codificación de la billetera</translation>
</message>
@@ -211,6 +223,14 @@
<translation>&amp;Cambiar la contraseña...</translation>
</message>
<message>
+ <source>Open &amp;URI...</source>
+ <translation>Abrir y url...</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core client</source>
+ <translation>cliente bitcoin core</translation>
+ </message>
+ <message>
<source>Reindexing blocks on disk...</source>
<translation>Cargando el index de bloques...</translation>
</message>
@@ -219,10 +239,6 @@
<translation>Enviar monedas a una dirección bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modifica las opciones de configuración de bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Respaldar billetera en otra ubicación</translation>
</message>
@@ -251,6 +267,10 @@
<translation>&amp;Envía</translation>
</message>
<message>
+ <source>&amp;Receive</source>
+ <translation>y recibir</translation>
+ </message>
+ <message>
<source>&amp;Show / Hide</source>
<translation>&amp;Mostrar/Ocultar</translation>
</message>
@@ -274,21 +294,9 @@
<source>Tabs toolbar</source>
<translation>Barra de pestañas</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n conexión activa hacia la red Bitcoin</numerusform><numerusform>%n conexiones activas hacia la red Bitcoin</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n hora</numerusform><numerusform>%n horas</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n día</numerusform><numerusform>%n días</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n semana</numerusform><numerusform>%n semanas</numerusform></translation>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>bitcoin core</translation>
</message>
<message>
<source>Error</source>
@@ -319,17 +327,6 @@
<translation>Transacción entrante</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Fecha: %1
-Cantidad: %2
-Tipo: %3
-Dirección: %4</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>La billetera esta &lt;b&gt;codificada&lt;/b&gt; y actualmente &lt;b&gt;desbloqueda&lt;/b&gt;</translation>
</message>
@@ -364,6 +361,10 @@ Dirección: %4</translation>
<translation>Confirmado</translation>
</message>
<message>
+ <source>Priority</source>
+ <translation>prioridad</translation>
+ </message>
+ <message>
<source>Copy address</source>
<translation>Copia dirección</translation>
</message>
@@ -376,6 +377,18 @@ Dirección: %4</translation>
<translation>Copiar Cantidad</translation>
</message>
<message>
+ <source>medium</source>
+ <translation>medio</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>si</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>no</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation>(sin etiqueta)</translation>
</message>
@@ -437,6 +450,10 @@ Dirección: %4</translation>
<context>
<name>HelpMessageDialog</name>
<message>
+ <source>Bitcoin Core</source>
+ <translation>bitcoin core</translation>
+ </message>
+ <message>
<source>version</source>
<translation>versión</translation>
</message>
@@ -444,18 +461,17 @@ Dirección: %4</translation>
<source>Usage:</source>
<translation>Uso:</translation>
</message>
+ </context>
+<context>
+ <name>Intro</name>
<message>
- <source>UI options</source>
- <translation>UI opciones</translation>
+ <source>Welcome</source>
+ <translation>bienvenido</translation>
</message>
<message>
- <source>Start minimized</source>
- <translation>Arranca minimizado
-</translation>
+ <source>Bitcoin Core</source>
+ <translation>bitcoin core</translation>
</message>
- </context>
-<context>
- <name>Intro</name>
<message>
<source>Error</source>
<translation>Error</translation>
@@ -463,6 +479,10 @@ Dirección: %4</translation>
</context>
<context>
<name>OpenURIDialog</name>
+ <message>
+ <source>URI:</source>
+ <translation>url:</translation>
+ </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -475,14 +495,6 @@ Dirección: %4</translation>
<translation>&amp;Principal</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Inicia Bitcoin automáticamente despues de encender el computador</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Inicia Bitcoin al iniciar el sistema</translation>
- </message>
- <message>
<source>Reset all client options to default.</source>
<translation>Reestablece todas las opciones.</translation>
</message>
@@ -491,6 +503,10 @@ Dirección: %4</translation>
<translation>&amp;Red</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation>experto</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>Abre automáticamente el puerto del cliente Bitcoin en el router. Esto funciona solo cuando tu router es compatible con UPnP y está habilitado.</translation>
</message>
@@ -511,6 +527,11 @@ Dirección: %4</translation>
<translation>Puerto del servidor proxy (ej. 9050)</translation>
</message>
<message>
+ <source>&amp;Window</source>
+ <translation>y windows
+</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation>Muestra solo un ícono en la bandeja después de minimizar la ventana</translation>
</message>
@@ -519,10 +540,6 @@ Dirección: %4</translation>
<translation>&amp;Minimiza a la bandeja en vez de la barra de tareas</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 Quit in the menu.</source>
- <translation>Minimiza la ventana en lugar de salir del programa cuando la ventana se cierra. Cuando esta opción esta activa el programa solo se puede cerrar seleccionando Salir desde el menu.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimiza a la bandeja al cerrar</translation>
</message>
@@ -565,11 +582,7 @@ Dirección: %4</translation>
<source>Total:</source>
<translation>Total:</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>desincronizado</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -621,6 +634,10 @@ Dirección: %4</translation>
<translation>&amp;Información</translation>
</message>
<message>
+ <source>General</source>
+ <translation>General</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Tiempo de inicio</translation>
</message>
@@ -641,6 +658,11 @@ Dirección: %4</translation>
<translation>Bloquea cadena</translation>
</message>
<message>
+ <source>Version</source>
+ <translation>version
+</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation>&amp;Abrir</translation>
</message>
@@ -773,10 +795,6 @@ Dirección: %4</translation>
<translation>Copiar Cantidad</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>La dirección de destinatarion no es valida, comprueba otra vez.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>La cantidad por pagar tiene que ser mayor 0.</translation>
</message>
@@ -789,10 +807,6 @@ Dirección: %4</translation>
<translation>El total sobrepasa tu saldo cuando se incluyen %1 como tasa de envio.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Tienes una dirección duplicada, solo puedes enviar a direcciónes individuales de una sola vez.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(sin etiqueta)</translation>
</message>
@@ -909,6 +923,10 @@ Dirección: %4</translation>
<context>
<name>SplashScreen</name>
<message>
+ <source>Bitcoin Core</source>
+ <translation>bitcoin core</translation>
+ </message>
+ <message>
<source>[testnet]</source>
<translation>[red-de-pruebas]</translation>
</message>
@@ -1010,10 +1028,6 @@ Dirección: %4</translation>
<source>, has not been successfully broadcast yet</source>
<translation>, no ha sido emitido satisfactoriamente todavía</translation>
</message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Abierto para %n bloque más</numerusform><numerusform>Abierto para %n bloques más</numerusform></translation>
- </message>
<message>
<source>unknown</source>
<translation>desconocido</translation>
@@ -1041,10 +1055,6 @@ Dirección: %4</translation>
<translation>Tipo</translation>
</message>
<message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Abierto hasta %1</translation>
</message>
@@ -1061,6 +1071,10 @@ Dirección: %4</translation>
<translation>Generado pero no acceptado</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Recibido con</translation>
</message>
@@ -1097,10 +1111,6 @@ Dirección: %4</translation>
<translation>Tipo de transacción.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Dirección de destino para la transacción</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Cantidad restada o añadida al balance</translation>
</message>
@@ -1236,6 +1246,10 @@ Dirección: %4</translation>
<context>
<name>WalletView</name>
<message>
+ <source>&amp;Export</source>
+ <translation>y exportar</translation>
+ </message>
+ <message>
<source>Export the data in the current tab to a file</source>
<translation>Exportar los datos de la pestaña actual a un archivo</translation>
</message>
@@ -1309,6 +1323,11 @@ Dirección: %4</translation>
<translation>Enviar informacion de seguimiento a la consola en vez del archivo debug.log</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Arranca minimizado
+</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
<translation>Intenta usar UPnP para mapear el puerto de escucha (default: 1 when listening)</translation>
</message>
@@ -1322,10 +1341,6 @@ Dirección: %4</translation>
<translation>Atención</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Advertencia: Esta versión está obsoleta, se necesita actualizar!</translation>
- </message>
- <message>
<source>wallet.dat corrupt, salvage failed</source>
<translation>wallet.dat corrompió, guardado fallido</translation>
</message>
@@ -1379,10 +1394,6 @@ Dirección: %4</translation>
<translation>Cantidad inválida para -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Cantidad inválida</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fondos insuficientes</translation>
</message>
@@ -1407,10 +1418,6 @@ Dirección: %4</translation>
<translation>Carga completa</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Para utilizar la opción %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Error</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_DO.ts b/src/qt/locale/bitcoin_es_DO.ts
index 2e5daf4cdb..d2cdf87a0e 100644
--- a/src/qt/locale/bitcoin_es_DO.ts
+++ b/src/qt/locale/bitcoin_es_DO.ts
@@ -1,11 +1,7 @@
-<TS language="es_DO" version="2.0">
+<TS language="es_DO" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Haga doble clic para editar una dirección o etiqueta</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Crear una nueva dirección</translation>
</message>
@@ -152,10 +148,6 @@
<translation>Cambiar contraseña</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Introduzca la contraseña anterior de la cartera y la nueva. </translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirmar cifrado de la cartera</translation>
</message>
@@ -180,10 +172,6 @@
<translation>Monedero cifrado</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin se cerrará para finalizar el proceso de cifrado. Recuerde que el cifrado de su monedero no puede proteger totalmente sus bitcoins de robo por malware que infecte su sistema.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Ha fallado el cifrado del monedero</translation>
</message>
@@ -299,10 +287,6 @@
<translation>Enviar monedas a una dirección Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modificar las opciones de configuración de Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Copia de seguridad del monedero en otra ubicación</translation>
</message>
@@ -447,18 +431,6 @@
<translation>Transacción entrante</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Fecha: %1
-Cantidad: %2
-Tipo: %3
-Dirección: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>El monedero está &lt;b&gt;cifrado&lt;/b&gt; y actualmente &lt;b&gt;desbloqueado&lt;/b&gt;</translation>
</message>
@@ -637,10 +609,6 @@ Dirección: %4
<translation>no</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Esta etiqueta se torna roja si el tamaño de la transación es mayor a 1000 bytes.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Esto implica que se requiere una tarifa de al menos %1 por kB</translation>
</message>
@@ -653,14 +621,6 @@ Dirección: %4
<translation>Las transacciones con alta prioridad son más propensas a ser incluidas dentro de un bloque.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Esta etiqueta se convierte en rojo, si la prioridad es menor que "medio".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Esta etiqueta se torna roja si cualquier destinatario recibe una cantidad menor a %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(sin etiqueta)</translation>
</message>
@@ -777,26 +737,6 @@ Dirección: %4
<source>command-line options</source>
<translation>opciones de la línea de órdenes</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Opciones GUI</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Establecer el idioma, por ejemplo, "es_ES" (predeterminado: configuración regional del sistema)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Arrancar minimizado</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Mostrar pantalla de bienvenida en el inicio (predeterminado: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Elegir directorio de datos al iniciar (predeterminado: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -867,14 +807,6 @@ Dirección: %4
<translation>&amp;Principal</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Iniciar Bitcoin automáticamente al encender el sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Iniciar Bitcoin al iniciar el sistema</translation>
- </message>
- <message>
<source>MB</source>
<translation>MB</translation>
</message>
@@ -931,10 +863,6 @@ Dirección: %4
<translation>&amp;Minimizar a la bandeja en vez de a la barra de tareas</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 Quit in the menu.</source>
- <translation>Minimizar en lugar de salir de la aplicación al cerrar la ventana. Cuando esta opción está activa, la aplicación solo se puede cerrar seleccionando Salir desde el menú.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimizar al cerrar</translation>
</message>
@@ -947,10 +875,6 @@ Dirección: %4
<translation>I&amp;dioma de la interfaz de usuario</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>El idioma de la interfaz de usuario puede establecerse aquí. Este ajuste se aplicará cuando se reinicie Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>Mostrar las cantidades en la &amp;unidad:</translation>
</message>
@@ -1029,11 +953,7 @@ Dirección: %4
<source>Your current total balance</source>
<translation>Su balance actual total</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>desincronizado</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -1217,18 +1137,10 @@ Dirección: %4
<translation>Archivo de registro de depuración</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Abrir el archivo de registro de depuración en el directorio actual de datos. Esto puede llevar varios segundos para archivos de registro grandes.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Borrar consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bienvenido a la consola RPC de Bitcoin</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Use las flechas arriba y abajo para navegar por el historial y &lt;b&gt;Control+L&lt;/b&gt; para limpiar la pantalla.</translation>
</message>
@@ -1525,10 +1437,6 @@ Dirección: %4
<translation>o</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>La dirección de recepción no es válida, compruébela de nuevo.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>La cantidad por pagar tiene que ser mayor de 0.</translation>
</message>
@@ -1541,10 +1449,6 @@ Dirección: %4
<translation>El total sobrepasa su saldo cuando se incluye la tasa de envío de %1</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Se ha encontrado una dirección duplicada. Solo se puede enviar a cada dirección una vez por operación de envío.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>¡Ha fallado la creación de la transacción!</translation>
</message>
@@ -1616,18 +1520,10 @@ Dirección: %4
<translation>Eliminar esta transacción</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Esto es una petición de pago verificado.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Introduce una etiqueta para esta dirección para añadirla a la lista de direcciones utilizadas</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Esto es una petición de pago no verificado.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Paga a:</translation>
</message>
@@ -1650,10 +1546,6 @@ Dirección: %4
<translation>&amp;Firmar mensaje</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Puede firmar mensajes con sus direcciones para demostrar que las posee. Tenga cuidado de no firmar cualquier cosa vaga, ya que los ataques de phishing pueden tratar de engañarle para suplantar su identidad. Firme solo declaraciones totalmente detalladas con las que usted esté de acuerdo.</translation>
- </message>
- <message>
<source>Choose previously used address</source>
<translation>Escoger dirección previamente usada</translation>
</message>
@@ -1702,10 +1594,6 @@ Dirección: %4
<translation>&amp;Verificar mensaje</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Introduzca la dirección para la firma, el mensaje (asegurándose de copiar tal cual los saltos de línea, espacios, tabulaciones, etc.) y la firma a continuación para verificar el mensaje. Tenga cuidado de no asumir más información de lo que dice el propio mensaje firmado para evitar fraudes basados en ataques de tipo man-in-the-middle.</translation>
- </message>
- <message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
<translation>Verificar el mensaje para comprobar que fue firmado con la dirección Bitcoin indicada</translation>
</message>
@@ -1937,10 +1825,6 @@ Dirección: %4
<translation>Tipo</translation>
</message>
<message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Abierto hasta %1</translation>
</message>
@@ -1957,6 +1841,10 @@ Dirección: %4
<translation>Generado pero no aceptado</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Recibido con</translation>
</message>
@@ -1993,10 +1881,6 @@ Dirección: %4
<translation>Tipo de transacción.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Dirección de destino de la transacción.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Cantidad retirada o añadida al saldo.</translation>
</message>
@@ -2231,42 +2115,10 @@ Dirección: %4
<translation>Aceptar conexiones desde el exterior (predeterminado: 1 si no -proxy o -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, debe establecer un valor rpcpassword en el archivo de configuración:
-%s
-Se recomienda utilizar la siguiente contraseña aleatoria:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(no es necesario recordar esta contraseña)
-El nombre de usuario y la contraseña DEBEN NO ser iguales.
-Si el archivo no existe, créelo con permisos de archivo de solo lectura.
-Se recomienda también establecer alertnotify para recibir notificaciones de problemas.
-Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Vincular a la dirección dada y escuchar siempre en ella. Utilice la notación [host]:port para IPv6</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>¡Error: se ha rechazado la transacción! Esto puede ocurrir si ya se han gastado algunas de las monedas del monedero, como ocurriría si hubiera hecho una copia de wallet.dat y se hubieran gastado monedas a partir de la copia, con lo que no se habrían marcado aquí como gastadas.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>¡Error: Esta transacción requiere una comisión de al menos %s debido a su monto, complejidad, o al uso de fondos recién recibidos!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Ejecutar comando cuando una transacción del monedero cambia (%s en cmd se remplazará por TxID)</translation>
</message>
@@ -2315,10 +2167,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Corrupción de base de datos de bloques detectada.</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Descubrir dirección IP propia (predeterminado: 1 al escuchar sin -externalip)</translation>
- </message>
- <message>
<source>Do you want to rebuild the block database now?</source>
<translation>¿Quieres reconstruir la base de datos de bloques ahora?</translation>
</message>
@@ -2343,10 +2191,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Error: ¡Espacio en disco bajo!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Error: ¡El monedero está bloqueado; no se puede crear la transacción!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Ha fallado la escucha en todos los puertos. Use -listen=0 si desea esto.</translation>
</message>
@@ -2367,10 +2211,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>No hay suficientes descriptores de archivo disponibles. </translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Reconstruir el índice de la cadena de bloques a partir de los archivos blk000??.dat actuales</translation>
- </message>
- <message>
<source>Set maximum block size in bytes (default: %d)</source>
<translation>Establecer tamaño máximo de bloque en bytes (por defecto: %d)</translation>
</message>
@@ -2407,6 +2247,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Establecer tamaño máximo de las transacciones de alta prioridad/comisión baja en bytes (por defecto: %d)</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Elegir directorio de datos al iniciar (predeterminado: 0)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Información</translation>
</message>
@@ -2419,10 +2263,34 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Inválido por el monto -mintxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
+ <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
+ <translation>Opciones RPC SSL: (Vea la Wiki de Bitcoin para las instrucciones de la configuración de SSL)</translation>
+ </message>
+ <message>
+ <source>RPC server options:</source>
+ <translation>Opciones del sservidor RPC:</translation>
+ </message>
+ <message>
+ <source>Randomly drop 1 of every &lt;n&gt; network messages</source>
+ <translation>Descartar aleatoriamente 1 de cada &lt;n&gt; mensajes de red</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Enviar información de trazas/depuración a la consola en lugar de al archivo debug.log</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Establecer el idioma, por ejemplo, "es_ES" (predeterminado: configuración regional del sistema)</translation>
+ </message>
+ <message>
+ <source>Show all debugging options (usage: --help -help-debug)</source>
+ <translation>Mostrar todas las opciones de depuración (uso: --help -help-debug)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Mostrar pantalla de bienvenida en el inicio (predeterminado: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Reducir el archivo debug.log al iniciar el cliente (predeterminado: 1 sin -debug)</translation>
</message>
@@ -2431,6 +2299,10 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Transacción falló</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Arrancar minimizado</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Monto de la transacción muy pequeño</translation>
</message>
@@ -2456,8 +2328,8 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Aviso</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Aviso: Esta versión es obsoleta, actualización necesaria!</translation>
+ <source>on startup</source>
+ <translation>al iniciar</translation>
</message>
<message>
<source>wallet.dat corrupt, salvage failed</source>
@@ -2527,10 +2399,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Cantidad inválida para -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Cuantía no válida</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fondos insuficientes</translation>
</message>
@@ -2563,10 +2431,6 @@ Por ejemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Generado pero no aceptado</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Para utilizar la opción %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Error</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_MX.ts b/src/qt/locale/bitcoin_es_MX.ts
index bedc5d243e..4238330105 100644
--- a/src/qt/locale/bitcoin_es_MX.ts
+++ b/src/qt/locale/bitcoin_es_MX.ts
@@ -1,11 +1,7 @@
-<TS language="es_MX" version="2.0">
+<TS language="es_MX" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Haga doble clic para editar el domicilio o la etiqueta</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Crear una dirección nueva</translation>
</message>
@@ -87,11 +83,11 @@
</message>
<message>
<source>Comma separated file (*.csv)</source>
- <translation>Archivo separado por comas (*.CSV)</translation>
+ <translation>Arhchivo separado por comas (*.CSV)</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation>Fallo en la exportación</translation>
+ <translation>Exportación fallida</translation>
</message>
</context>
<context>
@@ -125,7 +121,7 @@
</message>
<message>
<source>Encrypt wallet</source>
- <translation>Cartera encriptada.</translation>
+ <translation>Encriptar cartera.</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
@@ -141,17 +137,13 @@
</message>
<message>
<source>Decrypt wallet</source>
- <translation>Desencriptar la cartera</translation>
+ <translation>Desencriptar cartera</translation>
</message>
<message>
<source>Change passphrase</source>
<translation>Cambiar contraseña</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Ingrese la antugüa y nueva contraseña de la cartera</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirmar la encriptación de cartera</translation>
</message>
@@ -172,12 +164,8 @@
<translation>Cartera encriptada</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin se cerrará para finalizar el proceso de encriptación. Recuerda que encriptar tu cartera no protege completamente a tus bitcoins de ser robadas por malware infectando tu computadora.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
- <translation>La encriptación de la cartera falló</translation>
+ <translation>Encriptación de la cartera fallida</translation>
</message>
<message>
<source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
@@ -189,11 +177,11 @@
</message>
<message>
<source>Wallet unlock failed</source>
- <translation>El desbloqueo de la cartera Fallo</translation>
+ <translation>El desbloqueo de la cartera falló</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation>La contraseña ingresada para la des encriptación de la cartera es incorrecto</translation>
+ <translation>La contraseña ingresada para la desencriptación de la cartera es incorrecto</translation>
</message>
<message>
<source>Wallet decryption failed</source>
@@ -291,10 +279,6 @@
<translation>Enviar monedas a una dirección Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modificar las opciones de configuración de Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Respaldar cartera en otra ubicación</translation>
</message>
@@ -342,10 +326,6 @@
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
<translation>Mostrar mensaje de ayuda del nucleo de Bitcoin para optener una lista con los posibles comandos de Bitcoin</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n Activar conexión a la red de Bitcoin</numerusform><numerusform>%n Activar conexiones a la red de Bitcoin</numerusform></translation>
- </message>
<message>
<source>Up to date</source>
<translation>Actualizado al dia </translation>
@@ -517,26 +497,6 @@
<source>command-line options</source>
<translation>Opciones de comando de lineas</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Opciones de interfaz</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Definir idioma, por ejemplo "de_DE" (por defecto: Sistema local)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Iniciar minimizado</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Mostrar pantalla de arraque al iniciar (por defecto: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Escojer el directorio de información al iniciar (por defecto : 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -788,14 +748,6 @@
<translation>Mensaje:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Esta es una verificación de solicituda de pago.</translation>
- </message>
- <message>
- <source>This is an unverified payment request.</source>
- <translation>Esta es una solicitud de pago no verificada.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Pago para:</translation>
</message>
@@ -834,7 +786,7 @@
</message>
<message>
<source>The Bitcoin Core developers</source>
- <translation>El nucleo de Bitcoin de desarrolladores</translation>
+ <translation>Los desarrolladores de Bitcoin Core</translation>
</message>
</context>
<context>
@@ -897,10 +849,6 @@
<translation>Tipo</translation>
</message>
<message>
- <source>Address</source>
- <translation>Domicilio</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Abrir hasta %1</translation>
</message>
@@ -917,6 +865,10 @@
<translation>Generado pero no aprovado</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Recivido con</translation>
</message>
@@ -930,7 +882,7 @@
</message>
<message>
<source>Mined</source>
- <translation>Minado</translation>
+ <translation>Minado </translation>
</message>
<message>
<source>(n/a)</source>
@@ -945,10 +897,6 @@
<translation>Escriba una transacción</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Direccion del destinatario de la transacción</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Cantidad removida del saldo o agregada </translation>
</message>
@@ -1029,7 +977,7 @@
</message>
<message>
<source>Exporting Failed</source>
- <translation>Fallo en la exportación</translation>
+ <translation>Exportación fallida</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
@@ -1115,6 +1063,22 @@
<translation>Opciones de cartera:</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Escojer el directorio de información al iniciar (por defecto : 0)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Definir idioma, por ejemplo "de_DE" (por defecto: Sistema local)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Mostrar pantalla de arraque al iniciar (por defecto: 1)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Iniciar minimizado</translation>
+ </message>
+ <message>
<source>Loading addresses...</source>
<translation>Cargando direcciones...</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_UY.ts b/src/qt/locale/bitcoin_es_UY.ts
index a5a1583b19..48a6f35f92 100644
--- a/src/qt/locale/bitcoin_es_UY.ts
+++ b/src/qt/locale/bitcoin_es_UY.ts
@@ -1,11 +1,7 @@
-<TS language="es_UY" version="2.0">
+<TS language="es_UY" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Doble clic para editar etiqueta o dirección </translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Crear una nueva dirección </translation>
</message>
@@ -76,10 +72,6 @@
<translation>Cambiar contraseña</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Ingrese la contraseña anterior y la nueva de acceso a el monedero</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirme el cifrado del monedero</translation>
</message>
@@ -162,10 +154,6 @@
<source>Tabs toolbar</source>
<translation>Barra de herramientas</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n conexión activa a la red Bitcoin </numerusform><numerusform>%n conexiones activas a la red Bitcoin</numerusform></translation>
- </message>
<message>
<source>Up to date</source>
<translation>A la fecha</translation>
@@ -433,13 +421,13 @@
<translation>Fecha</translation>
</message>
<message>
- <source>Address</source>
- <translation>Direccion </translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Abrir hasta %1</translation>
</message>
+ <message>
+ <source>Label</source>
+ <translation>Etiqueta</translation>
+ </message>
</context>
<context>
<name>TransactionView</name>
diff --git a/src/qt/locale/bitcoin_et.ts b/src/qt/locale/bitcoin_et.ts
index 801fcf6258..29a45960c9 100644
--- a/src/qt/locale/bitcoin_et.ts
+++ b/src/qt/locale/bitcoin_et.ts
@@ -1,21 +1,29 @@
-<TS language="et" version="2.0">
+<TS language="et" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Topeltklõps aadressi või märgise muutmiseks</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Loo uus aadress</translation>
</message>
<message>
+ <source>&amp;New</source>
+ <translation>&amp;Uus</translation>
+ </message>
+ <message>
<source>Copy the currently selected address to the system clipboard</source>
<translation>Kopeeri märgistatud aadress vahemällu</translation>
</message>
<message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Kopeeri</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>S&amp;ulge</translation>
+ </message>
+ <message>
<source>&amp;Copy Address</source>
- <translation>&amp;Aadressi kopeerimine</translation>
+ <translation>&amp;Kopeeri Aadress</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -26,10 +34,18 @@
<translation>Ekspordi kuvatava vahelehe sisu faili</translation>
</message>
<message>
+ <source>&amp;Export</source>
+ <translation>&amp;Ekspordi</translation>
+ </message>
+ <message>
<source>&amp;Delete</source>
<translation>&amp;Kustuta</translation>
</message>
<message>
+ <source>C&amp;hoose</source>
+ <translation>V&amp;ali</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>Need on sinu Bitcoini aadressid maksete saatmiseks. Müntide saatmisel kontrolli alati summat ning saaja aadressi.</translation>
</message>
@@ -45,6 +61,10 @@
<source>Comma separated file (*.csv)</source>
<translation>Komaeraldatud fail (*.csv)</translation>
</message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation>Eksportimine Ebaõnnestus</translation>
+ </message>
</context>
<context>
<name>AddressTableModel</name>
@@ -104,10 +124,6 @@
<translation>Muuda salafraasi</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Sisesta rahakoti vana ning uus salafraas.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Kinnita rahakoti krüpteering</translation>
</message>
@@ -132,10 +148,6 @@
<translation>Rahakott krüpteeritud</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin sulgub krüpteeringu lõpetamiseks. Pea meeles, et rahakoti krüpteerimine ei välista bitcoinide vargust, kui sinu arvuti on nakatunud pahavaraga.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Tõrge rahakoti krüpteerimisel</translation>
</message>
@@ -223,6 +235,10 @@
<translation>&amp;Salafraasi muutmine</translation>
</message>
<message>
+ <source>Open &amp;URI...</source>
+ <translation>Ava &amp;URI...</translation>
+ </message>
+ <message>
<source>Importing blocks from disk...</source>
<translation>Impordi blokid kettalt...</translation>
</message>
@@ -235,10 +251,6 @@
<translation>Saada münte Bitcoini aadressile</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Muuda Bitcoini seadeid</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Varunda rahakott teise asukohta</translation>
</message>
@@ -315,10 +327,6 @@
<translation>Bitcoini tuumik</translation>
</message>
<message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n aktiivne ühendus Bitcoini võrku</numerusform><numerusform>%n aktiivset ühendust Bitcoini võrku</numerusform></translation>
- </message>
- <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n tund</numerusform><numerusform>%n tundi</numerusform></translation>
</message>
@@ -331,6 +339,14 @@
<translation><numerusform>%n nädal</numerusform><numerusform>%n nädalat</numerusform></translation>
</message>
<message>
+ <source>%1 and %2</source>
+ <translation>%1 ja %2</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation><numerusform>%n aasta</numerusform><numerusform>%n aastat</numerusform></translation>
+ </message>
+ <message>
<source>%1 behind</source>
<translation>%1 maas</translation>
</message>
@@ -363,6 +379,36 @@
<translation>Jõuan...</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation>Kuupäev: %1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation>Summa: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation>Tüüp: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>&amp;Märgis: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Aadress: %1
+</translation>
+ </message>
+ <message>
<source>Sent transaction</source>
<translation>Saadetud tehing</translation>
</message>
@@ -371,17 +417,6 @@
<translation>Sisenev tehing</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Kuupäev: %1⏎
-Summa: %2⏎
-Tüüp: %3⏎
-Aadress: %4⏎</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Rahakott on &lt;b&gt;krüpteeritud&lt;/b&gt; ning hetkel &lt;b&gt;avatud&lt;/b&gt;</translation>
</message>
@@ -400,10 +435,18 @@ Aadress: %4⏎</translation>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Quantity:</source>
+ <translation>Kogus:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>Summa:</translation>
</message>
<message>
+ <source>Fee:</source>
+ <translation>Tasu:</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation>Kogus</translation>
</message>
@@ -432,6 +475,50 @@ Aadress: %4⏎</translation>
<translation>Kopeeri tehingu ID</translation>
</message>
<message>
+ <source>Copy fee</source>
+ <translation>Kopeeri tasu</translation>
+ </message>
+ <message>
+ <source>highest</source>
+ <translation>kõrgeim</translation>
+ </message>
+ <message>
+ <source>higher</source>
+ <translation>kõrgem</translation>
+ </message>
+ <message>
+ <source>high</source>
+ <translation>kõrge</translation>
+ </message>
+ <message>
+ <source>medium</source>
+ <translation>keskmine</translation>
+ </message>
+ <message>
+ <source>low</source>
+ <translation>madal</translation>
+ </message>
+ <message>
+ <source>lower</source>
+ <translation>madalam</translation>
+ </message>
+ <message>
+ <source>lowest</source>
+ <translation>madalaim</translation>
+ </message>
+ <message>
+ <source>(%1 locked)</source>
+ <translation>(%1 lukustatud)</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>jah</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>ei</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation>(silti pole)</translation>
</message>
@@ -485,6 +572,10 @@ Aadress: %4⏎</translation>
</context>
<context>
<name>FreespaceChecker</name>
+ <message>
+ <source>name</source>
+ <translation>nimi</translation>
+ </message>
</context>
<context>
<name>HelpMessageDialog</name>
@@ -497,6 +588,10 @@ Aadress: %4⏎</translation>
<translation>versioon</translation>
</message>
<message>
+ <source>About Bitcoin Core</source>
+ <translation>Kirjeldus Bitcoini Tuumast</translation>
+ </message>
+ <message>
<source>Command-line options</source>
<translation>Käsurea valikud</translation>
</message>
@@ -508,26 +603,14 @@ Aadress: %4⏎</translation>
<source>command-line options</source>
<translation>käsurea valikud</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI valikud</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Keele valik, nt "ee_ET" (vaikeväärtus: system locale)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Käivitu tegumiribale</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Käivitamisel teabeakna kuvamine (vaikeväärtus: 1)</translation>
- </message>
- </context>
+</context>
<context>
<name>Intro</name>
<message>
+ <source>Welcome</source>
+ <translation>Teretulemast</translation>
+ </message>
+ <message>
<source>Bitcoin Core</source>
<translation>Bitcoini tuumik</translation>
</message>
@@ -538,6 +621,14 @@ Aadress: %4⏎</translation>
</context>
<context>
<name>OpenURIDialog</name>
+ <message>
+ <source>Open URI</source>
+ <translation>Ava URI</translation>
+ </message>
+ <message>
+ <source>URI:</source>
+ <translation>URI:</translation>
+ </message>
</context>
<context>
<name>OptionsDialog</name>
@@ -546,12 +637,8 @@ Aadress: %4⏎</translation>
<translation>Valikud</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Käivita Bitcoin süsteemi logimisel.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Start Bitcoin sisselogimisel</translation>
+ <source>MB</source>
+ <translation>MB</translation>
</message>
<message>
<source>Reset all client options to default.</source>
@@ -566,6 +653,14 @@ Aadress: %4⏎</translation>
<translation>&amp;Võrk</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation>R&amp;ahakott</translation>
+ </message>
+ <message>
+ <source>Expert</source>
+ <translation>Ekspert</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>Bitcoini kliendi pordi automaatne avamine ruuteris. Toimib, kui sinu ruuter aktsepteerib UPnP ühendust.</translation>
</message>
@@ -598,10 +693,6 @@ Aadress: %4⏎</translation>
<translation>&amp;Minimeeri systray alale</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 Quit in the menu.</source>
- <translation>Sulgemise asemel minimeeri aken. Selle valiku tegemisel suletakse programm Menüüst "Välju" käsuga.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimeeri sulgemisel</translation>
</message>
@@ -614,10 +705,6 @@ Aadress: %4⏎</translation>
<translation>Kasutajaliidese &amp;keel:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Kasutajaliidese keele valimise koht. Valik rakendub Bitcoini käivitamisel.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>Summade kuvamise &amp;Unit:</translation>
</message>
@@ -665,10 +752,10 @@ Aadress: %4⏎</translation>
<translation>Mitte aegunud mine'itud jääk</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>sünkimata</translation>
+ <source>Recent transactions</source>
+ <translation>Hiljutised tehingud</translation>
</message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -720,6 +807,10 @@ Aadress: %4⏎</translation>
<translation>&amp;Informatsioon</translation>
</message>
<message>
+ <source>General</source>
+ <translation>Üldine</translation>
+ </message>
+ <message>
<source>Using OpenSSL version</source>
<translation>Kasutan OpenSSL versiooni</translation>
</message>
@@ -732,6 +823,10 @@ Aadress: %4⏎</translation>
<translation>Võrgustik</translation>
</message>
<message>
+ <source>Name</source>
+ <translation>Nimi</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation>Ühenduste arv</translation>
</message>
@@ -744,6 +839,26 @@ Aadress: %4⏎</translation>
<translation>Plokkide hetkearv</translation>
</message>
<message>
+ <source>Received</source>
+ <translation>Vastuvõetud</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation>Saadetud</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <translation>Suund</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation>Versioon</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Teenused</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Viimane ploki aeg</translation>
</message>
@@ -764,18 +879,10 @@ Aadress: %4⏎</translation>
<translation>Debugimise logifail</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Ava Bitcoini logifail praegusest andmekaustast. Toiminguks võib kuluda kuni mõni sekund.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Puhasta konsool</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Teretulemast Bitcoini RPC konsooli.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Ajaloo sirvimiseks kasuta üles ja alla nooli, ekraani puhastamiseks &lt;b&gt;Ctrl-L&lt;/b&gt;.</translation>
</message>
@@ -783,18 +890,54 @@ Aadress: %4⏎</translation>
<source>Type &lt;b&gt;help&lt;/b&gt; for an overview of available commands.</source>
<translation>Ülevaateks võimalikest käsklustest trüki &lt;b&gt;help&lt;/b&gt;.</translation>
</message>
+ <message>
+ <source>%1 B</source>
+ <translation>%1 B</translation>
+ </message>
+ <message>
+ <source>%1 KB</source>
+ <translation>%1 B</translation>
+ </message>
+ <message>
+ <source>%1 MB</source>
+ <translation>%1 MB</translation>
+ </message>
+ <message>
+ <source>%1 GB</source>
+ <translation>%1 GB</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
+ <source>&amp;Amount:</source>
+ <translation>&amp;Summa:</translation>
+ </message>
+ <message>
<source>&amp;Label:</source>
<translation>&amp;Märgis</translation>
</message>
<message>
+ <source>&amp;Message:</source>
+ <translation>&amp;Sõnum:</translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation>Näita</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Eemalda</translation>
+ </message>
+ <message>
<source>Copy label</source>
<translation>Märgise kopeerimine</translation>
</message>
<message>
+ <source>Copy message</source>
+ <translation>Kopeeri sõnum</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation>Kopeeri summa</translation>
</message>
@@ -848,7 +991,15 @@ Aadress: %4⏎</translation>
<source>(no label)</source>
<translation>(silti pole)</translation>
</message>
- </context>
+ <message>
+ <source>(no message)</source>
+ <translation>(sõnum puudub)</translation>
+ </message>
+ <message>
+ <source>(no amount)</source>
+ <translation>(summa puudub)</translation>
+ </message>
+</context>
<context>
<name>SendCoinsDialog</name>
<message>
@@ -856,10 +1007,38 @@ Aadress: %4⏎</translation>
<translation>Müntide saatmine</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation>Kogus:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>Summa:</translation>
</message>
<message>
+ <source>Fee:</source>
+ <translation>Tasu:</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>Vali...</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation>Peida</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Soovitatud:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>normaalne</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>kiire</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Saatmine mitmele korraga</translation>
</message>
@@ -892,8 +1071,12 @@ Aadress: %4⏎</translation>
<translation>Kopeeri summa</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Saaja aadress ei ole kehtiv, palun kontrolli.</translation>
+ <source>Copy fee</source>
+ <translation>Kopeeri tasu</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation>või</translation>
</message>
<message>
<source>The amount to pay must be larger than 0.</source>
@@ -908,10 +1091,6 @@ Aadress: %4⏎</translation>
<translation>Summa koos tehingu tasuga %1 ületab sinu jääki.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Ühe saatmisega topelt-adressaati olla ei tohi.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(silti pole)</translation>
</message>
@@ -965,10 +1144,6 @@ Aadress: %4⏎</translation>
<translation>&amp;Allkirjastamise teade</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Omandiõigsuse tõestamiseks saad sõnumeid allkirjastada oma aadressiga. Ettevaatust petturitega, kes üritavad saada sinu allkirja endale saada. Allkirjasta ainult korralikult täidetud avaldusi, millega nõustud.</translation>
- </message>
- <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1013,10 +1188,6 @@ Aadress: %4⏎</translation>
<translation>&amp;Kinnita Sõnum</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Kinnitamiseks sisesta allkirjastamise aadress, sõnum (kindlasti kopeeri täpselt ka reavahetused, tühikud, tabulaatorid jms) ning allolev signatuur.</translation>
- </message>
- <message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
<translation>Kinnita sõnum tõestamaks selle allkirjastatust määratud Bitcoini aadressiga.</translation>
</message>
@@ -1088,13 +1259,21 @@ Aadress: %4⏎</translation>
<translation>Bitcoini tuumik</translation>
</message>
<message>
+ <source>The Bitcoin Core developers</source>
+ <translation>Bitcoini Tuuma arendajad</translation>
+ </message>
+ <message>
<source>[testnet]</source>
<translation>[testnet]</translation>
</message>
</context>
<context>
<name>TrafficGraphWidget</name>
- </context>
+ <message>
+ <source>KB/s</source>
+ <translation>KB/s</translation>
+ </message>
+</context>
<context>
<name>TransactionDesc</name>
<message>
@@ -1113,10 +1292,6 @@ Aadress: %4⏎</translation>
<source>Status</source>
<translation>Staatus</translation>
</message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, levita läbi %n node'i</numerusform><numerusform>, levita läbi %n node'i</numerusform></translation>
- </message>
<message>
<source>Date</source>
<translation>Kuupäev</translation>
@@ -1149,10 +1324,6 @@ Aadress: %4⏎</translation>
<source>Credit</source>
<translation>Krediit</translation>
</message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>aegub %n bloki pärast</numerusform><numerusform>aegub %n bloki pärast</numerusform></translation>
- </message>
<message>
<source>not accepted</source>
<translation>mitte aktsepteeritud</translation>
@@ -1209,10 +1380,6 @@ Aadress: %4⏎</translation>
<source>, has not been successfully broadcast yet</source>
<translation>, veel esitlemata</translation>
</message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Avaneb %n bloki pärast</numerusform><numerusform>Avaneb %n bloki pärast</numerusform></translation>
- </message>
<message>
<source>unknown</source>
<translation>tundmatu</translation>
@@ -1240,14 +1407,6 @@ Aadress: %4⏎</translation>
<translation>Tüüp</translation>
</message>
<message>
- <source>Address</source>
- <translation>Aadress</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Avaneb %n bloki pärast</numerusform><numerusform>Avaneb %n bloki pärast</numerusform></translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Avatud kuni %1</translation>
</message>
@@ -1264,6 +1423,10 @@ Aadress: %4⏎</translation>
<translation>Loodud, kuid aktsepteerimata</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Silt</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Saadud koos</translation>
</message>
@@ -1300,10 +1463,6 @@ Aadress: %4⏎</translation>
<translation>Tehingu tüüp.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Tehingu saaja aadress.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Jäägile lisatud või eemaldatud summa.</translation>
</message>
@@ -1391,6 +1550,10 @@ Aadress: %4⏎</translation>
<translation>Kuva tehingu detailid</translation>
</message>
<message>
+ <source>Exporting Failed</source>
+ <translation>Eksportimine Ebaõnnestus</translation>
+ </message>
+ <message>
<source>Comma separated file (*.csv)</source>
<translation>Komaeraldatud fail (*.csv)</translation>
</message>
@@ -1443,6 +1606,10 @@ Aadress: %4⏎</translation>
<context>
<name>WalletView</name>
<message>
+ <source>&amp;Export</source>
+ <translation>&amp;Ekspordi</translation>
+ </message>
+ <message>
<source>Export the data in the current tab to a file</source>
<translation>Ekspordi kuvatava vahelehe sisu faili</translation>
</message>
@@ -1498,42 +1665,10 @@ Aadress: %4⏎</translation>
<translation>Luba välisühendusi (vaikeväärtus: 1 kui puudub -proxy või -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, sul tuleb rpcpassword määrata seadete failis:
-%s
-Soovitatav on kasutada järgmist juhuslikku parooli:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(seda parooli ei pea meeles pidama)
-Kasutajanimi ning parool EI TOHI kattuda.
-Kui faili ei leita, loo see ainult-omaniku-loetavas failiõigustes .
-Soovitatav on seadistada tõrgete puhul teavitus;
-nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Määratud aadressiga sidumine ning sellelt kuulamine. IPv6 jaoks kasuta vormingut [host]:port</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Tõrge: Tehingust keelduti! Põhjuseks võib olla juba kulutatud mündid, nt kui wallet.dat fail koopias kulutatid mündid, kuid ei märgitud neid siin vastavalt.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Tõrge: Selle tehingu jaoks on nõutav lisatasu vähemalt %s. Põhjuseks võib olla summa suurus, keerukus või hiljuti saadud summade kasutamine!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Käivita käsklus, kui rahakoti tehing muutub (%s cmd's muudetakse TxID'ks)</translation>
</message>
@@ -1570,10 +1705,6 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com
<translation>Tuvastati vigane bloki andmebaas</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Leia oma IP aadress (vaikeväärtus: 1, kui kuulatakse ning puudub -externalip)</translation>
- </message>
- <message>
<source>Do you want to rebuild the block database now?</source>
<translation>Kas soovid bloki andmebaasi taastada?</translation>
</message>
@@ -1598,18 +1729,10 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com
<translation>Tõrge: liiga vähe kettaruumi!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Tõrge: Rahakott on lukus, tehingu loomine ei ole võimalik!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Pordi kuulamine nurjus. Soovikorral kasuta -listen=0.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Taasta bloki jada indeks blk000??.dat failist</translation>
- </message>
- <message>
<source>Verifying blocks...</source>
<translation>Kontrollin blokke...</translation>
</message>
@@ -1618,6 +1741,10 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com
<translation>Kontrollin rahakotti...</translation>
</message>
<message>
+ <source>Wallet options:</source>
+ <translation>Rahakoti valikud:</translation>
+ </message>
+ <message>
<source>Imports blocks from external blk000??.dat file</source>
<translation>Impordi blokid välisest blk000??.dat failist</translation>
</message>
@@ -1626,14 +1753,50 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com
<translation>Informatsioon</translation>
</message>
<message>
+ <source>RPC server options:</source>
+ <translation>RPC serveri valikud:</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Saada jälitus/debug, debug.log faili asemel, konsooli</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Keele valik, nt "ee_ET" (vaikeväärtus: system locale)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Käivitamisel teabeakna kuvamine (vaikeväärtus: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Kahanda programmi käivitamisel debug.log faili (vaikeväärtus: 1, kui ei ole -debug)</translation>
</message>
<message>
+ <source>Signing transaction failed</source>
+ <translation>Tehingu allkirjastamine ebaõnnestus</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Käivitu tegumiribale</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>Tehingu summa on tasu maksmiseks liiga väikene</translation>
+ </message>
+ <message>
+ <source>Transaction amount too small</source>
+ <translation>Tehingu summa liiga väikene</translation>
+ </message>
+ <message>
+ <source>Transaction too large</source>
+ <translation>Tehing liiga suur</translation>
+ </message>
+ <message>
+ <source>UI Options:</source>
+ <translation>UI Valikud:</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
<translation>Kasuta kuulatava pordi määramiseks UPnP ühendust (vaikeväärtus: 1, kui kuulatakse)</translation>
</message>
@@ -1646,8 +1809,8 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com
<translation>Hoiatus</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Hoiatus: versioon on aegunud, uuendus on nõutav!</translation>
+ <source>on startup</source>
+ <translation>käivitamisel</translation>
</message>
<message>
<source>wallet.dat corrupt, salvage failed</source>
@@ -1690,6 +1853,10 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com
<translation>Viga wallet.dat käivitamisel. Vigane rahakkott</translation>
</message>
<message>
+ <source>(default: %s)</source>
+ <translation>(vaikimisi: %s)</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>Viga wallet.dat käivitamisel</translation>
</message>
@@ -1714,10 +1881,6 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com
<translation>-paytxfee=&lt;amount&gt; jaoks vigane kogus: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Kehtetu summa</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Liiga suur summa</translation>
</message>
@@ -1750,10 +1913,6 @@ nt: alertnotify=echo %%s | email -s "Bitcoin Alert" admin@foo.com
<translation>Laetud</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>%s valiku kasutamine</translation>
- </message>
- <message>
<source>Error</source>
<translation>Tõrge</translation>
</message>
diff --git a/src/qt/locale/bitcoin_eu_ES.ts b/src/qt/locale/bitcoin_eu_ES.ts
index ea0ce1a67d..d68411d382 100644
--- a/src/qt/locale/bitcoin_eu_ES.ts
+++ b/src/qt/locale/bitcoin_eu_ES.ts
@@ -1,11 +1,7 @@
-<TS language="eu_ES" version="2.0">
+<TS language="eu_ES" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Klik bikoitza helbidea edo etiketa editatzeko</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Sortu helbide berria</translation>
</message>
@@ -76,10 +72,6 @@
<translation>Aldatu pasahitza</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Sartu zorroaren pasahitz zaharra eta berria.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Berretsi zorroaren enkriptazioa</translation>
</message>
@@ -513,10 +505,6 @@
<translation>Mota</translation>
</message>
<message>
- <source>Address</source>
- <translation>Helbidea</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Zabalik %1 arte</translation>
</message>
@@ -533,6 +521,10 @@
<translation>Sortua, baina ez onartua</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiketa</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Jasota honekin: </translation>
</message>
@@ -565,10 +557,6 @@
<translation>Transakzio mota.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Transakzioaren xede-helbidea.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Saldoan kendu edo gehitutako kopurua.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts
index 475515f4b7..33f43f0c2d 100644
--- a/src/qt/locale/bitcoin_fa.ts
+++ b/src/qt/locale/bitcoin_fa.ts
@@ -1,9 +1,9 @@
-<TS language="fa" version="2.0">
+<TS language="fa" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>برای ویرایش نشانی یا برچسب دوبار کلیک کنید</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>برای تغییر آدرس و یا برچسب کلیک راست کنید.</translation>
</message>
<message>
<source>Create a new address</source>
@@ -46,6 +46,22 @@
<translation>&amp;حذف</translation>
</message>
<message>
+ <source>Choose the address to send coins to</source>
+ <translation>آدرس مورد نظر برای ارسال کوین ها را انتخاب کنید</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation>آدرس موردنظر برای دریافت کوین ها را انتخاب کنید.</translation>
+ </message>
+ <message>
+ <source>Sending addresses</source>
+ <translation>آدرس های ارسال کننده</translation>
+ </message>
+ <message>
+ <source>Receiving addresses</source>
+ <translation>آدرس های دریافت کننده</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>این‌ها نشانی‌های بیت‌کوین شما برای ارسال وجود هستند. همیشه قبل از ارسال سکه‌ها، نشانی دریافت‌کننده و مقدار ارسالی را بررسی کنید.</translation>
</message>
@@ -128,10 +144,6 @@
<translation>تغییر گذرواژه</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>گذرواژهٔ قدیمی و جدید کیف پول را وارد کنید.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>تأیید رمزنگاری کیف پول</translation>
</message>
@@ -156,10 +168,6 @@
<translation>کیف پول رمزنگاری شد</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>بیت‌کوین هم اکنون بسته می‌شود تا فرایند رمزگذاری را تمام کند. به خاطر داشته باشید که رمزگذاری کردن کیف پول‌تان نمی‌تواند به طور کامل بیت‌کوین‌های شما را در برابر دزدیده شدن توسط بدافزارهایی که احتمالاً رایانهٔ شما را آلوده می‌کنند، محافظت نماید.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>رمزنگاری کیف پول با شکست مواجه شد</translation>
</message>
@@ -259,10 +267,6 @@
<translation>ارسال وجه به نشانی بیت‌کوین</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>تغییر و اصلاح تنظیمات پیکربندی بیت‌کوین</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>تهیهٔ پشتیبان از کیف پول در یک مکان دیگر</translation>
</message>
@@ -338,6 +342,10 @@
<source>Bitcoin Core</source>
<translation> هسته Bitcoin </translation>
</message>
+ <message>
+ <source>&amp;About Bitcoin Core</source>
+ <translation>درباره هسته ی بیت کوین</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n ارتباط فعال با شبکهٔ بیت‌کوین</numerusform></translation>
@@ -399,18 +407,6 @@
<translation>تراکنش دریافت شد</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>تاریخ: %1
-مبلغ: %2
-نوع: %3
-نشانی: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>کیف پول &lt;b&gt;رمزنگاری شده&lt;/b&gt; است و هم‌اکنون &lt;b&gt;باز&lt;/b&gt; است</translation>
</message>
@@ -429,10 +425,38 @@ Address: %4
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>انتخاب سکه</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation>تعداد:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation>بایت ها:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>مبلغ:</translation>
</message>
<message>
+ <source>Priority:</source>
+ <translation>اولویت:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>هزینه:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation>هزینه ی پسین:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation>پول خورد:</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation>مبلغ</translation>
</message>
@@ -565,26 +589,6 @@ Address: %4
<source>command-line options</source>
<translation>گزینه‌های خط فرمان</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>گزینه‌های رابط کاربری</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>زبان را تنظیم کنید؛ برای مثال «de_DE» (زبان پیش‌فرض محلی)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>اجرای برنامه به صورت کوچک‌شده</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>نمایش پنجرهٔ خوشامدگویی در ابتدای اجرای برنامه (پیش‌فرض: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>انتخاب مسیر داده‌ها در ابتدای اجرای برنامه (پیش‌فرض: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -623,14 +627,6 @@ Address: %4
<translation>&amp;عمومی</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>اجرای خودکار بیت‌کوین در زمان ورود به سیستم.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;اجرای بیت‌کوین با ورود به سیستم</translation>
- </message>
- <message>
<source>Reset all client options to default.</source>
<translation>بازنشانی تمام تنظیمات به پیش‌فرض.</translation>
</message>
@@ -679,10 +675,6 @@ Address: %4
<translation>&amp;کوچک کردن به سینی به‌جای نوار وظیفه</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 Quit in the menu.</source>
- <translation>مخفی کردن در نوار کناری به‌جای خروج هنگام بستن پنجره. زمانی که این گزینه فعال است، برنامه فقط با استفاده از گزینهٔ خروج در منو قابل بسته شدن است.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>کوچک کردن &amp;در زمان بسته شدن</translation>
</message>
@@ -695,10 +687,6 @@ Address: %4
<translation>زبان &amp;رابط کاربری:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>زبان رابط کاربر می‌تواند در این‌جا تنظیم شود. تنظیمات بعد از ظروع مجدد بیت‌کوین اعمال خواهد شد.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;واحد نمایش مبالغ:</translation>
</message>
@@ -769,11 +757,7 @@ Address: %4
<source>Your current total balance</source>
<translation>تراز کل فعلی شما</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>ناهمگام</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -877,18 +861,10 @@ Address: %4
<translation>فایلِ لاگِ اشکال زدایی</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>فایلِ لاگِ اشکال زدایی Bitcoin را از دایرکتوری جاری داده ها باز کنید. این عملیات ممکن است برای فایلهای لاگِ حجیم طولانی شود.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>پاکسازی کنسول</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>به کنسور RPC بیت‌کوین خوش آمدید.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>دکمه‌های بالا و پایین برای پیمایش تاریخچه و &lt;b&gt;Ctrl-L&lt;/b&gt; برای پاک کردن صفحه.</translation>
</message>
@@ -977,10 +953,34 @@ Address: %4
<translation>ارسال سکه</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation>تعداد:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation>بایت ها:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation>مبلغ:</translation>
</message>
<message>
+ <source>Priority:</source>
+ <translation>اولویت:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>هزینه:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation>هزینه ی پسین:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation>پول خورد:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>ارسال به چند دریافت‌کنندهٔ به‌طور همزمان</translation>
</message>
@@ -1017,10 +1017,6 @@ Address: %4
<translation>یا</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>نشانی گیرنده معتبر نیست؛ لطفا دوباره بررسی کنید.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>مبلغ پرداخت باید بیشتر از ۰ باشد.</translation>
</message>
@@ -1033,10 +1029,6 @@ Address: %4
<translation>با احتساب هزینهٔ %1 برای هر تراکنش، مجموع میزان پرداختی از مبلغ تراز شما بیشتر می‌شود.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>یک نشانی تکراری پیدا شد. در هر عملیات ارسال، به هر نشانی فقط مبلغ می‌توان ارسال کرد.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(بدون برچسب)</translation>
</message>
@@ -1090,10 +1082,6 @@ Address: %4
<translation>ا&amp;مضای پیام</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>برای احراز اینکه پیام‌ها از جانب شما هستند، می‌توانید آن‌ها را با نشانی خودتان امضا کنید. مراقب باشید چیزی که بدان اطمینان ندارید را امضا نکنید زیرا حملات فیشینگ ممکن است بخواهند از.پیامی با امضای شما سوءاستفاده کنند. تنها مواردی را که حاوی اطلاعات دقیق و قابل قبول برای شما هستند امضا کنید.</translation>
- </message>
- <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1138,10 +1126,6 @@ Address: %4
<translation>&amp;شناسایی پیام</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>برای شناسایی پیام، نشانیِ امضا کننده و متن پیام را وارد کنید. (مطمئن شوید که فاصله‌ها، تب‌ها و خطوط را عیناً کپی می‌کنید.) مراقب باشید در امضا چیزی بیشتر از آنچه در پیام می‌بینید وجود نداشته باشد تا فریب دزدان اینترنتی و حملات از نوع MITM را نخورید.</translation>
- </message>
- <message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
<translation>برای حصول اطمینان از اینکه پیام با نشانی بیت‌کوین مشخص شده امضا است یا خیر، پیام را شناسایی کنید</translation>
</message>
@@ -1368,10 +1352,6 @@ Address: %4
<source>Type</source>
<translation>نوع</translation>
</message>
- <message>
- <source>Address</source>
- <translation>نشانی</translation>
- </message>
<message numerus="yes">
<source>Open for %n more block(s)</source>
<translation><numerusform>باز برای %n بلوک دیگر</numerusform></translation>
@@ -1393,6 +1373,10 @@ Address: %4
<translation>تولید شده ولی قبول نشده</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>برچسب</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>دریافت‌شده با</translation>
</message>
@@ -1429,10 +1413,6 @@ Address: %4
<translation>نوع تراکنش.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>نشانی مقصد تراکنش.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>مبلغ کسر شده و یا اضافه شده به تراز.</translation>
</message>
@@ -1639,14 +1619,6 @@ Address: %4
<translation>مقید به نشانی داده شده باشید و همیشه از آن پیروی کنید. از نشانه گذاری استاندار IPv6 به صورت Host]:Port] استفاده کنید.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>تراکنش پذیرفته نیست! این خطا ممکن است در حالتی رخ داده باشد که مقداری از سکه های شما در کیف پولتان از جایی دیگر، همانند یک کپی از کیف پول اصلی اتان، خرج شده باشد اما در کیف پول اصلی اتان به عنوان مبلغ خرج شده، نشانه گذاری نشده باشد.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>خطا: این تراکنش به علت میزان وجه، دشواری، و یا استفاده از وجوه دریافتی اخیر نیازمند کارمزد به مبلغ حداقل %s است.</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>هنگامی که یک تراکنش در کیف پولی رخ می دهد، دستور را اجرا کن(%s در دستورات بوسیله ی TxID جایگزین می شود)</translation>
</message>
@@ -1671,10 +1643,6 @@ Address: %4
<translation>یک پایگاه داده ی بلوک خراب یافت شد</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>آدرس آی.پی. خود را شناسایی کنید (پیش فرض:1 در زمان when listening وno -externalip)</translation>
- </message>
- <message>
<source>Do you want to rebuild the block database now?</source>
<translation>آیا مایلید که اکنون پایگاه داده ی بلوک را بازسازی کنید؟</translation>
</message>
@@ -1703,6 +1671,10 @@ Address: %4
<translation>در حال بازبینی کیف پول...</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>انتخاب مسیر داده‌ها در ابتدای اجرای برنامه (پیش‌فرض: 0)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>اطلاعات</translation>
</message>
@@ -1711,10 +1683,22 @@ Address: %4
<translation>اطلاعات ردگیری/اشکال‌زدایی را به جای فایل لاگ اشکال‌زدایی به کنسول بفرستید</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>زبان را تنظیم کنید؛ برای مثال «de_DE» (زبان پیش‌فرض محلی)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>نمایش پنجرهٔ خوشامدگویی در ابتدای اجرای برنامه (پیش‌فرض: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>فایل debug.log را در startup مشتری کوچک کن (پیش فرض:1 اگر اشکال زدایی روی نداد)</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>اجرای برنامه به صورت کوچک‌شده</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
<translation>از UPnP برای شناسایی درگاه شنیداری استفاده کنید (پیش فرض:1 در زمان شنیدن)</translation>
</message>
@@ -1727,10 +1711,6 @@ Address: %4
<translation>هشدار</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>هشدار: این نسخه قدیمی است، روزآمدسازی مورد نیاز است</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>JSON-RPC عبارت عبور برای ارتباطات</translation>
</message>
@@ -1791,10 +1771,6 @@ Address: %4
<translation>میزان وجه اشتباه برای paytxfee=&lt;میزان وجه&gt;: %s</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>میزان وجه اشتباه</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>بود جه نا کافی </translation>
</message>
@@ -1827,10 +1803,6 @@ Address: %4
<translation>بار گیری انجام شده است</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>برای استفاده از %s از انتخابات</translation>
- </message>
- <message>
<source>Error</source>
<translation>خطا</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fa_IR.ts b/src/qt/locale/bitcoin_fa_IR.ts
index 1a639a8592..da95f10474 100644
--- a/src/qt/locale/bitcoin_fa_IR.ts
+++ b/src/qt/locale/bitcoin_fa_IR.ts
@@ -1,15 +1,15 @@
-<TS language="fa_IR" version="2.0">
+<TS language="fa_IR" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>برای ویرایش حساب و یا برچسب دوبار کلیک نمایید</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>گشایش حسابی جدید</translation>
</message>
<message>
+ <source>&amp;New</source>
+ <translation>جدید</translation>
+ </message>
+ <message>
<source>Copy the currently selected address to the system clipboard</source>
<translation>کپی کردن حساب انتخاب شده به حافظه سیستم - کلیپ بورد</translation>
</message>
@@ -92,10 +92,6 @@
<translation>تغییر رمز/پَس فرِیز</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>رمز/پَس فرِیزِ قدیم و جدید را در wallet وارد کنید</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>رمزگذاری wallet را تایید کنید</translation>
</message>
@@ -104,10 +100,6 @@
<translation>تایید رمزگذاری</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin برای اتمام فرایند رمزگذاری بسته خواهد شد. به خاطر داشته باشید که رمزگذاری WALLET شما، کامپیوتر شما را از آلودگی به بدافزارها مصون نمی دارد.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>رمزگذاری تایید نشد</translation>
</message>
@@ -191,10 +183,6 @@
<translation>تغییر رمز/پَس فرِیز</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>اصلاح انتخابها برای پیکربندی Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>گرفتن نسخه پیشتیبان در آدرسی دیگر</translation>
</message>
@@ -255,15 +243,6 @@
<translation>تراکنش دریافتی</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>تاریخ: %1⏎ میزان وجه : %2⏎ نوع: %3⏎ آدرس: %4⏎
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>wallet رمزگذاری شد و در حال حاضر از حالت قفل در آمده است</translation>
</message>
@@ -411,11 +390,7 @@ Address: %4
<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>اطلاعات نمایش داده شده ممکن است روزآمد نباشد. wallet شما به صورت خودکار بعد از برقراری اتصال با شبکه bitcoin به روز می شود اما این فرایند هنوز تکمیل نشده است.</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>خارج از روزآمد سازی</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
</context>
@@ -458,10 +433,6 @@ Address: %4
<source>Current number of blocks</source>
<translation>تعداد زنجیره های حاضر</translation>
</message>
- <message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>به کنسول آر.پی.سی. BITCOIN خوش آمدید</translation>
- </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
@@ -707,10 +678,6 @@ Address: %4
<translation>گونه</translation>
</message>
<message>
- <source>Address</source>
- <translation>حساب</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>باز کن تا %1</translation>
</message>
@@ -727,6 +694,10 @@ Address: %4
<translation>تولید شده اما قبول نشده است</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>برچسب</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>دریافت با</translation>
</message>
@@ -763,10 +734,6 @@ Address: %4
<translation>نوع تراکنش</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>آدرس مقصد در تراکنش</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>میزان وجه کم شده یا اضافه شده به حساب</translation>
</message>
@@ -986,10 +953,6 @@ Address: %4
<translation>میزان اشتباه است for -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>میزان اشتباه است</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>وجوه ناکافی</translation>
</message>
@@ -1022,10 +985,6 @@ Address: %4
<translation>اتمام لود شدن</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>برای استفاده از %s از اختیارات</translation>
- </message>
- <message>
<source>Error</source>
<translation>خطا</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts
index 9a2eadd6ea..db59ea1751 100644
--- a/src/qt/locale/bitcoin_fi.ts
+++ b/src/qt/locale/bitcoin_fi.ts
@@ -1,9 +1,9 @@
-<TS language="fi" version="2.0">
+<TS language="fi" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Kaksoisnapauta muokataksesi osoitetta tai nimeä</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Klikkaa hiiren oikealla painikkeella muokataksesi osoitetta tai nimikettä</translation>
</message>
<message>
<source>Create a new address</source>
@@ -23,7 +23,7 @@
</message>
<message>
<source>C&amp;lose</source>
- <translation>&amp;Sulje</translation>
+ <translation>S&amp;ulje</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -39,7 +39,7 @@
</message>
<message>
<source>&amp;Export</source>
- <translation>&amp;Vie...</translation>
+ <translation>&amp;Vie</translation>
</message>
<message>
<source>&amp;Delete</source>
@@ -47,15 +47,15 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation>Valitse osoite johon lähetetään kolikoita</translation>
+ <translation>Valitse osoite johon kolikot lähetetään</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation>Valitse osoite jolla vastaanotetaan kolikoita</translation>
+ <translation>Valitse osoite johon vastaanotetaan kolikoita</translation>
</message>
<message>
<source>C&amp;hoose</source>
- <translation>&amp;Valitse</translation>
+ <translation>V&amp;alitse</translation>
</message>
<message>
<source>Sending addresses</source>
@@ -67,15 +67,15 @@
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Nämä ovat sinun Bitcoin osoitteita maksujen lähetykseen. Tarkista aina rahan määrä ja vastaanottajan osoite ennenkuin lähetät kolikkoja.</translation>
+ <translation>Nämä ovat sinun Bitcoin osoitteita maksujen lähetykseen. Tarkista aina summa ja vastaanottajan osoite ennenkuin lähetät kolikkoja.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
- <translation>Nämä ovat sinun Bitcoin-osoitteesi suoritusten vastaanottamiseen. Suositellaan että annat uuden osoitteen kullekin rahansiirrolle</translation>
+ <translation>Nämä ovat sinun Bitcoin-osoitteesi suoritusten vastaanottamiseen. Suositellaan että annat uuden osoitteen kullekin transaktiolle.</translation>
</message>
<message>
<source>Copy &amp;Label</source>
- <translation>Kopioi &amp;Nimi</translation>
+ <translation>Kopioi &amp;nimike</translation>
</message>
<message>
<source>&amp;Edit</source>
@@ -110,14 +110,14 @@
</message>
<message>
<source>(no label)</source>
- <translation>(ei nimeä)</translation>
+ <translation>(ei nimikettä)</translation>
</message>
</context>
<context>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation>Tunnuslauseen Dialogi</translation>
+ <translation>Tunnuslauseen tekstinsyöttökenttä</translation>
</message>
<message>
<source>Enter passphrase</source>
@@ -129,7 +129,7 @@
</message>
<message>
<source>Repeat new passphrase</source>
- <translation>Kirjoita uusi tunnuslause uudelleen</translation>
+ <translation>Toista uusi tunnuslause</translation>
</message>
<message>
<source>Encrypt wallet</source>
@@ -156,10 +156,6 @@
<translation>Vaihda tunnuslause</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Anna vanha ja uusi tunnuslause.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Vahvista lompakon salaus</translation>
</message>
@@ -188,10 +184,6 @@
<translation>Anna salauslause lompakkoon. &lt;br/&gt;Ole hyvä ja käytä lausetta jossa on &lt;b&gt;kymmenen tai enemmän satunnaista merkkiä&lt;/b&gt; tai &lt;b&gt;kahdeksan tai useampi sanaa&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin sulkeutuu lopettaakseen salausprosessin. Muista, että salattukaan lompakko ei täysin suojaa sitä haittaohjelmien aiheuttamilta varkauksilta.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Lompakon salaus epäonnistui</translation>
</message>
@@ -311,10 +303,6 @@
<translation>Lähetä kolikoita Bitcoin-osoitteeseen</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Muuta Bitcoinin konfiguraatioasetuksia</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Varmuuskopioi lompakko toiseen sijaintiin</translation>
</message>
@@ -491,17 +479,6 @@
<translation>Saapuva rahansiirto</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Päivä: %1
-Määrä: %2
-Tyyppi: %3
-Osoite: %4</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Lompakko on &lt;b&gt;salattu&lt;/b&gt; ja tällä hetkellä &lt;b&gt;avoinna&lt;/b&gt;</translation>
</message>
@@ -520,6 +497,10 @@ Osoite: %4</translation>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Kolikoiden valinta</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Määrä:</translation>
</message>
@@ -568,6 +549,14 @@ Osoite: %4</translation>
<translation>Määrä</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>Vastaanotettu nimikkeellä</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Vastaanotettu osoitteella</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>Aika</translation>
</message>
@@ -692,10 +681,6 @@ Osoite: %4</translation>
<translation>ei</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Tämä nimi muuttuu punaiseksi jos rahansiirron koko on suurempi kuin 1000 tavua</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Tämä tarkoittaa että vähintään %1 per kB palkkio on pakollinen.</translation>
</message>
@@ -708,14 +693,6 @@ Osoite: %4</translation>
<translation>Rahansiirrot korkeammalla prioriteetilla sisällytetään varmemmin lohkoon.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Tämä nimi muuttuu punaiseksi jos prioriteetti on pienempi kuin "keskisuuri".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Tämä nimi muuttuu punaiseksi jos vastaanottaja saa pienemmän määrän kuin %1</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(ei nimeä)</translation>
</message>
@@ -836,30 +813,6 @@ Osoite: %4</translation>
<source>command-line options</source>
<translation>komentorivi parametrit</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Käyttöliittymäasetukset</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Set language, for example "de_DE" (default: system locale)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Käynnistä pienennettynä</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Aseta SSL root varmenne maksupyynnöille (oletus: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Näytä aloitusruutu käynnistettäessä (oletus: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Valitse data-hakemisto käynnistyksessä (oletus: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -899,7 +852,15 @@ Osoite: %4</translation>
<source>Error</source>
<translation>Virhe</translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>%n Gt vapaata tilaa käytettävissä</numerusform><numerusform>%n Gt vapaata tilaa käytettävissä</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(%n Gt tarvittavasta tilasta)</numerusform><numerusform>(%n Gt tarvittavasta tilasta)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -934,14 +895,6 @@ Osoite: %4</translation>
<translation>&amp;Yleiset</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Käynnistä Bitcoin kirjautumisen yhteydessä.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Käynnistä Bitcoin kirjautumisen yhteydessä</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>&amp;Tietokannan välimuistin koko</translation>
</message>
@@ -1022,6 +975,14 @@ Osoite: %4</translation>
<translation>Portin uudelleenohjaus &amp;UPnP:llä</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Yhdistä Bitcoin-verkkoon SOCKS5-välityspalvelimen kautta.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>&amp;Yhdistä SOCKS5-välityspalvelimen kautta (oletus välityspalvelin):</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>Proxyn &amp;IP:</translation>
</message>
@@ -1046,10 +1007,6 @@ Osoite: %4</translation>
<translation>&amp;Pienennä ilmaisinalueelle työkalurivin sijasta</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 Quit in the menu.</source>
- <translation>Ikkunaa suljettaessa vain pienentää Bitcoin-ohjelman ikkunan lopettamatta itse ohjelmaa. Kun tämä asetus on valittuna, ohjelman voi sulkea vain valitsemalla Lopeta ohjelman valikosta.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>P&amp;ienennä suljettaessa</translation>
</message>
@@ -1062,10 +1019,6 @@ Osoite: %4</translation>
<translation>&amp;Käyttöliittymän kieli</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Tässä voit määritellä käyttöliittymän kielen. Muutokset astuvat voimaan seuraavan kerran, kun Bitcoin käynnistetään.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>Yksikkö jona bitcoin-määrät näytetään</translation>
</message>
@@ -1102,10 +1055,6 @@ Osoite: %4</translation>
<translation>Ohjelman uudelleenkäynnistys aktivoi muutokset.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Ohjelma lopetetaan. Haluatko jatkaa?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Tämä muutos vaatii ohjelman uudelleenkäynnistyksen.</translation>
</message>
@@ -1153,6 +1102,10 @@ Osoite: %4</translation>
<translation>Louhittu saldo, joka ei ole vielä kypsynyt</translation>
</message>
<message>
+ <source>Balances</source>
+ <translation>Saldot</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation>Yhteensä:</translation>
</message>
@@ -1165,12 +1118,24 @@ Osoite: %4</translation>
<translation>Nykyinen tase seurantaosoitetteissa</translation>
</message>
<message>
- <source>Current total balance in watch-only addresses</source>
- <translation>Nykyinen tase seurantaosoitetteissa</translation>
+ <source>Spendable:</source>
+ <translation>Käytettävissä:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation>Viimeisimmät rahansiirrot</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>Ei ajan tasalla</translation>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation>Vahvistamattomat rahansiirrot vain katseltaviin osoitteisiin</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation>Louhittu, ei vielä kypsynyt saldo vain katseltavissa osoitteissa</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation>Nykyinen tase seurantaosoitetteissa</translation>
</message>
</context>
<context>
@@ -1188,8 +1153,12 @@ Osoite: %4</translation>
<translation>Maksupyyntö hylätty</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Maksupyyntö on vanhentunut.</translation>
+ <source>Payment request network doesn't match client network.</source>
+ <translation>Maksypyyntö verkossa ei täsmää asiakasohjelman verkkoon.</translation>
+ </message>
+ <message>
+ <source>Payment request is not initialized.</source>
+ <translation>Maksupyyntöä ei ole alustettu.</translation>
</message>
<message>
<source>Requested payment amount of %1 is too small (considered dust).</source>
@@ -1224,6 +1193,10 @@ Osoite: %4</translation>
<translation>Maksupalautus %1:sta</translation>
</message>
<message>
+ <source>Payment request DoS protection</source>
+ <translation>Maksupyynnön DoS-suojaus</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Virhe kommunikoidessa %1n kanssa: %2</translation>
</message>
@@ -1246,7 +1219,11 @@ Osoite: %4</translation>
<source>User Agent</source>
<translation>Käyttöliittymä</translation>
</message>
- </context>
+ <message>
+ <source>Ping Time</source>
+ <translation>Vasteaika</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -1254,6 +1231,10 @@ Osoite: %4</translation>
<translation>Määrä</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation>Syötä Bitcoin-osoite (esim. %1)</translation>
+ </message>
+ <message>
<source>%1 d</source>
<translation>%1 d</translation>
</message>
@@ -1270,6 +1251,10 @@ Osoite: %4</translation>
<translation>%1 s</translation>
</message>
<message>
+ <source>None</source>
+ <translation>Ei yhtään</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation>Ei saatavilla</translation>
</message>
@@ -1328,6 +1313,10 @@ Osoite: %4</translation>
<translation>Käytössä oleva OpenSSL-versio</translation>
</message>
<message>
+ <source>Using BerkeleyDB version</source>
+ <translation>Käyttää BerkeleyDB-versiota</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Käynnistysaika</translation>
</message>
@@ -1360,6 +1349,18 @@ Osoite: %4</translation>
<translation>Lähetetyt</translation>
</message>
<message>
+ <source>&amp;Peers</source>
+ <translation>&amp;Vertaiset</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>Valitse vertainen eriteltyjä tietoja varten.</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <translation>Suunta</translation>
+ </message>
+ <message>
<source>Version</source>
<translation>Versio</translation>
</message>
@@ -1368,6 +1369,46 @@ Osoite: %4</translation>
<translation>Käyttöliittymä</translation>
</message>
<message>
+ <source>Services</source>
+ <translation>Palvelut</translation>
+ </message>
+ <message>
+ <source>Starting Height</source>
+ <translation>Aloituskorkeus</translation>
+ </message>
+ <message>
+ <source>Sync Height</source>
+ <translation>Synkronointikorkeus</translation>
+ </message>
+ <message>
+ <source>Ban Score</source>
+ <translation>Panna-pisteytys</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation>Yhteysaika</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation>Viimeisin lähetetty</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation>Viimeisin vastaanotettu</translation>
+ </message>
+ <message>
+ <source>Bytes Sent</source>
+ <translation>Tavua lähetetty</translation>
+ </message>
+ <message>
+ <source>Bytes Received</source>
+ <translation>Tavua vastaanotettu</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Vasteaika</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Viimeisimmän lohkon aika</translation>
</message>
@@ -1408,18 +1449,10 @@ Osoite: %4</translation>
<translation>Debug lokitiedosto</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Avaa lokitiedosto nykyisestä data-kansiosta. Tämä voi viedä useamman sekunnin, jos lokitiedosto on iso.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Tyhjennä konsoli</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Tervetuloa Bitcoin RPC konsoliin.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Ylös- ja alas-nuolet selaavat historiaa ja &lt;b&gt;Ctrl-L&lt;/b&gt; tyhjentää ruudun.</translation>
</message>
@@ -1444,10 +1477,30 @@ Osoite: %4</translation>
<translation>%1 GB</translation>
</message>
<message>
+ <source>via %1</source>
+ <translation>%1 kautta</translation>
+ </message>
+ <message>
+ <source>never</source>
+ <translation>ei koskaan</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <translation>Sisääntuleva</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <translation>Ulosmenevä</translation>
+ </message>
+ <message>
<source>Unknown</source>
<translation>Tuntematon</translation>
</message>
- </context>
+ <message>
+ <source>Fetching...</source>
+ <translation>Hankitaan...</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
@@ -1676,6 +1729,58 @@ Osoite: %4</translation>
<translation>Kustomoitu vaihtorahan osoite</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Rahansiirtokulu:</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>Valitse...</translation>
+ </message>
+ <message>
+ <source>collapse fee-settings</source>
+ <translation>pudota kulujen asetukset</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>per kilotavu</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>yhteensä ainakin</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(lue työkaluvinkki)</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Suositeltu:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>Muokattu:</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Vahvistusaika:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>normaali</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>nopea</translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Lähetä siirtokuluttomana jos mahdollista</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(vahvistaminen voi viedä kauemmin)</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Lähetä usealla vastaanottajalle samanaikaisesti</translation>
</message>
@@ -1752,10 +1857,6 @@ Osoite: %4</translation>
<translation>tai</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Vastaanottajan osoite on virheellinen. Tarkista osoite.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Maksettavan summan tulee olla suurempi kuin 0 Bitcoinia.</translation>
</message>
@@ -1768,10 +1869,6 @@ Osoite: %4</translation>
<translation>Kokonaismäärä ylittää saldosi kun %1 maksukulu lisätään summaan.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Sama osoite toistuu useamman kerran. Samaan osoitteeseen voi lähettää vain kerran per maksu.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Rahansiirron luonti epäonnistui!</translation>
</message>
@@ -1780,6 +1877,10 @@ Osoite: %4</translation>
<translation>Rahansiirto hylättiin! Tämä saattaa tapahtua jos lompakossa olevat kolikot on jo kulutettu, kuten jos käytät kopioita wallet.dat tiedostosta ja kolikot oli jos käytetty mutta ei merkattu täällä.</translation>
</message>
<message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Maksa vain vähimmäiskulu %1</translation>
+ </message>
+ <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Varoitus: Virheellinen Bitcoin osoite</translation>
</message>
@@ -1831,6 +1932,10 @@ Osoite: %4</translation>
<translation>Tämä on normaali maksu.</translation>
</message>
<message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation>Bitcoin-osoite johon maksu lähetetään</translation>
+ </message>
+ <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1851,10 +1956,6 @@ Osoite: %4</translation>
<translation>Viesti:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Tämä on varmistettu maksupyyntö.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Aseta nimi tälle osoitteelle lisätäksesi sen käytettyjen osoitteiden listalle.</translation>
</message>
@@ -1863,10 +1964,6 @@ Osoite: %4</translation>
<translation>Viesti joka liitettiin bitcoin: URI:iin tallennetaan rahansiirtoon viitteeksi. Tätä viestiä ei lähetetä Bitcoin-verkkoon.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Tämä on varmistamaton maksupyyntö</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Saaja:</translation>
</message>
@@ -1897,8 +1994,8 @@ Osoite: %4</translation>
<translation>&amp;Allekirjoita viesti</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Voit allekirjoittaa viestit omalla osoitteellasi todistaaksesi että omistat ne. Ole huolellinen, että et allekirjoita mitään epämääräistä, phishing-hyökkääjät voivat huijata sinua allekirjoittamaan luovuttamalla henkilöllisyytesi. Allekirjoita selvitys täysin yksityiskohtaisesti mihin olet sitoutunut.</translation>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation>Bitcoin-osoite jolla viesti allekirjoitetaan</translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -1949,8 +2046,8 @@ Osoite: %4</translation>
<translation>&amp;Varmista viesti</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Syötä allekirjoittava osoite, viesti ja allekirjoitus alla oleviin kenttiin varmistaaksesi allekirjoituksen aitouden. Varmista että kopioit kaikki kentät täsmälleen oikein, myös rivinvaihdot, välilyönnit, tabulaattorit, jne.</translation>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation>Bitcoin-osoite jolla viesti on allekirjoitettu</translation>
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
@@ -2094,6 +2191,10 @@ Osoite: %4</translation>
<translation>oma osoite</translation>
</message>
<message>
+ <source>watch-only</source>
+ <translation>vain katseltava</translation>
+ </message>
+ <message>
<source>label</source>
<translation>nimi</translation>
</message>
@@ -2114,6 +2215,14 @@ Osoite: %4</translation>
<translation>Debit</translation>
</message>
<message>
+ <source>Total debit</source>
+ <translation>Yhteensä debit</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation>Yhteensä credit</translation>
+ </message>
+ <message>
<source>Transaction fee</source>
<translation>Maksukulu</translation>
</message>
@@ -2200,10 +2309,6 @@ Osoite: %4</translation>
<translation>Laatu</translation>
</message>
<message>
- <source>Address</source>
- <translation>Osoite</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Epäkypsä (%1 varmistusta, saatavilla %2 jälkeen)</translation>
</message>
@@ -2232,6 +2337,10 @@ Osoite: %4</translation>
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Nimi</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Varmistamaton</translation>
</message>
@@ -2264,6 +2373,10 @@ Osoite: %4</translation>
<translation>Louhittu</translation>
</message>
<message>
+ <source>watch-only</source>
+ <translation>vain katseltava</translation>
+ </message>
+ <message>
<source>(n/a)</source>
<translation>(ei saatavilla)</translation>
</message>
@@ -2280,10 +2393,6 @@ Osoite: %4</translation>
<translation>Rahansiirron laatu.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Rahansiirron kohteen Bitcoin-osoite</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Saldoon lisätty tai siitä vähennetty määrä.</translation>
</message>
@@ -2375,6 +2484,10 @@ Osoite: %4</translation>
<translation>Vie rahansiirtohistoria</translation>
</message>
<message>
+ <source>Watch-only</source>
+ <translation>Vain katseltava</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation>Vienti epäonnistui</translation>
</message>
@@ -2429,7 +2542,11 @@ Osoite: %4</translation>
</context>
<context>
<name>UnitDisplayStatusBarControl</name>
- </context>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Yksikkö jossa määrät näytetään. Klikkaa valitaksesi toisen yksikön.</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2514,30 +2631,6 @@ Osoite: %4</translation>
<translation>Hyväksy yhteyksiä ulkopuolelta (vakioasetus: 1 jos -proxy tai -connect ei määritelty)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, sinun tulee asettaa rpcpassword asetustietostossa:
-%s
-Suositellaan että käytät allaolevaa satunnaista salasanaa:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(sinun ei tarvitse muistaa tätä salasanaa)
-Tämän tunnuksen ja salasanan TULEE OLLA sama.
-Jos tiedostoa ei ole, luo se vain omistajan-luku-oikeudella.
-Suositellaan asettaa alertnotify jotta saat tietoa ongelmista;
-esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Kytkeydy annettuun osoitteeseen ja pidä linja aina auki. Käytä [host]:portin merkintätapaa IPv6:lle.</translation>
</message>
@@ -2546,14 +2639,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Aloita regression testimoodi joka käyttää erikoisketjua jossa lohkoja voidaan ratkaista välittömästi.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Virhe: Rahansiirto hylättiin! Tämä saattaa tapahtua jos jotkut kolikot lompakossa on jo käytetty. Esimerkiksi jos kopioit wallet.dat tiedoston ja kolikot on käytetty mutta ei merkattu täällä.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Virhe: Tämä rahansiirto vaatii rahansiirtopalkkion vähintään %s johtuen sen määrästä, monimutkaisuudesta tai hiljattain vastaanotettujen summien käytöstä</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Suorita käsky kun lompakossa rahansiirto muuttuu (%s cmd on vaihdettu TxID kanssa)</translation>
</message>
@@ -2626,10 +2711,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Debuggaus/Testauksen valinnat:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Hae oma IP osoite (vakioasetus: 1 kun kuuntelemassa ja ei -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Älä lataa lompakkoa ja poista lompakon RPC kutsut</translation>
</message>
@@ -2658,10 +2739,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Varoitus: Levytila on vähissä!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Virhe: Lompakko on lukittu, rahansiirtoa ei voida luoda</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Ei onnistuttu kuuntelemaan missään portissa. Käytä -listen=0 jos haluat tätä.</translation>
</message>
@@ -2686,10 +2763,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ei tarpeeksi tiedostomerkintöjä vapaana.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Uudelleenrakenna lohkoketjuindeksi nykyisistä blk000??.dat tiedostoista</translation>
- </message>
- <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>Aseta tietokannan välimuistin koko megatavuissa (%d - %d, oletus: %d</translation>
</message>
@@ -2706,6 +2779,10 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Tämä on tarkoitettu regression testityökaluille ja ohjelman kehittämiseen.</translation>
</message>
<message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Käytä UPnP:ta kuuntelevan portin kartoittamiseen (oletus: %u)</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Varmistetaan lohkoja...</translation>
</message>
@@ -2742,6 +2819,14 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Aseta maksimikoko korkea prioriteetti/pieni palkkio rahansiirtoihin tavuissa (oletus: %d)</translation>
</message>
<message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>Aseta kolikoiden luomiseen tarkoitettujen säikeiden lukumäärä (-1 = kaikki ytimet, oletus: %d)</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Valitse data-hakemisto käynnistyksessä (oletus: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Yhdistä SOCKS5 proxin kautta</translation>
</message>
@@ -2766,8 +2851,8 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Virheellinen määrä -mintxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Tulosta lohko käynnistyksessä jos löydetään lohkoindeksistä</translation>
+ <source>Node relay options:</source>
+ <translation>Välityssolmukohdan asetukset:</translation>
</message>
<message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
@@ -2790,10 +2875,22 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Lähetä jäljitys/debug-tieto konsoliin, debug.log-tiedoston sijaan</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Aseta SSL root varmenne maksupyynnöille (oletus: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Set language, for example "de_DE" (default: system locale)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Näytä kaikki debuggaus valinnat: (käyttö: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Näytä aloitusruutu käynnistettäessä (oletus: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Pienennä debug.log tiedosto käynnistyksen yhteydessä (vakioasetus: 1 kun ei -debug)</translation>
</message>
@@ -2802,6 +2899,14 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Siirron vahvistus epäonnistui</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Käynnistä pienennettynä</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation>Tämä on ohjelmistoa kokeelliseen käyttöön.</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Siirtosumma liian pieni</translation>
</message>
@@ -2830,10 +2935,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Varoitus</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Varoitus: Tämä versio on vanhentunut, päivitys tarpeen!</translation>
- </message>
- <message>
<source>Zapping all transactions from wallet...</source>
<translation>Tyhjennetään kaikki rahansiirrot lompakosta....</translation>
</message>
@@ -2882,14 +2983,70 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Virhe ladattaessa wallet.dat-tiedostoa: Lompakko vioittunut</translation>
</message>
<message>
+ <source>(default: %s)</source>
+ <translation>(oletus: %s)</translation>
+ </message>
+ <message>
+ <source>Acceptable ciphers (default: %s)</source>
+ <translation>Hyväksyttävät salaukset (oletus: %s)</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>Virhe ladattaessa wallet.dat-tiedostoa</translation>
</message>
<message>
+ <source>Force safe mode (default: %u)</source>
+ <translation>Pakota yhteensopivuustila (oletus: %u)</translation>
+ </message>
+ <message>
+ <source>Generate coins (default: %u)</source>
+ <translation>Luo kolikoita (oletus: %u)</translation>
+ </message>
+ <message>
+ <source>How many blocks to check at startup (default: %u, 0 = all)</source>
+ <translation>Kuinka monta lohkoa tarkistetaan käynnistyksessä (oletus: %u, 0 = kaikki)</translation>
+ </message>
+ <message>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>Sisällytä IP-osoitteet virheenkorjauslokissa (oletus: %u)</translation>
+ </message>
+ <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Virheellinen proxy-osoite '%s'</translation>
</message>
<message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>Välitä ei-P2SH-multisig (oletus: %u)</translation>
+ </message>
+ <message>
+ <source>Server certificate file (default: %s)</source>
+ <translation>Palvelimen sertifikaattitiedosto (oletus: %s)</translation>
+ </message>
+ <message>
+ <source>Server private key (default: %s)</source>
+ <translation>Palvelimen private key (oletus: %s)</translation>
+ </message>
+ <message>
+ <source>Set key pool size to &lt;n&gt; (default: %u)</source>
+ <translation>Aseta avainaltaan kooksi &lt;n&gt; (oletus: %u)</translation>
+ </message>
+ <message>
+ <source>Set minimum block size in bytes (default: %u)</source>
+ <translation>Aseta pienin mahdollinen lohkokoko tavuina (oletus: %u)</translation>
+ </message>
+ <message>
+ <source>Set the number of threads to service RPC calls (default: %d)</source>
+ <translation>Aseta RPC-kutsujen palvelemiseen tarkoitettujen säikeiden lukumäärä (oletus: %d)</translation>
+ </message>
+ <message>
+ <source>Specify configuration file (default: %s)</source>
+ <translation>Määritä asetustiedosto (oletus: %s)</translation>
+ </message>
+ <message>
+ <source>Specify pid file (default: %s)</source>
+ <translation>Määritä pid-tiedosto (oletus: %s)</translation>
+ </message>
+ <message>
<source>Unknown network specified in -onlynet: '%s'</source>
<translation>Tuntematon verkko -onlynet parametrina: '%s'</translation>
</message>
@@ -2906,10 +3063,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>-paytxfee=&lt;amount&gt;: '%s' on virheellinen</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Virheellinen määrä</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Lompakon saldo ei riitä</translation>
</message>
@@ -2942,10 +3095,6 @@ esimerkiksi: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Lataus on valmis</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Käytä %s optiota</translation>
- </message>
- <message>
<source>Error</source>
<translation>Virhe</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts
index 71a1519411..67d920fd5e 100644
--- a/src/qt/locale/bitcoin_fr.ts
+++ b/src/qt/locale/bitcoin_fr.ts
@@ -1,9 +1,9 @@
-<TS language="fr" version="2.0">
+<TS language="fr" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Double cliquer afin de modifier l'adresse ou l'étiquette</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Cliquer à droite pour modifier l'adresse ou l'étiquette</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>Changer la phrase de passe</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Saisir l’ancienne phrase de passe pour le portefeuille ainsi que la nouvelle.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirmer le chiffrement du portefeuille</translation>
</message>
@@ -172,6 +168,10 @@
<translation>Êtes-vous sûr de vouloir chiffrer votre portefeuille ?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Bitcoin Core va maintenant se fermer pour terminer le processus de chiffrement. Souvenez-vous que le chiffrement de votre portefeuille ne peut pas vous protéger complètement contre le vol de vos bitcoins par des programmes malveillants infectant votre ordinateur.</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>IMPORTANT : Toute sauvegarde précédente de votre fichier de portefeuille devrait être remplacée par le nouveau fichier de portefeuille chiffré. Pour des raisons de sécurité, les sauvegardes précédentes de votre fichier de portefeuille non chiffré deviendront inutilisables dès que vous commencerez à utiliser le nouveau portefeuille chiffré.</translation>
</message>
@@ -188,8 +188,8 @@
<translation>Saisissez une nouvelle phrase de passe pour le portefeuille.&lt;br/&gt;Veuillez utiliser une phrase composée de &lt;b&gt;dix caractères aléatoires ou plus&lt;/b&gt;, ou bien de &lt;b&gt;huit mots ou plus&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin va à présent se fermer pour terminer le chiffrement. N'oubliez pas que le chiffrement de votre portefeuille n'est pas une protection totale contre le vol par des logiciels malveillants qui infecteraient votre ordinateur.</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Saisir l'ancienne phrase de passe puis la nouvelle phrase de passe du portefeuille.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -300,7 +300,7 @@
</message>
<message>
<source>Importing blocks from disk...</source>
- <translation>Importation des blocs depuis le disque...</translation>
+ <translation>Importation des blocs à partir du disque...</translation>
</message>
<message>
<source>Reindexing blocks on disk...</source>
@@ -311,10 +311,6 @@
<translation>Envoyer des pièces à une adresse Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modifier les options de configuration de Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Sauvegarder le portefeuille vers un autre emplacement</translation>
</message>
@@ -403,6 +399,10 @@
<translation>À &amp;propos de Bitcoin Core</translation>
</message>
<message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Modifier les options de configuration de Bitcoin Core</translation>
+ </message>
+ <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Afficher la liste d'adresses d'envoi et d'étiquettes utilisées</translation>
</message>
@@ -431,6 +431,10 @@
<translation>Aucune source de blocs disponible...</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>%n bloc d'historique transactionnel a été traité</numerusform><numerusform>%n blocs d'historique transactionnel ont été traités</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n heure</numerusform><numerusform>%n heures</numerusform></translation>
</message>
@@ -478,35 +482,49 @@
<source>Up to date</source>
<translation>À jour</translation>
</message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>%n bloc de l'historique transactionnel a été traité</numerusform><numerusform>%n blocs de l'historique transactionnel ont été traités</numerusform></translation>
- </message>
<message>
<source>Catching up...</source>
<translation>Rattrapage en cours…</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>Transaction envoyée</translation>
+ <source>Date: %1
+</source>
+ <translation>Date : %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>Transaction entrante</translation>
+ <source>Amount: %1
+</source>
+ <translation>Montant : %1
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Type: %1
+</source>
+ <translation>Type : %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
</source>
- <translation>Date : %1
-Montant : %2
-Type : %3
-Adresse : %4
+ <translation>Étiquette : %1
</translation>
</message>
<message>
+ <source>Address: %1
+</source>
+ <translation>Adresse : %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation>Transaction envoyée</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Transaction entrante</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Le portefeuille est &lt;b&gt;chiffré&lt;/b&gt; et est actuellement &lt;b&gt;déverrouillé&lt;/b&gt;</translation>
</message>
@@ -697,6 +715,14 @@ Adresse : %4
<translation>aucun</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Cette étiquette devient rouge si la taille de la transaction est plus grande que 1 000 octets.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Cette étiquette devient rouge si la priorité est plus basse que « moyenne ».</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation>Peut varier +/- %1 satoshi(s) par entrée.</translation>
</message>
@@ -709,10 +735,6 @@ Adresse : %4
<translation>non</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Cette étiquette devient rouge si la taille de la transaction est plus grande que 1 000 octets.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Ceci signifie que des frais d'au moins %1 par ko sont exigés.</translation>
</message>
@@ -725,10 +747,6 @@ Adresse : %4
<translation>Les transactions à priorité plus haute sont plus à même d'être incluses dans un bloc.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Cette étiquette devient rouge si la priorité est plus basse que « moyenne »</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(aucune étiquette)</translation>
</message>
@@ -849,30 +867,6 @@ Adresse : %4
<source>command-line options</source>
<translation>options de ligne de commande</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Options de l'interface utilisateur</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Définir la langue, par exemple « fr_CA » (par défaut : la langue du système)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Démarrer minimisé</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Définir les certificats SSL racine pour les requêtes de paiement (par défaut : -système-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Afficher l'écran d'accueil au démarrage (par défaut : 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Choisir un répertoire de données au démarrage (par défaut : 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -951,14 +945,6 @@ Adresse : %4
<translation>Réglages &amp;principaux</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Démarrer Bitcoin automatiquement après avoir ouvert une session sur l'ordinateur.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Démarrer Bitcoin lors de l'ouverture d'une session</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Taille du cache de la base de &amp;données</translation>
</message>
@@ -983,6 +969,14 @@ Adresse : %4
<translation>Adresse IP du mandataire (par ex. IPv4 : 127.0.0.1 / IPv6 : ::1)</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>Minimiser au lieu de quitter l'application lorsque la fenêtre est fermée. Si cette option est activée, l'application ne sera fermée qu'en sélectionnant Quitter dans le menu.</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>La langue de l'interface utilisateur peut être définie ici. Ce réglage sera pris en compte après redémarrage de Bitcoin.</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>URL de tiers (par ex. un explorateur de blocs) apparaissant dans l'onglet des transactions comme éléments du menu contextuel. %s dans l'URL est remplacé par le hachage de la transaction. Les URL multiples sont séparées par une barre verticale |.</translation>
</message>
@@ -1007,6 +1001,14 @@ Adresse : %4
<translation>&amp;Réseau</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>Démarrer Bitcoin Core automatiquement après avoir ouvert une session sur le système.</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>&amp;Démarrer Bitcoin Core lors de l'ouverture d'une session</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = auto, &lt; 0 = laisser ce nombre de cœurs inutilisés)</translation>
</message>
@@ -1071,10 +1073,6 @@ Adresse : %4
<translation>&amp;Minimiser dans la barre système au lieu de la barre des tâches</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 Quit in the menu.</source>
- <translation>Minimiser au lieu de quitter l'application lorsque la fenêtre est fermée. Si cette option est activée, l'application ne pourra être fermée qu'en sélectionnant Quitter dans le menu.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimiser lors de la fermeture</translation>
</message>
@@ -1087,10 +1085,6 @@ Adresse : %4
<translation>&amp;Langue de l'interface utilisateur :</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>La langue de l'interface utilisateur peut être définie ici. Ce réglage sera pris en compte après redémarrage de Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unité d'affichage des montants :</translation>
</message>
@@ -1127,8 +1121,8 @@ Adresse : %4
<translation>Le redémarrage du client est nécessaire pour activer les changements.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Le client sera arrêté, voulez-vous continuer?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>Le client sera arrêté. Voulez-vous continuer ?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1213,10 +1207,6 @@ Adresse : %4
<source>Current total balance in watch-only addresses</source>
<translation>Solde total actuel dans des adresses juste-regarder</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>désynchronisé</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1237,10 +1227,6 @@ Adresse : %4
<translation>Le réseau de la demande de paiement ne correspond pas au réseau du client.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>La demande de paiement est expirée.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>La demande de paiement n'est pas initialisée.</translation>
</message>
@@ -1273,14 +1259,30 @@ Adresse : %4
<translation>Le fichier de demande de paiement ne peut pas être lu ! Ceci peut être causé par un fichier de demande de paiement invalide.</translation>
</message>
<message>
+ <source>Payment request expired.</source>
+ <translation>Demande de paiement expirée.</translation>
+ </message>
+ <message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>Les demandes de paiements non vérifiées à des scripts de paiement personnalisés ne sont pas prises en charge.</translation>
</message>
<message>
+ <source>Invalid payment request.</source>
+ <translation>Demande de paiement invalide.</translation>
+ </message>
+ <message>
<source>Refund from %1</source>
<translation>Remboursement de %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>La demande de paiement %1 est trop grande (%2 octets, %3 octets permis).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Protection DdS des demandes de paiement</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Erreur de communication avec %1 : %2</translation>
</message>
@@ -1308,8 +1310,8 @@ Adresse : %4
<translation>Agent utilisateur</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adresse/nom d'hôte</translation>
+ <source>Node/Service</source>
+ <translation>Nœud/service</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1343,14 +1345,6 @@ Adresse : %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>RÉSEAU</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>INCONNU</translation>
- </message>
- <message>
<source>None</source>
<translation>Aucun</translation>
</message>
@@ -1441,6 +1435,10 @@ Adresse : %4
<translation>Nombre actuel de blocs</translation>
</message>
<message>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Ouvrir le journal de débogage du répertoire de données actuel. Ceci pourrait prendre quelques secondes pour les gros fichiers de journalisation.</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Reçu</translation>
</message>
@@ -1509,6 +1507,10 @@ Adresse : %4
<translation>Temps de ping</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation>Décalage temporel</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Horodatage du dernier bloc</translation>
</message>
@@ -1549,16 +1551,12 @@ Adresse : %4
<translation>Journal de débogage</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Ouvrir le journal de débogage de Bitcoin depuis le répertoire de données actuel. Ceci peut prendre quelques secondes pour les journaux de grande taille.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Nettoyer la console</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bienvenue sur la console RPC de Bitcoin.</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Bienvenue dans le console RPC de Bitcoin Core.</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
@@ -1566,7 +1564,7 @@ Adresse : %4
</message>
<message>
<source>Type &lt;b&gt;help&lt;/b&gt; for an overview of available commands.</source>
- <translation>Taper &lt;b&gt;help&lt;/b&gt; pour afficher une vue générale des commandes disponibles.</translation>
+ <translation>Taper &lt;b&gt;help&lt;/b&gt; pour afficher une vue générale des commandes proposées.</translation>
</message>
<message>
<source>%1 B</source>
@@ -1849,14 +1847,6 @@ Adresse : %4
<translation>réduire les paramètres des frais</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Minimiser</translation>
- </message>
- <message>
- <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
- <translation>Si les frais personnalisés sont définis à 1 000 satoshis et que la transaction est seulement de 250 octets, donc le « par kilo-octet » ne paiera que 250 satoshis de frais, alors que le « au moins » paiera 1 000 satoshis. Pour des transactions supérieures à un kilo-octet, les deux paieront par kilo-octets.</translation>
- </message>
- <message>
<source>per kilobyte</source>
<translation>par kilo-octet</translation>
</message>
@@ -1865,6 +1855,10 @@ Adresse : %4
<translation>Si les frais personnalisés sont définis à 1 000 satoshis et que la transaction est seulement de 250 octets, donc le « par kilo-octet » ne paiera que 250 satoshis de frais, alors que le « total au moins » paiera 1 000 satoshis. Pour des transactions supérieures à un kilo-octet, les deux paieront par kilo-octets.</translation>
</message>
<message>
+ <source>Hide</source>
+ <translation>Cacher</translation>
+ </message>
+ <message>
<source>total at least</source>
<translation>total au moins</translation>
</message>
@@ -1985,10 +1979,6 @@ Adresse : %4
<translation>ou</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>L'adresse du destinataire n’est pas valide, veuillez la vérifier.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Le montant à payer doit être supérieur à 0.</translation>
</message>
@@ -2001,10 +1991,6 @@ Adresse : %4
<translation>Le montant dépasse votre solde lorsque les frais de transaction de %1 sont inclus.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Adresse indentique trouvée, il n'est possible d'envoyer qu'une fois à chaque adresse par opération d'envoi.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>La création de la transaction a échoué !</translation>
</message>
@@ -2013,16 +1999,28 @@ Adresse : %4
<translation>La transaction a été rejetée ! Ceci peut arriver si certaines pièces de votre portefeuille étaient déjà dépensées, par exemple si vous avez utilisé une copie de wallet.dat et que des pièces ont été dépensées dans la copie sans être marquées comme telles ici.</translation>
</message>
<message>
- <source>A fee higher than %1 is considered an insanely high fee.</source>
- <translation>Des frais supérieurs à %1 sont considérés comme follement élevés.</translation>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation>Des frais supérieurs à %1 sont considérés comme ridiculement élevés.</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>Demande de paiement expirée.</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation><numerusform>Il est estimé que la confirmation commencera dans %n bloc.</numerusform><numerusform>Il est estimé que la confirmation commencera dans %n blocs.</numerusform></translation>
</message>
<message>
<source>Pay only the minimum fee of %1</source>
<translation>Payer seulement les frais minimum de %1</translation>
</message>
<message>
- <source>Estimated to begin confirmation within %1 block(s).</source>
- <translation>Début de confirmation estimé à %1 bloc(s).</translation>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>L'adresse du destinataire est invalide. Veuillez la vérifier.</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation>Adresse identique trouvée : chaque adresse ne devrait être utilisée qu'une fois.</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
@@ -2096,12 +2094,24 @@ Adresse : %4
<translation>Enlever cette entrée</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>Les frais seront déduits du montant envoyé. Le destinataire recevra moins de bitcoins que le montant saisi dans le champ de montant. Si plusieurs destinataires sont sélectionnés, les frais seront partagés également..</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation>S&amp;oustraire les frais du montant</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Message :</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Ceci est une demande de paiement vérifiée.</translation>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>Cette demande de paiement n'est pas authentifiée.</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>Cette demande de paiement est authentifiée.</translation>
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
@@ -2112,10 +2122,6 @@ Adresse : %4
<translation>Un message qui était joint à l'URI Bitcoin et qui sera stocké avec la transaction pour référence. Note : ce message ne sera pas envoyé par le réseau Bitcoin.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Ceci est une demande de paiement non vérifiée.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Payer à :</translation>
</message>
@@ -2146,8 +2152,8 @@ Adresse : %4
<translation>&amp;Signer un message</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Vous pouvez signer des messages avec vos adresses pour prouver que vous les détenez. Faites attention de ne pas signer de vague car des attaques d'hameçonnage peuvent essayer d'usurper votre identité par votre signature. Ne signez que des déclarations entièrement détaillées et avec lesquelles vous serez d'accord.</translation>
+ <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>Vous pouvez signer des messages/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>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -2202,8 +2208,8 @@ Adresse : %4
<translation>&amp;Vérifier un message</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Saisir ci-dessous l'adresse de signature, le message (assurez-vous d'avoir copié exactement les retours à la ligne, les espaces, tabulations etc.) et la signature pour vérifier le message. Faire attention à ne pas déduire davantage de la signature que ce qui est contenu dans le message signé lui-même pour éviter d'être trompé par une attaque d'homme du milieu.</translation>
+ <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>Saisissez ci-dessous l'adresse de destinataire, le message (assurez-vous de copier exactement les retours à la ligne, les espaces, les tabulations, etc.) et la signature pour vérifier le message. Faites attention à ne pas déduire davantage de la signature que ce qui est contenu dans le message signé même, pour éviter d'être trompé par une attaque d'homme du milieu. Notez que ceci ne fait que prouver que le signataire reçoit l'adresse et ne peut pas prouver la provenance d'une transaction.</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
@@ -2243,7 +2249,7 @@ Adresse : %4
</message>
<message>
<source>Private key for the entered address is not available.</source>
- <translation>La clef privée pour l'adresse indiquée n'est pas disponible.</translation>
+ <translation>La clef privée n'est pas disponible pour l'adresse indiquée.</translation>
</message>
<message>
<source>Message signing failed.</source>
@@ -2469,10 +2475,6 @@ Adresse : %4
<translation>Type</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Immature (%1 confirmations, sera disponible après %2)</translation>
</message>
@@ -2501,6 +2503,10 @@ Adresse : %4
<translation>Hors ligne</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Étiquette</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Non confirmé</translation>
</message>
@@ -2557,8 +2563,8 @@ Adresse : %4
<translation>Une adresse juste-regarder est-elle impliquée dans cette transaction.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>L’adresse de destination de la transaction.</translation>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation>Intention/but de la transaction défini par l'utilisateur.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2799,34 +2805,14 @@ Adresse : %4
<translation>Accepter les connexions entrantes (par défaut : 1 si aucun -proxy ou -connect )</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, vous devez définir un mot de passe rpc dans le fichier de configuration :
-%s
-Il vous est conseillé d'utiliser le mot de passe aléatoire suivant :
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(vous n'avez pas besoin de retenir ce mot de passe)
-Le nom d'utilisateur et le mot de passe NE DOIVENT PAS être identiques.
-Si le fichier n'existe pas, créez-le avec les droits de lecture accordés au propriétaire.
-Il est aussi conseillé de régler alertnotify pour être prévenu des problèmes ;
-par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Se lier à l'adresse donnée et toujours l'écouter. Utilisez la notation [host]:port pour l'IPv6</translation>
</message>
<message>
+ <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default: %u)</source>
+ <translation>Limiter continuellement les transactions gratuites à &lt;n&gt;*1000 octets par minute (par défaut : %u)</translation>
+ </message>
+ <message>
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
<translation>Supprimer toutes les transactions du portefeuille et ne récupérer que ces parties de la chaîne de bloc avec -rescan au démarrage</translation>
</message>
@@ -2839,14 +2825,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Passer en mode de test de régression qui utilise une chaîne spéciale dans laquelle les blocs sont résolus instantanément.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Erreur : La transaction a été rejetée ! Ceci peut arriver si certaines pièces de votre portefeuille étaient déjà dépensées, par exemple si vous avez utilisé une copie de wallet.dat et les pièces ont été dépensées avec cette copie sans être marquées comme tel ici.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Erreur : cette transaction exige des frais de transaction d'au moins %s en raison de son montant, de sa complexité ou de l'utilisation de fonds reçus récemment !</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Exécuter la commande lorsqu'une transaction de portefeuille change (%s dans la commande est remplacée par TxID)</translation>
</message>
@@ -2855,6 +2833,14 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Dans ce mode -genproclimit contrôle combien de blocs sont générés immédiatement.</translation>
</message>
<message>
+ <source>Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Total maximal des frais à utiliser en une seule transaction de portefeuille. Le définir trop bas pourrait interrompre les grosses transactions (par défaut : %s)</translation>
+ </message>
+ <message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, &gt;%u = target size in MiB to use for block files)</source>
+ <translation>Réduire les exigences de stockage en élaguant (supprimant) les anciens blocs. Ce mode désactive la prise en charge de portefeuilles et n'est pas compatible avec -txindex. Avertissement : configurer ce paramètre à sa valeur antérieure retéléchargera complètement la chaîne de blocs (par défaut : 0 = désactiver l'élagage des blocs, &gt;%u = taille cible en Mo à utiliser pour les fichiers de blocs).</translation>
+ </message>
+ <message>
<source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
<translation>Définir le nombre d'exétrons de vérification des scripts (%u à %d, 0 = auto, &lt; 0 = laisser ce nombre de cœurs inutilisés, par défaut : %d)</translation>
</message>
@@ -2923,10 +2909,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Options de test/de débogage :</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Découvrir sa propre adresse IP (par défaut : 1 lors de l'écoute et si aucun -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Ne pas charger le portefeuille et désactiver les appels RPC</translation>
</message>
@@ -2959,10 +2941,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Erreur : l'espace disque est faible !</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Erreur : Portefeuille verrouillé, impossible de créer la transaction !</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Échec de l'écoute sur un port quelconque. Utilisez -listen=0 si vous voulez ceci.</translation>
</message>
@@ -2984,15 +2962,19 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
</message>
<message>
<source>Not enough file descriptors available.</source>
- <translation>Pas assez de descripteurs de fichiers de disponibles.</translation>
+ <translation>Pas assez de descripteurs de fichiers proposés.</translation>
</message>
<message>
<source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
<translation>Seulement se connecter aux nœuds du réseau &lt;net&gt; (IPv4, IPv6 ou oignon)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Reconstruire l'index de la chaîne de blocs à partir des fichiers blk000??.dat courants</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>L'élagage ne peut pas être configuré avec une valeur négative.</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Le mode élagage n'est pas compatible avec -txindex.</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -3031,6 +3013,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Options du portefeuille :</translation>
</message>
<message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>Avertissement : cette version est obsolète. Une mise à niveau est exigée !</translation>
+ </message>
+ <message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>Vous devez reconstruire la base de données en utilisant -reindex afin de modifier -txindex</translation>
</message>
@@ -3059,14 +3045,14 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Impossible d’obtenir un verrou sur le répertoire de données %s. Bitcoin Core fonctionne probablement déjà.</translation>
</message>
<message>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
- <translation>Limiter continuellement les transactions gratuites à &lt;n&gt;*1000 octets par minute (par défaut : %u)</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Créer de nouveaux fichiers avec les permissions système par défaut, au lieu de umask 077 (effectif seulement avec la fonction du portefeuille désactivée)</translation>
</message>
<message>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Découvrir ses propres adresses (par défaut : 1 en écoute et sans externalip ou -proxy)</translation>
+ </message>
+ <message>
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
<translation>Erreur : l'écoute des connexions entrantes a échoué (l'écoute a retourné l'erreur %s)</translation>
</message>
@@ -3087,14 +3073,30 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Les frais (en BTC/Ko) inférieurs à ce seuil sont considérés comme étant nuls pour la création de transactions (par défaut : %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Si paytxfee n'est pas défini, inclure suffisamment de frais afin que les transactions commencent la confirmation en moyenne avant n blocs (par défaut : %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Montant invalide pour -maxtxfee=&lt;amount&gt; : « %s » (doit être au moins les frais minrelay de %s pour prévenir le blocage des transactions)</translation>
+ </message>
+ <message>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation>Quantité maximale de données dans les transactions du porteur de données que nous relayons et minons (par défaut : %u)</translation>
</message>
<message>
+ <source>Prune configured below the minimum of %d MB. Please use a higher number.</source>
+ <translation>L'élagage est configuré au-dessous du minimum de %d Mo. Veuillez utiliser un nombre plus élevé.</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Demander les adresses des pairs par recherche DNS si l'on manque d'adresses (par défaut : 1 sauf si -connect)</translation>
</message>
<message>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>Aléer les authentifiants pour chaque connexion mandataire. Ceci active l'isolement de flux de Tor (par défaut : %u) </translation>
+ </message>
+ <message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation>Définir la taille maximale en octets des transactions prioritaires/à frais modiques (par défaut : %d)</translation>
</message>
@@ -3103,10 +3105,42 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Définir le nombre de fils de génération de pièces, si elle est activée (-1 = tous les cœurs, par défaut : %d)</translation>
</message>
<message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>Le montant de la transaction est trop bas pour être envoyé une fois que les frais ont été déduits</translation>
+ </message>
+ <message>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation>Ce produit comprend des logiciels développés par le projet OpenSSL pour être utilisés dans la boîte à outils OpenSSL &lt;https://www.openssl.org/&gt; et un logiciel cryptographique écrit par Eric Young, ainsi qu'un logiciel UPnP écrit par Thomas Bernard.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>Pour utiliser bitcoind, ou l'option -server de bitcoin-qt, vous devez définir un mot de passe rpc dans le fichier de configuration :
+%s
+Il est recommandé d'utiliser le mot de passe aléatoire suivant :
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(vous n'avez pas à mémoriser ce mot de passe)
+Le nom d'utilisateur et le mot de passe NE DOIVENT PAS être identiques.
+Si le fichier n'existe pas, créez-le avec la permission lecture-seule-par-le-propriétaire.
+Il est aussi recommandé de définir alertnotify afin que les problèmes vous soient signalés ;
+par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Avertissement :-maxtxfee est défini très haut ! Des frais aussi élevés pourraient être payés sur une seule transaction.</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Avertissement : veuillez vérifier que l'heure et la date de votre ordinateur sont correctes ! Si votre horloge n'est pas à l'heure, Bitcoin Core ne fonctionnera pas correctement.</translation>
</message>
@@ -3115,10 +3149,38 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Les pairs de la liste blanche ne peuvent pas être bannis DoS et leurs transactions sont toujours relayées, même si elles sont déjà dans le mempool, utile p. ex. pour une passerelle</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>Vous devez reconstruire la base de données en utilisant -reindex afin de revenir au mode sans élagage. Ceci retéléchargera complètement la chaîne de blocs.</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(par défaut : %u)</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Accepter les demandes REST publiques (par défaut : %u)</translation>
+ </message>
+ <message>
+ <source>Activating best chain...</source>
+ <translation>Activation de la meilleure chaîne...</translation>
+ </message>
+ <message>
+ <source>Allow self signed root certificates (default: 0)</source>
+ <translation>Permettre les certificats racine autosignés (par défaut : 0)</translation>
+ </message>
+ <message>
+ <source>Can't run with a wallet in prune mode.</source>
+ <translation>L'exécution est impossible quand le portefeuille est en mode élagage.</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>Impossible de résoudre l'adresse -whitebind : « %s »</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Choisir un répertoire de données au démarrage (par défaut : 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Se connecter par un mandataire SOCKS5</translation>
</message>
@@ -3135,6 +3197,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Erreur lors du chargement de wallet.dat : le portefeuille exige une version plus récente de Bitcoin Core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Erreur de lecture de la base de données, fermeture en cours.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Erreur : argument non pris en charge -tor trouvé, utiliser -onion.</translation>
</message>
@@ -3151,6 +3217,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>L'initialisation du test de cohérence a échoué. Bitcoin est en cours de fermeture. </translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Montant invalide pour -maxtxfee=&lt;amount&gt; : « %s »</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Montant invalide pour -minrelayfee=&lt;montant&gt; : « %s »</translation>
</message>
@@ -3167,10 +3237,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Masque réseau invalide spécifié dans -whitelist : « %s »</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Garder au plus &lt;n&gt; blocs non connectables en mémoire (par défaut : %u)</translation>
- </message>
- <message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>Garder au plus &lt;n&gt; transactions non connectables en mémoire (par défaut : %u)</translation>
</message>
@@ -3183,10 +3249,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Options de relais du nœud :</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Imprimer le bloc au démarrage s'il est trouvé dans l'index des blocs</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Options RPC SSL : (voir le wiki Bitcoin pour les instructions de configuration de SSL)</translation>
</message>
@@ -3195,6 +3257,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Options du serveur RPC :</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>Prise en charge de RPC pour les connexions persistantes HTTP (par défaut : %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Abandonner aléatoirement 1 message du réseau sur &lt;n&gt;</translation>
</message>
@@ -3203,6 +3269,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Tester aléatoirement 1 message du réseau sur &lt;n&gt;</translation>
</message>
<message>
+ <source>Rebuild block chain index from current blk000??.dat files on startup</source>
+ <translation>Reconstruire au démarrage l'index de la chaîne de blocs à partir des fichiers blk000??.dat actuels</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Envoyer les informations de débogage/trace à la console au lieu du fichier debug.log</translation>
</message>
@@ -3211,10 +3281,22 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Envoyer si possible les transactions comme étant sans frais (par défaut : %u)</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Définir les certificats racine SSL pour les demandes de paiement (par défaut : -système-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Définir la langue, par exemple « fr_CA » (par défaut : la langue du système)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Montrer toutes les options de débogage (utilisation : --help --help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Afficher la page de garde au démarrage (par défaut : 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Réduire le fichier debug.log lors du démarrage du client (par défaut : 1 lorsque -debug n'est pas présent)</translation>
</message>
@@ -3223,6 +3305,14 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>La signature de la transaction a échoué</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Démarrer minimisé</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>Le montant de la transaction est trop bas pour que les frais soient payés</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Ceci est un logiciel expérimental.</translation>
</message>
@@ -3235,10 +3325,18 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Les montants de transaction doivent être positifs</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>La transaction est trop grosse pour la politique de frais</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Transaction trop volumineuse</translation>
</message>
<message>
+ <source>UI Options:</source>
+ <translation>Options de l'IU :</translation>
+ </message>
+ <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation>Impossible de se lier à %s sur cet ordinateur (bind a retourné l'erreur %s)</translation>
</message>
@@ -3259,10 +3357,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Avertissement</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Avertissement : cette version est obsolète, une mise à niveau est nécessaire !</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Avertissement : l'argument -benchmark non pris en charge a été ignoré, utiliser -debug=bench.</translation>
</message>
@@ -3331,10 +3425,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Degré de profondeur de la vérification des blocs -checkblocks (0-4, par défaut : %u)</translation>
</message>
<message>
- <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
- <translation>Si paytxfee n'est pas défini, inclure des frais suffisants afin que les transactions soient confirmées en moyenne en n blocs (par défaut : %u)</translation>
- </message>
- <message>
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
<translation>Lors du minage, journaliser la priorité des transactions et les frais par ko (par défaut : %u) </translation>
</message>
@@ -3411,6 +3501,10 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Garder au plus &lt;n&gt; connexions avec les pairs (par défaut : %u)</translation>
</message>
<message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>Obliger le portefeuille à diffuser les transactions</translation>
+ </message>
+ <message>
<source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
<translation>Tampon maximal de réception par connexion, &lt;n&gt;*1000 octets (par défaut : %u)</translation>
</message>
@@ -3427,10 +3521,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Ajouter l'horodatage au début de la sortie de débogage (par défaut : %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Imprimer l'arborescence des blocs au démarrage (par défaut : %u)</translation>
- </message>
- <message>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation>Relayer et miner les transactions du porteur de données (par défaut : %u)</translation>
</message>
@@ -3495,10 +3585,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Montant invalide pour -paytxfee=&lt;montant&gt; : « %s »</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Montant invalide</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fonds insuffisants</translation>
</message>
@@ -3531,10 +3617,6 @@ par exemple : alertnotify=echo %%s | mail -s "Alerte Bitcoin" admin@foo.com
<translation>Chargement terminé</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Pour utiliser l'option %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Erreur</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fr_CA.ts b/src/qt/locale/bitcoin_fr_CA.ts
index eae0b00b76..186985d493 100644
--- a/src/qt/locale/bitcoin_fr_CA.ts
+++ b/src/qt/locale/bitcoin_fr_CA.ts
@@ -1,11 +1,7 @@
-<TS language="fr_CA" version="2.0">
+<TS language="fr_CA" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Double-cliquez afin de modifier l'adress ou l'étiquette</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Créer une nouvelle adresse</translation>
</message>
@@ -173,8 +169,8 @@
<context>
<name>TransactionTableModel</name>
<message>
- <source>Address</source>
- <translation>Addresse</translation>
+ <source>Label</source>
+ <translation>Record</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_gl.ts b/src/qt/locale/bitcoin_gl.ts
index 2252baec73..2473260c84 100644
--- a/src/qt/locale/bitcoin_gl.ts
+++ b/src/qt/locale/bitcoin_gl.ts
@@ -1,11 +1,7 @@
-<TS language="gl" version="2.0">
+<TS language="gl" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Doble click para editar a dirección ou a etiqueta</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Crear unha nova dirección</translation>
</message>
@@ -152,10 +148,6 @@
<translation>Cambiar contrasinal</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Introduce o vello e novo contrasinais no moedeiro.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirmar encriptación de moedeiro</translation>
</message>
@@ -180,10 +172,6 @@
<translation>Moedeiro encriptado</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin se pechará agora para rematar o proceso de encriptación. Lembra que encriptar o teu moedeiro non protexe totalmente os teus bitcoins de ser robados por malware que infecte o teu ordenador.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Encriptación de moedeiro fallida</translation>
</message>
@@ -283,10 +271,6 @@
<translation>Enviar moedas a unha dirección Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modificar opcións de configuración para Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Facer copia de seguridade do moedeiro noutra localización</translation>
</message>
@@ -382,26 +366,10 @@
<source>Open a bitcoin: URI or payment request</source>
<translation>Abrir un bitcoin: URI ou solicitude de pago</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n conexión activa coa rede Bitcoin</numerusform><numerusform>%n conexións activas coa rede Bitcoin</numerusform></translation>
- </message>
<message>
<source>No block source available...</source>
<translation>Non hai orixe de bloques dispoñible...</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n hora</numerusform><numerusform>%n horas</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n día</numerusform><numerusform>%n días</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n semana</numerusform><numerusform>%n semanas</numerusform></translation>
- </message>
<message>
<source>%1 behind</source>
<translation>%1 detrás</translation>
@@ -443,18 +411,6 @@
<translation>Transacción entrante</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Data: %1
-Cantidade: %2
-Tipo: %3
-Dirección: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>O moedeiro está &lt;b&gt;encriptado&lt;/b&gt; e actualmente &lt;b&gt;desbloqueado&lt;/b&gt;</translation>
</message>
@@ -737,26 +693,6 @@ Dirección: %4
<source>command-line options</source>
<translation>opcións da liña de comandos</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>opcións de UI</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Fixar idioma, por exemplo "de_DE" (por defecto: locale del sistema)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Comezar minimizado</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Amosar pantalla splash no arranque (por defecto: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Escolle directorio de datos ao arrancar (por defecto: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -815,14 +751,6 @@ Dirección: %4
<translation>&amp;Principal</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Comezar Bitcoin automáticamente despois de loguearse no sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Comezar Bitcoin ao facer login no sistema</translation>
- </message>
- <message>
<source>Reset all client options to default.</source>
<translation>Restaurar todas as opcións de cliente ás por defecto</translation>
</message>
@@ -867,10 +795,6 @@ Dirección: %4
<translation>&amp;Minimizar á bandexa en lugar de á barra de tarefas.</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 Quit in the menu.</source>
- <translation>Minimizar en lugar de saír da aplicación cando se pecha a xanela. Cando se habilita esta opción, a aplicación so se pechará tras seleccionar Saír no menú.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimizar ao pechar</translation>
</message>
@@ -883,10 +807,6 @@ Dirección: %4
<translation>&amp;Linguaxe de interface de usuario:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>A linguaxe de interface de usuario pode fixarse aquí. Esta configuración terá efecto tras reiniciar Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unidade na que amosar as cantidades:</translation>
</message>
@@ -949,11 +869,7 @@ Dirección: %4
<source>Your current total balance</source>
<translation>O teu balance actual total</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>non sincronizado</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -1113,18 +1029,10 @@ Dirección: %4
<translation>Arquivo de log de depuración</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Abrir o arquivo de log de depuración de Bitcoin dende o directorio actual de datos. Esto pode levar uns cantos segundos para grandes arquivos de log.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Limpar consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Benvido á consola RPC de Bitcoin</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Emprega as flechas arriba e abaixo para navegar polo historial, e &lt;b&gt;Ctrl-L&lt;/b&gt; para limpar a pantalla.</translation>
</message>
@@ -1173,7 +1081,7 @@ Dirección: %4
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation>Limpar todos os campos do formulario</translation>
+ <translation>Limpar tódolos campos do formulario</translation>
</message>
<message>
<source>Clear</source>
@@ -1365,10 +1273,6 @@ Dirección: %4
<translation>Copiar cambio</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>A dirección de recepción non é válida, por favor compróbea.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>A cantidade a pagar debe ser maior que 0.</translation>
</message>
@@ -1381,10 +1285,6 @@ Dirección: %4
<translation>O total sobrepasa o teu balance cando se inclúe a tarifa de transacción %1.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Atopouse dirección duplicada, so se pode enviar a cada dirección unha vez por operación.</translation>
- </message>
- <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Atención: Enderezo Bitcoin non válido</translation>
</message>
@@ -1448,18 +1348,10 @@ Dirección: %4
<translation>Eliminar esta entrada</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Esta é unha solicitude de pago verificada</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Introduce unha etiqueta para esta dirección para engadila á listaxe de direccións empregadas</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Esta é unha solicitude de pago non verificada</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Pagar A:</translation>
</message>
@@ -1482,10 +1374,6 @@ Dirección: %4
<translation>&amp;Asinar Mensaxe</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Podes asinar mensaxes coas túas direccións para probar que ti as posees. Ten conta de non asinar nada vago, xa que hai ataques de phishing que tentarán que asines coa túa identidade por riba deles. Asina únicamente declaracións totalmente detalladas coas que esteas de acordo.</translation>
- </message>
- <message>
<source>Choose previously used address</source>
<translation>Escoller dirección previamente empregada</translation>
</message>
@@ -1534,10 +1422,6 @@ Dirección: %4
<translation>&amp;Verificar Mensaxe</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Introduce a dirección coa que asinar, a mensaxe (asegúrate de copiar exactamente os saltos de liña, espacios, tabulacións, etc.) e a sinatura debaixo para verificar a mensaxe. Ten coidado de non ler máis na sinatura do que hai no mensaxe asinado mesmo, a fin de evitar ser cazado nun ataque de home no medio.</translation>
- </message>
- <message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
<translation>Verificar a mensaxe para asegurar que foi asinada coa dirección Bitcoin especificada</translation>
</message>
@@ -1769,14 +1653,6 @@ Dirección: %4
<translation>Tipo</translation>
</message>
<message>
- <source>Address</source>
- <translation>Dirección</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Abrir para %n bloque máis</numerusform><numerusform>Abrir para %n bloques máis</numerusform></translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Aberto ata %1</translation>
</message>
@@ -1793,6 +1669,10 @@ Dirección: %4
<translation>Xerado pero non aceptado</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiqueta</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Recibido con</translation>
</message>
@@ -1829,10 +1709,6 @@ Dirección: %4
<translation>Tipo de transacción.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Dirección de destino da transacción.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Cantidade borrada ou engadida no balance.</translation>
</message>
@@ -2063,42 +1939,10 @@ Dirección: %4
<translation>Aceptar conexións de fóra (por defecto: 1 se non -proxy ou -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, debes fixar unha rpcpassword no arquivo de configuración:
-%s
-Reoméndase usar o seguinte contrasinal aleatorio:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(non precisas lembrar este contrasinal)
-O nome do usuario e o contrasinal DEBEN NON ser o mesmo.
-Se o arquivo non existe, debes crealo con permisos de so lectura para o propietario.
-Tamén é recomendable fixar alertnotify de modo que recibas notificación dos problemas;
-por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Enlazar a unha dirección dada e escoitar sempre nela. Emprega a notación [host]:post para IPv6</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Erro: A transacción foi rexeitada! Esto podería suceder se unha das moedas do teu moedeiro xa foi gastada, como se usas unha copia de wallet.dat e hai moedas que se gastaron na copia pero non foron marcadas como gastadas aquí.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Erro: Esta transacción require unha tarifa de transacción de alomenos %s debido á súa cantidade, complexidade ou emprego de fondos recentemente recibidos!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Executar comando cando unha transacción do moedeiro cambia (%s no comando é substituído por TxID)</translation>
</message>
@@ -2147,10 +1991,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Detectada base de datos de bloques corrupta.</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Descobrir dirección IP propia (por defecto: 1 se á escoita e non -externalip)</translation>
- </message>
- <message>
<source>Do you want to rebuild the block database now?</source>
<translation>Queres reconstruír a base de datos de bloques agora?</translation>
</message>
@@ -2175,10 +2015,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Erro: Espacio en disco escaso!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Erro: Moedeiro bloqueado, imposible crear transacción!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Fallou escoitar en calquera porto. Emprega -listen=0 se queres esto.</translation>
</message>
@@ -2195,10 +2031,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Non hai suficientes descritores de arquivo dispoñibles.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Reconstruír índice de cadea de bloque dende os ficheiros actuais blk000??.dat</translation>
- </message>
- <message>
<source>Specify wallet file (within data directory)</source>
<translation>Especificar arquivo do moedeiro (dentro do directorio de datos)</translation>
</message>
@@ -2227,6 +2059,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Executar comando cando se recibe unha alerta relevante ou vemos un fork realmente longo (%s no cmd é substituído pola mensaxe)</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Escolle directorio de datos ao arrancar (por defecto: 0)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Información</translation>
</message>
@@ -2243,6 +2079,14 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Enviar traza/información de depuración á consola en lugar de ao arquivo debug.log</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Fixar idioma, por exemplo "de_DE" (por defecto: locale del sistema)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Amosar pantalla splash no arranque (por defecto: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Recortar o arquivo debug.log ao arrancar o cliente (por defecto: 1 cando no-debug)</translation>
</message>
@@ -2251,6 +2095,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Fallou a sinatura da transacción</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Comezar minimizado</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>A cantidade da transacción é demasiado pequena</translation>
</message>
@@ -2275,10 +2123,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Precaución</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Precaución: Esta versión é obsoleta, precísase unha actualización!</translation>
- </message>
- <message>
<source>wallet.dat corrupt, salvage failed</source>
<translation>wallet.dat corrupto, fallou o gardado</translation>
</message>
@@ -2343,10 +2187,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Cantidade inválida para -paytxfee=&lt;cantidade&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Cantidade inválida</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fondos insuficientes</translation>
</message>
@@ -2379,10 +2219,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Carga completa</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Empregar a opción %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Erro</translation>
</message>
diff --git a/src/qt/locale/bitcoin_gu_IN.ts b/src/qt/locale/bitcoin_gu_IN.ts
index ef99b0dd39..b7b091aa39 100644
--- a/src/qt/locale/bitcoin_gu_IN.ts
+++ b/src/qt/locale/bitcoin_gu_IN.ts
@@ -1,4 +1,4 @@
-<TS language="gu_IN" version="2.0">
+<TS language="gu_IN" version="2.1">
<context>
<name>AddressBookPage</name>
</context>
diff --git a/src/qt/locale/bitcoin_he.ts b/src/qt/locale/bitcoin_he.ts
index b547058986..66dd05fca7 100644
--- a/src/qt/locale/bitcoin_he.ts
+++ b/src/qt/locale/bitcoin_he.ts
@@ -1,11 +1,7 @@
-<TS language="he" version="2.0">
+<TS language="he" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>לחיצה כפולה לעריכת כתובת או תווית</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>יצירת כתובת חדשה</translation>
</message>
@@ -110,7 +106,7 @@
</message>
<message>
<source>(no label)</source>
- <translation>(ללא תווית)</translation>
+ <translation>(אין תווית)</translation>
</message>
</context>
<context>
@@ -156,10 +152,6 @@
<translation>שינוי מילת צופן</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>נא להכניס את מילות הצופן הישנה והחדשה לארנק.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>אישור הצפנת הארנק</translation>
</message>
@@ -188,10 +180,6 @@
<translation>נא להזין את מילת הצופן החדשה לארנק.&lt;br/&gt;כדאי להשתמש במילת צופן המורכבת מ&lt;b&gt;עשרה תווים אקראיים ומעלה&lt;/b&gt;, או &lt;b&gt;שמונה מילים ומעלה&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>ביטקוין ייסגר כעת כדי להשלים את תהליך ההצפנה. עליך לזכור שהצפנת הארנק שלך אינה מגנה באופן מלא על הביטקוינים שלך מתכניות זדוניות המושתלות על המחשב.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>הצפנת הארנק נכשלה</translation>
</message>
@@ -311,10 +299,6 @@
<translation>שליחת מטבעות לכתובת ביטקוין</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>שינוי התצורה של ביטקוין</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>גיבוי הארנק למיקום אחר</translation>
</message>
@@ -426,18 +410,6 @@
<source>No block source available...</source>
<translation>אין מקור מקטעים זמין…</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n שעה</numerusform><numerusform>%n שעות</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n יום</numerusform><numerusform>%n ימים</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n שבוע</numerusform><numerusform>%n שבועות</numerusform></translation>
- </message>
<message>
<source>%1 and %2</source>
<translation>%1 ו%2</translation>
@@ -479,17 +451,6 @@
<translation>העברת קבלה</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>תאריך: %1
-כמות: %2
-סוג: %3
-כתובת: %4</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>הארנק &lt;b&gt;מוצפן&lt;/b&gt; ו&lt;b&gt;פתוח&lt;/b&gt; כרגע</translation>
</message>
@@ -517,7 +478,7 @@ Address: %4
</message>
<message>
<source>Amount:</source>
- <translation>כמות:</translation>
+ <translation>סכום:</translation>
</message>
<message>
<source>Priority:</source>
@@ -525,7 +486,7 @@ Address: %4
</message>
<message>
<source>Fee:</source>
- <translation>תשלום:</translation>
+ <translation>עמלה:</translation>
</message>
<message>
<source>Dust:</source>
@@ -537,7 +498,7 @@ Address: %4
</message>
<message>
<source>Change:</source>
- <translation>שינוי:</translation>
+ <translation>עודף:</translation>
</message>
<message>
<source>(un)select all</source>
@@ -601,7 +562,7 @@ Address: %4
</message>
<message>
<source>Copy fee</source>
- <translation>העתקת מחיר</translation>
+ <translation>העתקת עמלה</translation>
</message>
<message>
<source>Copy after fee</source>
@@ -676,10 +637,6 @@ Address: %4
<translation>לא</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>תווית זו מאדימה אם גודל ההעברה עולה על 1000 בתים.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>זאת אומרת שנחוצה עמלה של לא פחות מ־%1 לכל קילו בית.</translation>
</message>
@@ -692,10 +649,6 @@ Address: %4
<translation>העברות עם עדיפות גבוהה, יותר סיכוי שיכנסו לתוך המקטע.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>תווית זו מאדימה אם העדיפות היא פחות מ„בינוני“</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(אין תווית)</translation>
</message>
@@ -816,30 +769,6 @@ Address: %4
<source>command-line options</source>
<translation>אפשרויות שורת פקודה</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>אפשרויות מנשק</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>הגדרת שפה, למשל „he_il“ (בררת מחדל: שפת המערכת)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>התחלה במצב ממוזער</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>הגדרות אישורי בסיס של SSL לבקשות תשלום (בררת המחדל: -מערכת-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>הצגת מסך פתיחה בעת הפעלה (בררת מחדל: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>בחירת תיקיית נתונים עם ההפעלה (בררת מחדל: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -914,14 +843,6 @@ Address: %4
<translation>&amp;ראשי</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>הפעלת ביטקוין אוטומטית לאחר כניסה למערכת.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>ה&amp;פעלת ביטקוין בעת הכניסה למערכת</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>גודל מ&amp;טמון מסד הנתונים</translation>
</message>
@@ -1026,10 +947,6 @@ Address: %4
<translation>מ&amp;זעור למגש במקום לשורת המשימות</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 Quit in the menu.</source>
- <translation>מזעור התכנית במקום לצאת ממנה כשהחלון נסגר. כשאפשרות זו פעילה, התכנית תיסגר רק לאחר בחירת יציאה מהתפריט.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>מ&amp;זעור עם סגירה</translation>
</message>
@@ -1042,10 +959,6 @@ Address: %4
<translation>&amp;שפת מנשק המשתמש:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>להלן ניתן לקבוע את שפת מנשק המשתמש. הגדרה זו תיכנס לתוקף לאחר הפעלה מחדש של ביטקוין.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>י&amp;חידת מידה להצגת כמויות:</translation>
</message>
@@ -1082,10 +995,6 @@ Address: %4
<translation>נדרשת הפעלה מחדש של הלקוח כדי להפעיל את השינויים.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>הלקוח יכבה, האם להמשיך?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>שינוי זה ידרוש הפעלה מחדש של תכנית הלקוח.</translation>
</message>
@@ -1164,10 +1073,6 @@ Address: %4
<source>Current total balance in watch-only addresses</source>
<translation>המאזן הכולל הנוכחי בכתובות לצפייה בלבד</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>לא בסנכרון</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1188,10 +1093,6 @@ Address: %4
<translation>רשת בקשת התשלום אינה תואמת לרשת הלקוח.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>בקשת התשלום פגה.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>בקשת התשלום לא החלה.</translation>
</message>
@@ -1259,10 +1160,6 @@ Address: %4
<translation>סוכן משתמש</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>כתובת/שם מארח</translation>
- </message>
- <message>
<source>Ping Time</source>
<translation>זמן המענה</translation>
</message>
@@ -1294,14 +1191,6 @@ Address: %4
<translation>%1 שניות</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>רשת</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>לא ידוע</translation>
- </message>
- <message>
<source>None</source>
<translation>ללא</translation>
</message>
@@ -1500,18 +1389,10 @@ Address: %4
<translation>קובץ יומן ניפוי</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>פתיחת קובץ יומן הניפוי מתיקיית הנתונים הנוכחית. פעולה זו עשויה להימשך מספר שניות עבור קובצי יומן גדולים.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>ניקוי מסוף הבקרה</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>ברוכים הבאים למסוף ה־RPC של ביטקוין.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>יש להשתמש בחצים למעלה ולמטה כדי לנווט בהיסטוריה, וב־&lt;b&gt;Ctrl-L&lt;/b&gt; כדי לנקות את המסך.</translation>
</message>
@@ -1600,7 +1481,7 @@ Address: %4
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation>ניקוי כל השדות של הטופס.</translation>
+ <translation>ניקוי של כל השדות בטופס.</translation>
</message>
<message>
<source>Clear</source>
@@ -1805,7 +1686,7 @@ Address: %4
</message>
<message>
<source>Clear &amp;All</source>
- <translation>ניקוי ה&amp;כול</translation>
+ <translation>&amp;ניקוי הכול</translation>
</message>
<message>
<source>Balance:</source>
@@ -1833,7 +1714,7 @@ Address: %4
</message>
<message>
<source>Copy amount</source>
- <translation>העתקת סכום</translation>
+ <translation>העתקת כמות</translation>
</message>
<message>
<source>Copy fee</source>
@@ -1864,10 +1745,6 @@ Address: %4
<translation>או</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>כתובת המוטב אינה תקינה, נא לבדוק שוב.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>הכמות לתשלום חייבת להיות גדולה מ־0.</translation>
</message>
@@ -1880,10 +1757,6 @@ Address: %4
<translation>הכמות הכוללת, ובכללה עמלת העברה בסך %1, עולה על המאזן שלך.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>כתובת כפולה נמצאה, ניתן לשלוח לכל כתובת רק פעם אחת בכל פעולת שליחה.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>יצירת ההעברה נכשלה!</translation>
</message>
@@ -1967,10 +1840,6 @@ Address: %4
<translation>הודעה:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>זוהי בקשה מאומתת לתשלום.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>יש להזין תווית עבור כתובת זו כדי להוסיף אותה לרשימת הכתובות בשימוש</translation>
</message>
@@ -1979,10 +1848,6 @@ Address: %4
<translation>הודעה שצורפה לביטקוין: כתובת שתאוחסן בהעברה לצורך מעקב מצדך. לתשומת לבך: הודעה זו לא תישלח ברשת הביטקוין.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>זוהי בקשת תשלום בלתי־מאומתת.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>תשלום לטובת:</translation>
</message>
@@ -2013,10 +1878,6 @@ Address: %4
<translation>חתימה על הו&amp;דעה</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>ניתן לחתום על הודעות עם הכתובות שלך כדי להוכיח שהן בבעלותך. מומלץ להיזהר לא לחתום על משהו מפוקפק, שכן התקפות דיוג עשויות לגרום לך בעורמה למסור את זהותך. רצוי לחתום רק על הצהרות מפורטות לחלוטין שהסכמת עמן.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>כתובת הביטקוין אתה לחתום אתה את ההודעה</translation>
</message>
@@ -2069,10 +1930,6 @@ Address: %4
<translation>&amp;אימות הודעה</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>הכנס למטה את הכתובת החותמת, ההודעה (ודא שאתה מעתיק מעברי שורה, רווחים, טאבים וכו' באופן מדויק) והחתימה כדי לאמת את ההודעה. היזהר לא לפרש את החתימה כיותר ממה שמופיע בהודעה החתומה בעצמה, כדי להימנע מליפול קורבן למתקפת איש-באמצע.</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>כתובת הביטקוין שאתה נחתמה ההודעה</translation>
</message>
@@ -2297,10 +2154,6 @@ Address: %4
<source>, has not been successfully broadcast yet</source>
<translation>, טרם שודר בהצלחה</translation>
</message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>פתיחה למשך מקטע %n נוסף</numerusform><numerusform>פתיחה למשך %n מקטעים נוספים</numerusform></translation>
- </message>
<message>
<source>unknown</source>
<translation>לא ידוע</translation>
@@ -2328,17 +2181,9 @@ Address: %4
<translation>סוג</translation>
</message>
<message>
- <source>Address</source>
- <translation>כתובת</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>לא בשל (%1 אישורים, יהיו זמינים לאחר %2)</translation>
</message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>פתח למשך בלוק %n יותר</numerusform><numerusform>פתיחה למשך %n מקטעים נוספים</numerusform></translation>
- </message>
<message>
<source>Open until %1</source>
<translation>פתוחה עד %1</translation>
@@ -2360,6 +2205,10 @@ Address: %4
<translation>מנותק</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>תווית</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>ללא אישור</translation>
</message>
@@ -2416,10 +2265,6 @@ Address: %4
<translation>האם כתובות לצפייה בלבד מעורבות בהעברה זאת או שלא.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>כתובת היעד של ההעברה.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>הכמות שהתווספה או הוסרה מהיתרה.</translation>
</message>
@@ -2658,30 +2503,6 @@ Address: %4
<translation>קבלת חיבורים מבחוץ (בררת מחדל: 1 ללא ‎-proxy או ‎-connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, עליך להגדיר את ססמת ה־RPC בקובץ התצורה:
- %s
-מומלץ להשתמש בססמה האקראית הבאה:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(אין צורך לזכור את הססמה)
-אסור ששם המשתמש והססמה יהיו זהים.
-אם הקובץ אינו קיים, יש ליצור אותו עם הרשאות קריאה לבעלים בלבד.
-כמו כן, מומלץ להגדיר את alertnotify כדי לקבל דיווח על תקלות;
-למשל: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>להתאגד לכתובת נתונה להאזין לה תמיד. יש להשתמש בצורה ‎[host]:port עבור IPv6.</translation>
</message>
@@ -2694,14 +2515,6 @@ rpcpassword=%s
<translation>כניסה למצב בדיקת נסיגה, שמשתמש בשרשרת מיוחדת בה ניתן לפתור את המקטעים במהירות.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>שגיאה: ההעברה נדחתה! מצב כזה עלול לקרות אם כמה מהמטבעות בארנק שלך כבר נוצלו, למשל אם השתמשת בעותק של wallet.dat ומטבעות נשלחו בעותק אך לא סומנו כמושקעות כאן.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>שגיאה: ההעברה הזאת דורשת עמלת פעולה של לפחות %s עקב הכמות, המורכבות או השימוש בכספים שהתקבלו לאחרונה!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>ביצוע פקודה כאשר העברה בארנק משתנה (%s ב־cmd יוחלף ב־TxID)</translation>
</message>
@@ -2766,10 +2579,6 @@ rpcpassword=%s
<translation>אפשרויות ניפוי/בדיקה:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>לגלות את כתובת ה־IP העצמית (בררת מחדל: 1 בעת האזנה וללא ‎-externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>לא לטעון את הארנק ולנטרל קריאות RPC</translation>
</message>
@@ -2798,10 +2607,6 @@ rpcpassword=%s
<translation>שגיאה: מעט מקום פנוי בכונן!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>שגיאה: הארנק נעול, אין אפשרות ליצור העברה!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>האזנה נכשלה בכל פורט. השתמש ב- -listen=0 אם ברצונך בכך.</translation>
</message>
@@ -2830,10 +2635,6 @@ rpcpassword=%s
<translation>תמיד להתחבר למפרקים ברשת &lt;net&gt;‏ (ipv4,‏ ipv6 או onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>בנייה מחדש של מפתח שרשרת המקטעים מקובצי ה־blk000??.dat הנוכחיים.</translation>
- </message>
- <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>הגדרת גודל מטמון מסדי הנתונים במגה בתים (%d עד %d, בררת מחדל: %d)</translation>
</message>
@@ -2890,6 +2691,10 @@ rpcpassword=%s
<translation>לא ניתן לפתור את הכתובת ‎-whitebind:‏ '%s'</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>בחירת תיקיית נתונים עם ההפעלה (בררת מחדל: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>התחברות דרך מתווך SOCKS5</translation>
</message>
@@ -2946,10 +2751,6 @@ rpcpassword=%s
<translation>אפשרויות ממסר מפרק:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>הצגת מקטע בהפעלה, אם נמצא במפתח המקטעים</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>אפשרויות RPC SSL: (נא לעיין בוויקי של ביטקוין לקבלת הנחיות על הגדרת SSL)</translation>
</message>
@@ -2966,10 +2767,22 @@ rpcpassword=%s
<translation>שלח מידע דיבאג ועקבה לקונסולה במקום לקובץ debug.log</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>הגדרות אישורי בסיס של SSL לבקשות תשלום (בררת המחדל: -מערכת-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>הגדרת שפה, למשל „he_il“ (בררת מחדל: שפת המערכת)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>הצגת כל אפשרויות הניפוי (שימוש: ‎--help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>הצגת מסך פתיחה בעת הפעלה (בררת מחדל: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>כיווץ הקובץ debug.log בהפעלת הלקוח (בררת מחדל: 1 ללא ‎-debug)</translation>
</message>
@@ -2978,6 +2791,10 @@ rpcpassword=%s
<translation>החתימה על ההעברה נכשלה</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>התחלה במצב ממוזער</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>זוהי תכנית נסיונית.</translation>
</message>
@@ -3014,10 +2831,6 @@ rpcpassword=%s
<translation>אזהרה</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>אזהרה: הגרסה הזאת מיושנת, יש צורך בשדרוג!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>אזהרה: הארגומנט שאינו נתמך עוד ‎-benchmark לא הופעל, נא להשתמש ב־‎-debug=bench.</translation>
</message>
@@ -3094,10 +2907,6 @@ rpcpassword=%s
<translation>כמות לא תקינה עבור ‎-paytxfee=&lt;amount&gt;‎:‏ '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>כמות לא תקינה</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>אין מספיק כספים</translation>
</message>
@@ -3130,10 +2939,6 @@ rpcpassword=%s
<translation>טעינה הושלמה</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>שימוש באפשרות %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>שגיאה</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hi_IN.ts b/src/qt/locale/bitcoin_hi_IN.ts
index 09a8392c27..5fe8635dc0 100644
--- a/src/qt/locale/bitcoin_hi_IN.ts
+++ b/src/qt/locale/bitcoin_hi_IN.ts
@@ -1,11 +1,7 @@
-<TS language="hi_IN" version="2.0">
+<TS language="hi_IN" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>दो बार क्लिक करे पता या लेबल संपादन करने के लिए !</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>नया पता लिखिए !</translation>
</message>
@@ -88,10 +84,6 @@
<translation>पहचान शब्द/अक्षर बदलिये !</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>कृपा करके पुराना एवं नया पहचान शब्द/अक्षर वॉलेट में डालिए !</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>वॉलेट एनक्रिपशन को प्रमाणित कीजिए !</translation>
</message>
@@ -191,22 +183,6 @@
<source>Tabs toolbar</source>
<translation>टैबस टूलबार</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n सक्रिया संपर्क बीटकोइन नेटवर्क से</numerusform><numerusform>%n सक्रिया संपर्क बीटकोइन नेटवर्क से</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n घंटा</numerusform><numerusform>%n घंटे</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n दिन</numerusform><numerusform>%n दिनो</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n हफ़्ता</numerusform><numerusform>%n हफ्ते</numerusform></translation>
- </message>
<message>
<source>%1 behind</source>
<translation>%1 पीछे</translation>
@@ -236,17 +212,6 @@
<translation>प्राप्त हुई ट्रांजक्शन</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>तारीख: %1\n
-राशि: %2\n
-टाइप: %3\n
-पता:%4\n</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>वॉलेट एन्क्रिप्टेड है तथा अभी लॉक्ड नहीं है</translation>
</message>
@@ -631,10 +596,6 @@ Address: %4
<translation>टाइप</translation>
</message>
<message>
- <source>Address</source>
- <translation>पता</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>खुला है जबतक %1</translation>
</message>
@@ -651,8 +612,12 @@ Address: %4
<translation>जेनरेट किया गया किंतु स्वीकारा नही गया !</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>लेबल</translation>
+ </message>
+ <message>
<source>Received with</source>
- <translation>स्वीकारा गया</translation>
+ <translation>स्वीकार करना</translation>
</message>
<message>
<source>Received from</source>
@@ -687,10 +652,6 @@ Address: %4
<translation>ट्रांसेक्शन का प्रकार|</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>ट्रांसेक्शन की मंजिल का पता|</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>अमाउंट बैलेंस से निकला या जमा किया गया |</translation>
</message>
@@ -877,10 +838,6 @@ Address: %4
<translation>पता पुस्तक आ रही है...</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>राशि ग़लत है</translation>
- </message>
- <message>
<source>Loading block index...</source>
<translation>ब्लॉक इंडेक्स आ रहा है...</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hr.ts b/src/qt/locale/bitcoin_hr.ts
index 22831a0fd5..62bfe6a11f 100644
--- a/src/qt/locale/bitcoin_hr.ts
+++ b/src/qt/locale/bitcoin_hr.ts
@@ -1,11 +1,7 @@
-<TS language="hr" version="2.0">
+<TS language="hr" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dvostruki klik za uređivanje adrese ili oznake</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Dodajte novu adresu</translation>
</message>
@@ -87,7 +83,7 @@
</message>
<message>
<source>Comma separated file (*.csv)</source>
- <translation>Datoteka vrijednosti odvojenih zarezom (*. csv)</translation>
+ <translation>Datoteka podataka odvojenih zarezima (*.csv)</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -156,10 +152,6 @@
<translation>Promjena lozinke</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Unesite staru i novu lozinku za novčanik.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Potvrdi šifriranje novčanika</translation>
</message>
@@ -188,10 +180,6 @@
<translation>Unesite novu lozinku za novčanik. &lt;br/&gt;Molimo Vas da koristite zaporku od &lt;b&gt;deset ili više slučajnih znakova&lt;/b&gt;, ili &lt;b&gt;osam ili više riječi.&lt;/b&gt;</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin će se sada zatvoriti kako bi dovršio postupak šifriranja. Zapamtite da šifriranje vašeg novčanika ne može u potpunosti zaštititi vaše bitcoine od krađe preko zloćudnog softvera koji bi bio na vašem računalu.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Šifriranje novčanika nije uspjelo</translation>
</message>
@@ -311,10 +299,6 @@
<translation>Slanje novca na bitcoin adresu</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Promijeni postavke konfiguracije za bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Napravite sigurnosnu kopiju novčanika na drugoj lokaciji</translation>
</message>
@@ -410,10 +394,6 @@
<source>Show the list of used receiving addresses and labels</source>
<translation>Prikaži popis korištenih adresa i oznaka za primanje isplate</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n aktivna veza na Bitcoin mrežu</numerusform><numerusform>%n aktivne veze na Bitcoin mrežu</numerusform><numerusform>%n aktivnih veza na Bitcoin mrežu</numerusform></translation>
- </message>
<message>
<source>Error</source>
<translation>Greška</translation>
@@ -443,18 +423,6 @@
<translation>Dolazna transakcija</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Datum:%1
-Iznos:%2
-Tip:%3
-Adresa:%4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Novčanik je &lt;b&gt;šifriran&lt;/b&gt; i trenutno &lt;b&gt;otključan&lt;/b&gt;</translation>
</message>
@@ -567,20 +535,12 @@ Adresa:%4
</message>
<message>
<source>About Bitcoin Core</source>
- <translation>O Bitcoin Jezrgu</translation>
+ <translation>O Bitcoinovoj jezgri</translation>
</message>
<message>
<source>Usage:</source>
<translation>Upotreba:</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI postavke</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Pokreni minimiziran</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -594,7 +554,7 @@ Adresa:%4
</message>
<message>
<source>Error</source>
- <translation>Pogreška</translation>
+ <translation>Greška</translation>
</message>
</context>
<context>
@@ -611,14 +571,6 @@ Adresa:%4
<translation>&amp;Glavno</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Automatski pokreni Bitcoin kad se uključi računalo</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Pokreni Bitcoin kod pokretanja sustava</translation>
- </message>
- <message>
<source>&amp;Network</source>
<translation>&amp;Mreža</translation>
</message>
@@ -651,10 +603,6 @@ Adresa:%4
<translation>&amp;Minimiziraj u sistemsku traku umjesto u traku programa</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 Quit in the menu.</source>
- <translation>Minimizirati umjesto izaći iz aplikacije kada je prozor zatvoren. Kada je ova opcija omogućena, aplikacija će biti zatvorena tek nakon odabira Izlaz u izborniku.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimiziraj kod zatvaranja</translation>
</message>
@@ -793,10 +741,6 @@ Adresa:%4
<translation>Očisti konzolu</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Dobrodošli u Bitcoin RPC konzolu.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Kako bi navigirali kroz povijest koristite strelice gore i dolje. &lt;b&gt;Ctrl-L&lt;/b&gt; kako bi očistili ekran.</translation>
</message>
@@ -917,10 +861,6 @@ Adresa:%4
<translation>ili</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Adresa primatelja je nevaljala, molimo provjerite je ponovo.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Iznos mora biti veći od 0.</translation>
</message>
@@ -933,10 +873,6 @@ Adresa:%4
<translation>Iznos je veći od stanja računa kad se doda naknada za transakcije od %1.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Pronašli smo adresu koja se ponavlja. U svakom plaćanju program može svaku adresu koristiti samo jedanput.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(bez oznake)</translation>
</message>
@@ -990,10 +926,6 @@ Adresa:%4
<translation>&amp;Potpišite poruku</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Možete potpisati poruke sa svojom adresom kako bi dokazali da ih posjedujete. Budite oprezni da ne potpisujete ništa mutno, jer bi vas phishing napadi mogli na prevaru natjerati da prepišete svoj identitet njima. Potpisujte samo detaljno objašnjene izjave sa kojima se slažete.</translation>
- </message>
- <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1169,10 +1101,6 @@ Adresa:%4
<translation>Tip</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Otvoren do %1</translation>
</message>
@@ -1189,6 +1117,10 @@ Adresa:%4
<translation>Generirano, ali nije prihvaćeno</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Oznaka</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Primljeno s</translation>
</message>
@@ -1225,10 +1157,6 @@ Adresa:%4
<translation>Vrsta transakcije.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Odredište transakcije</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Iznos odbijen od ili dodan k saldu.</translation>
</message>
@@ -1443,6 +1371,10 @@ Adresa:%4
<translation>Šalji trace/debug informacije na konzolu umjesto u debug.log datoteku</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Pokreni minimiziran</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
<translation>Pokušaj koristiti UPnP da otvoriš port za uslugu (default: 1 when listening)</translation>
</message>
@@ -1503,10 +1435,6 @@ Adresa:%4
<translation>Nevaljali iznos za opciju -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Nevaljali iznos za opciju</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nedovoljna sredstva</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hu.ts b/src/qt/locale/bitcoin_hu.ts
index 8109542405..c84d2c4e87 100644
--- a/src/qt/locale/bitcoin_hu.ts
+++ b/src/qt/locale/bitcoin_hu.ts
@@ -1,9 +1,9 @@
-<TS language="hu" version="2.0">
+<TS language="hu" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dupla-kattintás a cím vagy címke szerkesztéséhez</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>A cím vagy címke szerkeszteséhez kattintson a jobb gombbal</translation>
</message>
<message>
<source>Create a new address</source>
@@ -87,7 +87,7 @@
</message>
<message>
<source>Comma separated file (*.csv)</source>
- <translation>Vesszővel elválasztott fájl (*. csv)</translation>
+ <translation>Vesszővel elválasztott fájl (*.csv)</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -156,10 +156,6 @@
<translation>Jelszó megváltoztatása</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Írd be a tárca régi és új jelszavát.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Biztosan titkosítani akarod a tárcát?</translation>
</message>
@@ -188,10 +184,6 @@
<translation>Add meg a tárca új jelszavát.&lt;br/&gt;Olyan jelszót válassz, ami &lt;b&gt;legalább tíz véletlenszerű karakterből&lt;/b&gt; vagy &lt;b&gt;legalább 8 véletlenszerű szóból&lt;/b&gt; áll.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>A Bitcoin Core most bezár, hogy befejezze a titkosítást. Ne feledd: a tárca titkosítása nem nyújt teljes védelmet azzal szemben, hogy adathalász programok megfertőzzék a számítógéped és ellopják a bitcoinjaid.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>A tárca titkosítása sikertelen.</translation>
</message>
@@ -311,10 +303,6 @@
<translation>Bitcoin küldése megadott címre</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Bitcoin konfigurációs opciók</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Biztonsági másolat készítése a tárcáról egy másik helyre</translation>
</message>
@@ -422,34 +410,14 @@
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
<translation>A Bitcoin Core súgóüzenet megjelenítése a Bitcoin lehetséges parancssori kapcsolóival.</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n aktív kapcsolat a Bitcoin-hálózattal</numerusform><numerusform>%n aktív kapcsolat a Bitcoin-hálózattal</numerusform></translation>
- </message>
<message>
<source>No block source available...</source>
<translation>Blokk forrása ismeretlen...</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n óra</numerusform><numerusform>%n óra</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n nap</numerusform><numerusform>%n nap</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n hét</numerusform><numerusform>%n hét</numerusform></translation>
- </message>
<message>
<source>%1 and %2</source>
<translation>%1 és %2</translation>
</message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation><numerusform>%n év</numerusform><numerusform>%n év</numerusform></translation>
- </message>
<message>
<source>%1 behind</source>
<translation>%1 lemaradás</translation>
@@ -491,18 +459,6 @@
<translation>Beérkező tranzakció</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Dátum: %1
-Összeg: %2
-Típus: %3
-Cím: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>A tárca &lt;b&gt;titkosítva&lt;/b&gt; és jelenleg &lt;b&gt;nyitva&lt;/b&gt;.</translation>
</message>
@@ -630,7 +586,7 @@ Cím: %4
</message>
<message>
<source>Copy dust</source>
- <translation>Por-határ másolása</translation>
+ <translation>Visszajáró másolása</translation>
</message>
<message>
<source>Copy change</source>
@@ -693,10 +649,6 @@ Cím: %4
<translation>nem</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Ez a címke piros lesz, ha tranzakció mérete nagyobb 1000 byte-nál.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Legalább %1 díj szüksége kB-onként.</translation>
</message>
@@ -709,14 +661,6 @@ Cím: %4
<translation>Nagyobb prioritású tranzakciók nagyobb valószínűséggel kerülnek be egy blokkba.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Ez a címke piros lesz, ha a prioritás közepesnél alacsonyabb.</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Ez a címke piros lesz, ha valamelyik elfogadó kevesebbet kap mint %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(nincs címke)</translation>
</message>
@@ -833,31 +777,6 @@ Cím: %4
<source>command-line options</source>
<translation>parancssoros opciók</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI opciók</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Nyelvbeállítás, például "de_DE" (alapértelmezett: rendszer nyelve)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Indítás lekicsinyítve
-</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>SLL gyökér-igazolások megadása fizetési kérelmekhez (alapértelmezett: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Indítóképernyő mutatása induláskor (alapértelmezett: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Adatkönyvtár kiválasztása induláskor (alapbeállítás: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -870,10 +789,22 @@ Cím: %4
<translation>Üdvözlünk a Bitcoin Core-ban.</translation>
</message>
<message>
+ <source>Use the default data directory</source>
+ <translation>Az alapértelmezett adat könyvtár használata</translation>
+ </message>
+ <message>
+ <source>Use a custom data directory:</source>
+ <translation>Saját adatkönyvtár használata:</translation>
+ </message>
+ <message>
<source>Bitcoin Core</source>
<translation>Bitcoin Core</translation>
</message>
<message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation>Hiba: A megadott "%1" adatkönyvtár nem hozható létre. </translation>
+ </message>
+ <message>
<source>Error</source>
<translation>Hiba</translation>
</message>
@@ -896,7 +827,11 @@ Cím: %4
<source>Select payment request file</source>
<translation>Fizetési kérelmi fájl kiválasztása</translation>
</message>
- </context>
+ <message>
+ <source>Select payment request file to open</source>
+ <translation>Fizetés kérelmi fájl kiválasztása</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -908,16 +843,20 @@ Cím: %4
<translation>&amp;Fő</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Induljon el a Bitcoin a számítógép bekapcsolásakor</translation>
+ <source>MB</source>
+ <translation>MB</translation>
</message>
<message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Induljon el a számítógép bekapcsolásakor</translation>
+ <source>Accept connections from outside</source>
+ <translation>Külső kapcsolatok elfogadása</translation>
</message>
<message>
- <source>MB</source>
- <translation>MB</translation>
+ <source>Allow incoming connections</source>
+ <translation>Bejövő kapcsolatok engedélyezése</translation>
+ </message>
+ <message>
+ <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
+ <translation>A proxy IP címe (pl.: IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
<message>
<source>Reset all client options to default.</source>
@@ -964,10 +903,6 @@ Cím: %4
<translation>&amp;Kicsinyítés a tálcára az eszköztár helyett</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 Quit in the menu.</source>
- <translation>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>M&amp;inimize on close</source>
<translation>K&amp;icsinyítés záráskor</translation>
</message>
@@ -980,10 +915,6 @@ Cím: %4
<translation>Felhasználófelület nye&amp;lve:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Itt beállíthatod a felhasználófelület nyelvét. Ez a beállítás a Bitcoin ujraindítása után lép érvénybe.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Mértékegység:</translation>
</message>
@@ -1012,6 +943,10 @@ Cím: %4
<translation>Beállítások törlésének jóváhagyása.</translation>
</message>
<message>
+ <source>Client restart required to activate changes.</source>
+ <translation>A változtatások aktiválásahoz újra kell indítani a klienst.</translation>
+ </message>
+ <message>
<source>The supplied proxy address is invalid.</source>
<translation>A megadott proxy cím nem érvényes.</translation>
</message>
@@ -1059,10 +994,14 @@ Cím: %4
<translation>Aktuális egyenleged</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>Nincs szinkronban.</translation>
+ <source>Spendable:</source>
+ <translation>Elkölthető:</translation>
</message>
-</context>
+ <message>
+ <source>Recent transactions</source>
+ <translation>A legutóbbi tranzakciók</translation>
+ </message>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -1076,7 +1015,11 @@ Cím: %4
</context>
<context>
<name>PeerTableModel</name>
- </context>
+ <message>
+ <source>Ping Time</source>
+ <translation>Ping idő</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -1084,8 +1027,20 @@ Cím: %4
<translation>Összeg</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>HÁLÓZAT</translation>
+ <source>%1 d</source>
+ <translation>%1 n</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation>%1 ó</translation>
+ </message>
+ <message>
+ <source>%1 m</source>
+ <translation>%1 p</translation>
+ </message>
+ <message>
+ <source>%1 s</source>
+ <translation>%1 mp</translation>
</message>
<message>
<source>N/A</source>
@@ -1134,6 +1089,10 @@ Cím: %4
<translation>Debug ablak</translation>
</message>
<message>
+ <source>General</source>
+ <translation>Általános</translation>
+ </message>
+ <message>
<source>Using OpenSSL version</source>
<translation>Használt OpenSSL verzió</translation>
</message>
@@ -1174,6 +1133,18 @@ Cím: %4
<translation>&amp;Peerek</translation>
</message>
<message>
+ <source>Version</source>
+ <translation>Verzió</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Szolgáltatások</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Ping idő</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Utolsó blokk ideje</translation>
</message>
@@ -1214,10 +1185,6 @@ Cím: %4
<translation>Konzol törlése</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Üdv a Bitcoin RPC konzoljában!</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Navigálhat a fel és le nyilakkal, és &lt;b&gt;Ctrl-L&lt;/b&gt; -vel törölheti a képernyőt.</translation>
</message>
@@ -1450,10 +1417,6 @@ Cím: %4
<translation>vagy</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>A címzett címe érvénytelen, kérlek, ellenőrizd.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>A fizetendő összegnek nagyobbnak kell lennie 0-nál.</translation>
</message>
@@ -1466,10 +1429,6 @@ Cím: %4
<translation>A küldeni kívánt összeg és a %1 tranzakciós díj együtt meghaladja az egyenlegeden rendelkezésedre álló összeget.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Többször szerepel ugyanaz a cím. Egy küldési műveletben egy címre csak egyszer lehet küldeni.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(nincs címke)</translation>
</message>
@@ -1536,10 +1495,6 @@ Cím: %4
<translation>Üzenet aláírása...</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Aláírhat a címeivel üzeneteket, amivel bizonyíthatja, hogy a címek az önéi. Vigyázzon, hogy ne írjon alá semmi félreérthetőt, mivel a phising 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>
- </message>
- <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1580,10 +1535,6 @@ Cím: %4
<translation>Üzenet ellenőrzése</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Írja be az aláírás címét, az üzenetet (ügyelve arra, hogy az új-sor, szóköz, tab, stb. karaktereket is pontosan) és az aláírást az üzenet ellenőrzéséhez. Ügyeljen arra, ne gondoljon többet az aláírásról, mint amennyi az aláírt szövegben ténylegesen áll, hogy elkerülje a köztes-ember (man-in-the-middle) támadást.</translation>
- </message>
- <message>
<source>The entered address is invalid.</source>
<translation>A megadott cím nem érvényes.</translation>
</message>
@@ -1628,7 +1579,7 @@ Cím: %4
</message>
<message>
<source>The Bitcoin Core developers</source>
- <translation>A Bitcoin fejlesztői</translation>
+ <translation>A Bitcoin Core fejlesztői</translation>
</message>
<message>
<source>[testnet]</source>
@@ -1646,7 +1597,7 @@ Cím: %4
<name>TransactionDesc</name>
<message>
<source>Open until %1</source>
- <translation>Megnyitva %1-ig</translation>
+ <translation>%1-ig megnyitva</translation>
</message>
<message>
<source>%1/unconfirmed</source>
@@ -1692,10 +1643,6 @@ Cím: %4
<source>Credit</source>
<translation>Jóváírás</translation>
</message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>beérik %n blokk múlva</numerusform><numerusform>beérik %n blokk múlva</numerusform></translation>
- </message>
<message>
<source>not accepted</source>
<translation>elutasítva</translation>
@@ -1752,10 +1699,6 @@ Cím: %4
<source>, has not been successfully broadcast yet</source>
<translation>, még nem sikerült elküldeni.</translation>
</message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>%n további blokkra megnyitva</numerusform><numerusform>%n további blokkra megnyitva</numerusform></translation>
- </message>
<message>
<source>unknown</source>
<translation>ismeretlen</translation>
@@ -1783,14 +1726,6 @@ Cím: %4
<translation>Típus</translation>
</message>
<message>
- <source>Address</source>
- <translation>Cím</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>%n további blokkra megnyitva</numerusform><numerusform>%n további blokkra megnyitva</numerusform></translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>%1-ig megnyitva</translation>
</message>
@@ -1811,6 +1746,10 @@ Cím: %4
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Címke</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Erre a címre</translation>
</message>
@@ -1847,10 +1786,6 @@ Cím: %4
<translation>Tranzakció típusa.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>A tranzakció címzettjének címe.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Az egyenleghez jóváírt vagy ráterhelt összeg.</translation>
</message>
@@ -1995,7 +1930,7 @@ Cím: %4
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation>&amp;Exportálás...</translation>
+ <translation>&amp;Exportálás</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -2058,10 +1993,6 @@ Cím: %4
<translation>Kívülről érkező kapcsolatok elfogadása (alapértelmezett: 1, ha nem használt a -proxy vagy a -connect)</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Hiba: a tranzakciót elutasították. Ezt az okozhatja, ha már elköltöttél valamennyi érmét a tárcádból például ha a wallet.dat-od egy másolatát használtad, és így az elköltés csak abban lett jelölve, de itt nem.</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Parancs, amit akkor hajt végre, amikor egy tárca-tranzakció megváltozik (%s a parancsban lecserélődik a blokk TxID-re)</translation>
</message>
@@ -2078,10 +2009,6 @@ Cím: %4
<translation>Sérült blokk-adatbázis észlelve</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Saját IP-cím felfedezése (alapértelmezett: 1, amikor figyel és nem használt a -externalip)</translation>
- </message>
- <message>
<source>Do you want to rebuild the block database now?</source>
<translation>Újra akarod építeni a blokk adatbázist most?</translation>
</message>
@@ -2122,10 +2049,6 @@ Cím: %4
<translation>Nincs elég fájlleíró. </translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Blokklánc index újraalkotása az alábbi blk000??.dat fájlokból</translation>
- </message>
- <message>
<source>Verifying blocks...</source>
<translation>Blokkok ellenőrzése...</translation>
</message>
@@ -2138,6 +2061,10 @@ Cím: %4
<translation>Az adatbázist újra kell építeni -reindex használatával (módosítás -tindex).</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Adatkönyvtár kiválasztása induláskor (alapbeállítás: 0)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Információ</translation>
</message>
@@ -2154,10 +2081,27 @@ Cím: %4
<translation>trace/debug információ küldése a konzolra a debog.log fájl helyett</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>SLL gyökér-igazolások megadása fizetési kérelmekhez (alapértelmezett: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Nyelvbeállítás, például "de_DE" (alapértelmezett: rendszer nyelve)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Indítóképernyő mutatása induláskor (alapértelmezett: 1)</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation>Tranzakció aláírása sikertelen</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Indítás lekicsinyítve
+</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Ez egy kísérleti szoftver.</translation>
</message>
@@ -2251,10 +2195,6 @@ Cím: %4
<translation>Étvénytelen -paytxfee=&lt;összeg&gt; összeg: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Étvénytelen összeg</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nincs elég bitcoinod.</translation>
</message>
@@ -2287,10 +2227,6 @@ Cím: %4
<translation>Betöltés befejezve.</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Használd a %s opciót</translation>
- </message>
- <message>
<source>Error</source>
<translation>Hiba</translation>
</message>
diff --git a/src/qt/locale/bitcoin_id_ID.ts b/src/qt/locale/bitcoin_id_ID.ts
index ea2750ed08..dec30dafb3 100644
--- a/src/qt/locale/bitcoin_id_ID.ts
+++ b/src/qt/locale/bitcoin_id_ID.ts
@@ -1,11 +1,7 @@
-<TS language="id_ID" version="2.0">
+<TS language="id_ID" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Klik-ganda untuk mengubah alamat atau label</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Buat alamat baru</translation>
</message>
@@ -152,10 +148,6 @@
<translation>Ubah kata kunci</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Masukkan kata kunci lama dan baru ke dompet ini.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Konfirmasi enkripsi dompet</translation>
</message>
@@ -176,10 +168,6 @@
<translation>Dompet terenkripsi</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin akan menutup untuk menyelesaikan proses enkripsi. Ingat bahwa dengan mengenkripsi dompet Anda tidak sepenuhnya melindungi bitcoin Anda dari perangkat lunak berbahaya yang menginfeksi komputer Anda.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Enkripsi dompet gagal</translation>
</message>
@@ -295,10 +283,6 @@
<translation>Kirim koin ke alamat Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Ubah pilihan konfigurasi untuk Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Cadangkan dompet ke lokasi lain</translation>
</message>
@@ -475,18 +459,6 @@
<translation>Transaksi diterima</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Tanggal: %1
-Nilai: %2
-Jenis: %3
-Alamat: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Dompet saat ini &lt;b&gt;terenkripsi&lt;/b&gt; dan &lt;b&gt;terbuka&lt;/b&gt;</translation>
</message>
@@ -665,10 +637,6 @@ Alamat: %4
<translation>tidak</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Label ini akan berubah merah, jika ukuran transaksi lebih besar dari 1000 byte.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Berarti perlu biaya lebih dari %1 untuk setiap kB.</translation>
</message>
@@ -681,14 +649,6 @@ Alamat: %4
<translation>Makin penting transaksinya, makin kemungkinan akan termasuk dalam blok.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Label ini akan berubah merah, jika prioritas lebih kecil dari "medium".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Label ini akan berubah merah, jika setiap penerima menerima nilai lebih kecil dari %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(tidak ada label)</translation>
</message>
@@ -801,23 +761,7 @@ Alamat: %4
<source>command-line options</source>
<translation>pilihan perintah-baris</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>pilihan UI</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Atur bahasa, sebagai contoh "id_ID" (standar: system locale)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Memulai terminimalisi</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Tampilkan layar pembuka saat nyala (standar: 1)</translation>
- </message>
- </context>
+</context>
<context>
<name>Intro</name>
<message>
@@ -883,14 +827,6 @@ Alamat: %4
<translation>&amp;Utama</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Menyalakan Bitcoin secara otomatis setelah masuk ke dalam sistem.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Menyalakan Bitcoin pada login sistem</translation>
- </message>
- <message>
<source>MB</source>
<translation>MB</translation>
</message>
@@ -971,10 +907,6 @@ Alamat: %4
<translation>&amp;Meminilisasi ke tray daripada taskbar</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 Quit in the menu.</source>
- <translation>Meminimalkan tanpa keluar dari aplikasi saat jendela ditutup. Apabila pilihan ini diaktifkan, aplikasi hanya bisa ditutup dengan memilih Keluar di menu Berkas.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;eminilisasi saat tutup</translation>
</message>
@@ -987,10 +919,6 @@ Alamat: %4
<translation>&amp;Bahasa Antarmuka Pengguna:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Tampilan bahasa pengguna dapat diatur disini. Pengaturan ini akan berpengaruh setelah memulai kembali aplikasi Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unit untuk menunjukkan nilai:</translation>
</message>
@@ -1027,10 +955,6 @@ Alamat: %4
<translation>Restart klien diperlukan untuk mengaktifkan perubahan.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Klien akan dimatikan, apakah anda hendak melanjutkan?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Perubahan ini akan memerlukan restart klien</translation>
</message>
@@ -1081,11 +1005,7 @@ Alamat: %4
<source>Your current total balance</source>
<translation>Jumlah saldo Anda sekarang</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>tidak tersinkron</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -1261,18 +1181,10 @@ Alamat: %4
<translation>Berkas catatan debug</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Buka berkas catatan debug Bitcoin dari direktori data sekarang. Hal ini dapat memakan waktu beberapa detik untuk berkas catatan yang besar.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Bersihkan konsol</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Selamat datang ke konsol RPC Bitcoin.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Gunakan panah keatas dan kebawah untuk menampilkan sejarah, dan &lt;b&gt;Ctrl-L&lt;/b&gt; untuk bersihkan layar.</translation>
</message>
@@ -1585,10 +1497,6 @@ Alamat: %4
<translation>atau</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Alamat penerima tidak sah, silakan periksa sekali lagi.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Nilai yang dibayar harus lebih besar dari 0.</translation>
</message>
@@ -1601,10 +1509,6 @@ Alamat: %4
<translation>Jumlah melebihi saldo Anda ketika biaya transaksi %1 ditambahkan.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Ditemukan alamat ganda, hanya dapat mengirim ke tiap alamat sekali per operasi pengiriman.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Gagal membuat transaksi!</translation>
</message>
@@ -1676,18 +1580,10 @@ Alamat: %4
<translation>Pesan:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Permintaan pembayaran terverifikasi.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Masukkan label untuk alamat ini untuk dimasukan dalam daftar alamat yang pernah digunakan</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Permintaan pembayaran tidak terverifikasi.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Kirim Ke:</translation>
</message>
@@ -2001,10 +1897,6 @@ Alamat: %4
<translation>Jenis</translation>
</message>
<message>
- <source>Address</source>
- <translation>Alamat</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Terlalu muda (cuma %1 konfirmasi, akan siap sesudah %2) </translation>
</message>
@@ -2033,6 +1925,10 @@ Alamat: %4
<translation>Tidak terhubung</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Label</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Belum dikonfirmasi</translation>
</message>
@@ -2081,10 +1977,6 @@ Alamat: %4
<translation>Jenis transaksi.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Alamat tujuan dari transaksi.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Nilai dihapus dari atau ditambahkan ke saldo.</translation>
</message>
@@ -2307,10 +2199,6 @@ Alamat: %4
<translation>Terima hubungan dari luar (standar: 1 kalau -proxy atau -connect tidak dipilih)</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Gagal: Transaksi ditolak. Ini mungkin terjadi jika beberapa dari koin dalam dompet Anda telah digunakan, seperti ketika Anda menggunakan salinan wallet.dat dan beberapa koin telah dibelanjakan dalam salinan tersebut tetapi disini tidak tertandai sebagai terpakai.</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Jalankan perintah ketika perubahan transaksi dompet (%s di cmd digantikan oleh TxID)</translation>
</message>
@@ -2359,10 +2247,6 @@ Alamat: %4
<translation>Menemukan database blok yang rusak </translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Cari alamat IP Anda sendiri (biasanya: 1 saat mendengarkan dan -externalip tidak terpilih)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Jangan memuat dompet dan menonaktifkan panggilan dompet RPC</translation>
</message>
@@ -2391,10 +2275,6 @@ Alamat: %4
<translation>Gagal: Hard disk hampir terisi!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Gagal: Dompet terkunci, transaksi tidak bisa dibuat!</translation>
- </message>
- <message>
<source>Importing...</source>
<translation>mengimpor...</translation>
</message>
@@ -2467,6 +2347,14 @@ Alamat: %4
<translation>Kirim info jejak/debug ke konsol bukan berkas debug.log</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Atur bahasa, sebagai contoh "id_ID" (standar: system locale)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Tampilkan layar pembuka saat nyala (standar: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Mengecilkan berkas debug.log saat klien berjalan (Standar: 1 jika tidak -debug)</translation>
</message>
@@ -2475,6 +2363,10 @@ Alamat: %4
<translation>Tandatangani transaksi tergagal</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Memulai terminimalisi</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Nilai transaksi terlalu kecil</translation>
</message>
@@ -2495,10 +2387,6 @@ Alamat: %4
<translation>Peringatan</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Perhatian: Versi ini sudah lama, perlu ditingkatkan!</translation>
- </message>
- <message>
<source>Zapping all transactions from wallet...</source>
<translation>Setiap transaksi dalam dompet sedang di-'Zap'...</translation>
</message>
@@ -2567,10 +2455,6 @@ Alamat: %4
<translation>Nilai salah untuk -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Nilai salah</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Saldo tidak mencukupi</translation>
</message>
@@ -2603,10 +2487,6 @@ Alamat: %4
<translation>Memuat selesai</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Gunakan pilihan %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Gagal</translation>
</message>
diff --git a/src/qt/locale/bitcoin_it.ts b/src/qt/locale/bitcoin_it.ts
index 06cf0e0162..c81f458e39 100644
--- a/src/qt/locale/bitcoin_it.ts
+++ b/src/qt/locale/bitcoin_it.ts
@@ -1,9 +1,9 @@
-<TS language="it" version="2.0">
+<TS language="it" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Doppio click per modificare l'indirizzo o l'etichetta</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Fare clic con il tasto destro del mouse per modificare l'indirizzo o l'etichetta</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>Copia l'indirizzo attualmente selezionato negli appunti</translation>
+ <translation>Copia negli appunti l'indirizzo attualmente selezionato</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -31,11 +31,11 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation>Cancella l'indirizzo attualmente selezionato dalla lista</translation>
+ <translation>Rimuove dalla lista l'indirizzo attualmente selezionato</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation>Esporta i dati nella tabella corrente in un file</translation>
+ <translation>Esporta su file i dati contenuti nella tabella corrente</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -43,7 +43,7 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation>&amp;Cancella</translation>
+ <translation>&amp;Elimina</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
@@ -67,11 +67,11 @@
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Questo è un elenco di indirizzi bitcoin a cui puoi inviare pagamenti. Controlla sempre l'importo e l'indirizzo del beneficiario prima di inviare bitcoin.</translation>
+ <translation>Questo è un elenco di indirizzi Bitcoin a cui puoi inviare pagamenti. Controlla sempre l'importo e l'indirizzo del beneficiario prima di inviare bitcoin.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
- <translation>Questi sono i tuoi indirizzi bitcoin che puoi usare per ricevere pagamenti. Si raccomanda di generare un nuovo indirizzo per ogni transazione.</translation>
+ <translation>Questi sono i tuoi indirizzi Bitcoin che puoi usare per ricevere pagamenti. Si raccomanda di generare un nuovo indirizzo per ogni transazione.</translation>
</message>
<message>
<source>Copy &amp;Label</source>
@@ -95,7 +95,7 @@
</message>
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Si è verificato un errore tentando di salvare la lista degli indirizzi. %1. Riprova</translation>
+ <translation>Si è verificato un errore tentando di salvare la lista degli indirizzi su %1. Si prega di riprovare.</translation>
</message>
</context>
<context>
@@ -117,19 +117,19 @@
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation>Finestra parola d'ordine</translation>
+ <translation>Finestra passphrase</translation>
</message>
<message>
<source>Enter passphrase</source>
- <translation>Inserisci la parola d'ordine</translation>
+ <translation>Inserisci la passphrase</translation>
</message>
<message>
<source>New passphrase</source>
- <translation>Nuova parola d'ordine</translation>
+ <translation>Nuova passphrase</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation>Ripeti la nuova parola d'ordine</translation>
+ <translation>Ripeti la nuova passphrase</translation>
</message>
<message>
<source>Encrypt wallet</source>
@@ -137,7 +137,7 @@
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Quest'operazione necessita della passphrase per sbloccare il portamonete.</translation>
+ <translation>Questa operazione necessita della passphrase per sbloccare il portamonete.</translation>
</message>
<message>
<source>Unlock wallet</source>
@@ -156,22 +156,22 @@
<translation>Cambia la passphrase</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Inserisci la vecchia e la nuova passphrase per il portamonete.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Conferma la cifratura del portamonete</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>Attenzione: se si cifra il portamonete e si perde la passphrase &lt;b&gt;TUTTI I PROPRI BITCOIN ANDRANNO PERSI&lt;/b&gt;!</translation>
+ <translation>Attenzione: perdendo la passphrase di un portamonete cifrato &lt;b&gt;TUTTI I PROPRI BITCOIN ANDRANNO PERSI&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
<translation>Si è sicuri di voler cifrare il portamonete?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Bitcoin Core si chiuderà per portare a termine il processo di cifratura. Si ricorda che la cifratura del portamonete non garantisce protezione totale contro i furti causati da infezioni malware.</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>IMPORTANTE: qualsiasi backup del file portamonete effettuato in precedenza dovrà essere sostituito con il file del portamonete cifrato appena generato. Per ragioni di sicurezza, i precedenti backup del file del portamonete non cifrato diventeranno inservibili non appena si inizierà ad utilizzare il nuovo portamonete cifrato.</translation>
</message>
@@ -185,11 +185,11 @@
</message>
<message>
<source>Enter the new passphrase to 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>Inserisci una nuona password per il postafoglio.&lt;br/&gt;Perfavore usa una password di&lt;b&gt;dieci o più caratteri&lt;/b&gt;, o &lt;b&gt;otto o più parole&lt;/b&gt;.</translation>
+ <translation>Inserisci la nuova passphrase per il portamonete.&lt;br/&gt;Si consiglia di utilizzare &lt;b&gt;almeno dieci caratteri casuali&lt;/b&gt; oppure &lt;b&gt;otto o più parole&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin si chiuderà per portare a termine il processo di cifratura. Ricorda che cifrare il tuo portamonete non può fornire una protezione totale contro i furti causati da infezioni malware.</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Inserisci la vecchia e la nuova passphrase per il portamonete.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -224,7 +224,7 @@
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
- <translation>Firma il &amp;messaggio...</translation>
+ <translation>Firma &amp;messaggio...</translation>
</message>
<message>
<source>Synchronizing with network...</source>
@@ -264,7 +264,7 @@
</message>
<message>
<source>Show information about Qt</source>
- <translation>Mostra informazioni su Qt</translation>
+ <translation>Mostra le informazioni su Qt</translation>
</message>
<message>
<source>&amp;Options...</source>
@@ -276,11 +276,11 @@
</message>
<message>
<source>&amp;Backup Wallet...</source>
- <translation>&amp;Backup Portamonete...</translation>
+ <translation>&amp;Backup portamonete...</translation>
</message>
<message>
<source>&amp;Change Passphrase...</source>
- <translation>&amp;Cambia la passphrase...</translation>
+ <translation>&amp;Cambia passphrase...</translation>
</message>
<message>
<source>&amp;Sending addresses...</source>
@@ -308,11 +308,7 @@
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation>Invia monete ad un indirizzo bitcoin</translation>
- </message>
- <message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modifica opzioni di configurazione per bitcoin</translation>
+ <translation>Invia fondi ad un indirizzo Bitcoin</translation>
</message>
<message>
<source>Backup wallet to another location</source>
@@ -324,7 +320,7 @@
</message>
<message>
<source>&amp;Debug window</source>
- <translation>Finestra &amp;Debug</translation>
+ <translation>Finestra di &amp;debug</translation>
</message>
<message>
<source>Open debugging and diagnostic console</source>
@@ -352,7 +348,7 @@
</message>
<message>
<source>Show information about Bitcoin Core</source>
- <translation>Mostra le informazioni riguardo a Bitcoin core</translation>
+ <translation>Mostra le informazioni su Bitcoin Core</translation>
</message>
<message>
<source>&amp;Show / Hide</source>
@@ -368,11 +364,11 @@
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation>Firma i messaggi con il tuo indirizzo bitcoin per dimostrarne il possesso</translation>
+ <translation>Firma messaggi con i tuoi indirizzi Bitcoin per dimostrarne il possesso</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation>Verifica i messaggi per accertare che siano stati firmati con gli indirizzi bitcoin specificati</translation>
+ <translation>Verifica che i messaggi siano stati firmati con gli indirizzi Bitcoin specificati</translation>
</message>
<message>
<source>&amp;File</source>
@@ -388,7 +384,7 @@
</message>
<message>
<source>Tabs toolbar</source>
- <translation>Barra degli strumenti "Tabs"</translation>
+ <translation>Barra degli strumenti</translation>
</message>
<message>
<source>Bitcoin Core</source>
@@ -400,7 +396,11 @@
</message>
<message>
<source>&amp;About Bitcoin Core</source>
- <translation>Info su Bitcoin Core</translation>
+ <translation>&amp;Informazioni su Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Modifica opzioni di configurazione per Bitcoin Core</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -412,23 +412,27 @@
</message>
<message>
<source>Open a bitcoin: URI or payment request</source>
- <translation>Apri un URI o una richiesta di pagamento</translation>
+ <translation>Apri un bitcoin: URI o una richiesta di pagamento</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation>Opzioni riga di &amp;comando</translation>
+ <translation>Opzioni della riga di &amp;comando</translation>
</message>
<message>
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Mostra il messaggio di aiuto di Bitcoin Core per avere la lista di tutte le opzioni della riga di comando di Bitcoin.</translation>
+ <translation>Mostra il messaggio di aiuto di Bitcoin Core per ottenere la lista delle opzioni della riga di comando valide.</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n connessione attiva alla rete Bitcoin</numerusform><numerusform>%n connessioni attive alla rete Bitcoin</numerusform></translation>
+ <translation><numerusform>%n connessione attiva alla rete Bitcoin</numerusform><numerusform>%n connessioni alla rete Bitcoin attive</numerusform></translation>
</message>
<message>
<source>No block source available...</source>
- <translation>Nessuna fonte di blocchi disponibile</translation>
+ <translation>Nessuna fonte di blocchi disponibile...</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>Elaborato %n blocco dello storico transazioni.</numerusform><numerusform>Elaborati %n blocchi dello storico transazioni.</numerusform></translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
@@ -460,7 +464,7 @@
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation>Transazioni successive a questa non saranno ancora visibili.</translation>
+ <translation>Le transazioni effettuate successivamente non sono ancora visibili.</translation>
</message>
<message>
<source>Error</source>
@@ -478,36 +482,49 @@
<source>Up to date</source>
<translation>Aggiornato</translation>
</message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>Processati %n blocchi dello storico transazioni.</numerusform><numerusform>Processati %n blocchi dello storico delle transazioni.</numerusform></translation>
- </message>
<message>
<source>Catching up...</source>
<translation>In aggiornamento...</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>Transazione inviata</translation>
+ <source>Date: %1
+</source>
+ <translation>Data: %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>Transazione ricevuta</translation>
+ <source>Amount: %1
+</source>
+ <translation>Quantità: %1
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Type: %1
</source>
- <translation>Data: %1
-Quantità: %2
-Tipo: %3
-Indirizzo: %4
-
+ <translation>Tipo: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>Etichetta: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Indirizzo: %1
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation>Transazione inviata</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Transazione ricevuta</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Il portamonete è &lt;b&gt;cifrato&lt;/b&gt; ed attualmente &lt;b&gt;sbloccato&lt;/b&gt;</translation>
</message>
@@ -527,8 +544,7 @@ Indirizzo: %4
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
- <translation>Seleziona Moneta
-</translation>
+ <translation>Selezione Input</translation>
</message>
<message>
<source>Quantity:</source>
@@ -552,7 +568,7 @@ Indirizzo: %4
</message>
<message>
<source>Dust:</source>
- <translation>Importo</translation>
+ <translation>Trascurabile:</translation>
</message>
<message>
<source>After Fee:</source>
@@ -580,7 +596,7 @@ Indirizzo: %4
</message>
<message>
<source>Received with label</source>
- <translation>Ricevuto con etichetta</translation>
+ <translation>Ricevuto con l'etichetta</translation>
</message>
<message>
<source>Received with address</source>
@@ -592,7 +608,7 @@ Indirizzo: %4
</message>
<message>
<source>Confirmations</source>
- <translation>Conferme:</translation>
+ <translation>Conferme</translation>
</message>
<message>
<source>Confirmed</source>
@@ -612,7 +628,7 @@ Indirizzo: %4
</message>
<message>
<source>Copy amount</source>
- <translation>Copia l'importo</translation>
+ <translation>Copia importo</translation>
</message>
<message>
<source>Copy transaction ID</source>
@@ -648,7 +664,7 @@ Indirizzo: %4
</message>
<message>
<source>Copy dust</source>
- <translation>Copia l'importo</translation>
+ <translation>Copia trascurabile</translation>
</message>
<message>
<source>Copy change</source>
@@ -660,7 +676,7 @@ Indirizzo: %4
</message>
<message>
<source>higher</source>
- <translation>superiore</translation>
+ <translation>molto alta</translation>
</message>
<message>
<source>high</source>
@@ -684,7 +700,7 @@ Indirizzo: %4
</message>
<message>
<source>lower</source>
- <translation>minore</translation>
+ <translation>molto bassa</translation>
</message>
<message>
<source>lowest</source>
@@ -699,8 +715,20 @@ Indirizzo: %4
<translation>nessuno</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Questa etichetta diventerà rossa se la dimensione della transazione supererà i 1000 byte.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Questa etichetta diventerà rossa se la priorità sarà inferiore a "media".</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>Questa etichetta diventerà rossa se uno qualsiasi dei destinatari riceverà un importo inferiore a %1.</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
- <translation>Può variare +/- %1 satoshi(s) per input.</translation>
+ <translation>Può variare di +/- %1 satoshi per input.</translation>
</message>
<message>
<source>yes</source>
@@ -711,12 +739,8 @@ Indirizzo: %4
<translation>no</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Questa etichetta diventa rossa se la dimensione della transazione supera i 1000 bytes</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
- <translation>Questo significa che è richiesta una commissione di almeno %1 per ogni kB.</translation>
+ <translation>In tal caso sarà necessaria una commissione di almeno %1 per ogni kB.</translation>
</message>
<message>
<source>Can vary +/- 1 byte per input.</source>
@@ -727,14 +751,6 @@ Indirizzo: %4
<translation>Le transazioni con priorità più alta hanno più probabilità di essere incluse in un blocco.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Questa etichetta diventa rossa se la priorità è inferiore a "media".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Questa etichetta diventa rossa se uno qualsiasi dei destinatari riceve un ammontare inferiore di %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(nessuna etichetta)</translation>
</message>
@@ -763,7 +779,7 @@ Indirizzo: %4
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation>L'indirizzo associato a questa voce della rubrica. Può essere modificato solo per gli indirizzi d'invio.</translation>
+ <translation>L'indirizzo associato con questa voce della lista degli indirizzi. Può essere modificato solo per gli indirizzi d'invio.</translation>
</message>
<message>
<source>&amp;Address</source>
@@ -787,11 +803,11 @@ Indirizzo: %4
</message>
<message>
<source>The entered address "%1" is already in the address book.</source>
- <translation>L'indirizzo inserito "%1" è già in rubrica.</translation>
+ <translation>L'indirizzo "%1" è già presente in rubrica.</translation>
</message>
<message>
<source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation>L'indirizzo inserito "%1" non è un indirizzo bitcoin valido.</translation>
+ <translation>L'indirizzo "%1" non è un indirizzo bitcoin valido.</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -810,11 +826,11 @@ Indirizzo: %4
</message>
<message>
<source>name</source>
- <translation>Nome</translation>
+ <translation>nome</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <translation>La cartella esiste già. Aggiungi %1 se intendi creare qui una nuova cartella.</translation>
+ <translation>Cartella già esistente. Aggiungi %1 se intendi creare qui una nuova cartella.</translation>
</message>
<message>
<source>Path already exists, and is not a directory.</source>
@@ -822,7 +838,7 @@ Indirizzo: %4
</message>
<message>
<source>Cannot create data directory here.</source>
- <translation>Qui non è possibile creare una cartella dati.</translation>
+ <translation>Impossibile creare una cartella dati qui.</translation>
</message>
</context>
<context>
@@ -841,11 +857,11 @@ Indirizzo: %4
</message>
<message>
<source>About Bitcoin Core</source>
- <translation>Info su Bitcoin Core</translation>
+ <translation>Informazioni su Bitcoin Core</translation>
</message>
<message>
<source>Command-line options</source>
- <translation>opzioni riga di comando</translation>
+ <translation>Opzioni della riga di comando</translation>
</message>
<message>
<source>Usage:</source>
@@ -853,31 +869,7 @@ Indirizzo: %4
</message>
<message>
<source>command-line options</source>
- <translation>opzioni riga di comando</translation>
- </message>
- <message>
- <source>UI options</source>
- <translation>UI opzioni</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Imposta lingua, ad esempio "it_IT" (predefinita: lingua di sistema)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Avvia ridotto a icona</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Imposta i certificati radice SSL per le richieste di pagamento (predefinito: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Mostra finestra di presentazione all'avvio (predefinito: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Scegli una cartella dati all'avvio (predefinito: 0)</translation>
+ <translation>opzioni della riga di comando</translation>
</message>
</context>
<context>
@@ -896,7 +888,7 @@ Indirizzo: %4
</message>
<message>
<source>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source>
- <translation>Bitcoin Core scaricherà e salverà una copia del block chain di Bitcoin. Almeno %1GB di dati che andranno ad aumentare col tempo saranno salvati in questa cartella. Anche il portamonete sarà salvato in questa cartella.</translation>
+ <translation>Bitcoin Core scaricherà e salverà una copia della block chain di Bitcoin. Il portamonete ed almeno %1GB di dati saranno salvati in questa cartella. Si ricorda che lo spazio occupato andrà ad aumentare nel tempo.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -953,14 +945,6 @@ Indirizzo: %4
<translation>&amp;Principale</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Avvia automaticamente Bitcoin una volta effettuato l'accesso al sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Avvia Bitcoin all'accesso al sistema</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Dimensione della cache del &amp;database.</translation>
</message>
@@ -974,20 +958,28 @@ Indirizzo: %4
</message>
<message>
<source>Accept connections from outside</source>
- <translation>Accetta connessioni da fuori</translation>
+ <translation>Accetta connessioni provenienti dall'esterno</translation>
</message>
<message>
<source>Allow incoming connections</source>
- <translation>Permetti connessioni in entrata</translation>
+ <translation>Permetti connessioni in ingresso</translation>
</message>
<message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
- <translation>Indirizzo IP del proxy (es: IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ <translation>Indirizzo IP del proxy (ad es. IPv4: 127.0.0.1 / IPv6: ::1)</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>Riduci ad icona invece di uscire dall'applicazione quando la finestra viene chiusa. Attivando questa opzione l'applicazione terminerà solo dopo aver selezionato Esci dal menu File.</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>La lingua dell'interfaccia utente può essere impostata qui. L'applicazione delle modifiche avrà effetto dopo il riavvio di Bitcoin Core.</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>URL di terze parti (es: un block explorer) che appaiono nella tabella delle transazioni come voci nel menu contestuale. %s nell'URL è sostituito dall'hash della transazione.
-Più URL vengono separati da una barra verticale |.</translation>
+ <translation>URL di terze parti (ad es. un block explorer) che appaiono nella tabella delle transazioni come voci nel menu contestuale. "%s" nell'URL è sostituito dall'hash della transazione.
+Per specificare più URL separarli con una barra verticale "|".</translation>
</message>
<message>
<source>Third party transaction URLs</source>
@@ -995,7 +987,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Active command-line options that override above options:</source>
- <translation>Opzioni command-line attive che sostituiscono i settaggi sopra elencati:</translation>
+ <translation>Opzioni della riga di comando attive che sostituiscono i settaggi sopra elencati:</translation>
</message>
<message>
<source>Reset all client options to default.</source>
@@ -1010,6 +1002,14 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>Rete</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>Avvia automaticamente Bitcoin Core una volta effettuato l'accesso al sistema.</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>&amp;Avvia Bitcoin Core all'accesso al sistema</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = automatico, &lt;0 = lascia questo numero di core liberi)</translation>
</message>
@@ -1027,11 +1027,11 @@ Più URL vengono separati da una barra verticale |.</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>Disabilitando l'uso di resti non confermati, il resto di una transazione non potrà essere speso fino a quando la transazione non avrà ottenuto almeno una conferma. Questa impostazione influisce inoltre sul calcolo saldo.</translation>
+ <translation>Disabilitando l'uso di resti non confermati, il resto di una transazione non potrà essere speso fino a quando non avrà ottenuto almeno una conferma. Questa impostazione influisce inoltre sul calcolo del saldo.</translation>
</message>
<message>
<source>&amp;Spend unconfirmed change</source>
- <translation>&amp;Spendere resti non confermati</translation>
+ <translation>&amp;Spendi resti non confermati</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>
@@ -1059,7 +1059,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Port of the proxy (e.g. 9050)</source>
- <translation>Porta del proxy (es. 9050)</translation>
+ <translation>Porta del proxy (ad es. 9050)</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -1074,10 +1074,6 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>&amp;Minimizza nella tray bar invece che sulla barra delle applicazioni</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 Quit in the menu.</source>
- <translation>Riduci ad icona invece di uscire dall'applicazione quando la finestra viene chiusa. Se l'opzione è attiva, l'applicazione terminerà solo dopo aver selezionato Esci dal menu File.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimizza alla chiusura</translation>
</message>
@@ -1090,16 +1086,12 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>&amp;Lingua Interfaccia Utente:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>La lingua dell'interfaccia utente può essere impostata qui. L'impostazione avrà effetto dopo il riavvio di Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unità di misura con cui visualizzare gli importi:</translation>
</message>
<message>
<source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
- <translation>Scegli l'unità di suddivisione predefinita da utilizzare per l'interfaccia e per l'invio di monete.</translation>
+ <translation>Scegli l'unità di suddivisione predefinita da utilizzare per l'interfaccia e per l'invio di bitcoin.</translation>
</message>
<message>
<source>Whether to show coin control features or not.</source>
@@ -1127,19 +1119,19 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Client restart required to activate changes.</source>
- <translation>È necessario un riavvio del client per rendere attivi i cambiamenti.</translation>
+ <translation>È necessario un riavvio del client per applicare le modifiche.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Il client sarà arrestato, vuoi procedere?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>Il client sarà arrestato. Si desidera procedere?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
- <translation>Questo cambiamento richiede un riavvio del client.</translation>
+ <translation>Questa modifica richiede un riavvio del client.</translation>
</message>
<message>
<source>The supplied proxy address is invalid.</source>
- <translation>L'indirizzo proxy che hai fornito è invalido.</translation>
+ <translation>L'indirizzo proxy che hai fornito non è valido.</translation>
</message>
</context>
<context>
@@ -1154,7 +1146,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Watch-only:</source>
- <translation>Guarda solo</translation>
+ <translation>Sola lettura:</translation>
</message>
<message>
<source>Available:</source>
@@ -1162,7 +1154,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Your current spendable balance</source>
- <translation>Saldo spendibile attuale</translation>
+ <translation>Il tuo saldo spendibile attuale</translation>
</message>
<message>
<source>Pending:</source>
@@ -1190,15 +1182,15 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Your current total balance</source>
- <translation>Saldo totale attuale</translation>
+ <translation>Il tuo saldo totale attuale</translation>
</message>
<message>
<source>Your current balance in watch-only addresses</source>
- <translation>Il tuo saldo attuale negli indirizzi watch-only</translation>
+ <translation>Il tuo saldo attuale negli indirizzi di sola lettura</translation>
</message>
<message>
<source>Spendable:</source>
- <translation>Saldo Spendibile:</translation>
+ <translation>Spendibile:</translation>
</message>
<message>
<source>Recent transactions</source>
@@ -1210,15 +1202,11 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Mined balance in watch-only addresses that has not yet matured</source>
- <translation>l'equilibrio estratto solo nello sguardo degli indirizzi non è ancora maturo </translation>
+ <translation>Importo generato dal mining su indirizzi di sola lettura e non ancora maturato</translation>
</message>
<message>
<source>Current total balance in watch-only addresses</source>
- <translation>Saldo corrente totale negli indirizzi watch-only</translation>
- </message>
- <message>
- <source>out of sync</source>
- <translation>non sincronizzato</translation>
+ <translation>Saldo corrente totale negli indirizzi di sola lettura</translation>
</message>
</context>
<context>
@@ -1233,15 +1221,11 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Payment request rejected</source>
- <translation>Richiesta di pagamento rifiutata</translation>
+ <translation>Richiesta di pagamento respinta</translation>
</message>
<message>
<source>Payment request network doesn't match client network.</source>
- <translation>Il network della richiesta di pagamento non corrisponde al network del client.</translation>
- </message>
- <message>
- <source>Payment request has expired.</source>
- <translation>Richieda di pagamento scaduta</translation>
+ <translation>La rete della richiesta di pagamento non corrisponde alla rete del client.</translation>
</message>
<message>
<source>Payment request is not initialized.</source>
@@ -1249,7 +1233,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>L'importo di pagamento richiesto di %1 è troppo basso (considerato come trascurabile).</translation>
+ <translation>L'importo di pagamento di %1 richiesto è troppo basso (considerato come trascurabile).</translation>
</message>
<message>
<source>Payment request error</source>
@@ -1265,7 +1249,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation>Impossibile interpretare l'URI! Ciò può essere causato da un indirizzo Bitcoin invalido o da parametri URI non corretti.</translation>
+ <translation>Impossibile interpretare l'URI! I parametri URI o l'indirizzo Bitcoin potrebbero non essere corretti.</translation>
</message>
<message>
<source>Payment request file handling</source>
@@ -1273,23 +1257,39 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
- <translation>Il file di richiesta del pagamento non può essere letto o elaborato! Questo può essere causato da una richiesta di pagamento non valida.</translation>
+ <translation>Impossibile leggere il file della richiesta di pagamento! Il file della richiesta di pagamento potrebbe non essere valido.</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>Richiesta di pagamento scaduta.</translation>
</message>
<message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>Le richieste di pagamento non verificate verso script di pagamento personalizzati non sono supportate.</translation>
</message>
<message>
+ <source>Invalid payment request.</source>
+ <translation>Richiesta di pagamento non valida.</translation>
+ </message>
+ <message>
<source>Refund from %1</source>
<translation>Rimborso da %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>La richiesta di pagamento %1 (%2 byte) supera la dimensione massima di %3 byte.</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Protezione DoS per la richiesta di pagamento</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Errore di comunicazione con %1: %2</translation>
</message>
<message>
<source>Payment request cannot be parsed!</source>
- <translation>La richiesta di pagamento non può essere analizzata.</translation>
+ <translation>La richiesta di pagamento non può essere analizzata!</translation>
</message>
<message>
<source>Bad response from server %1</source>
@@ -1311,8 +1311,8 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>User Agent</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Indirizzo/Hostname</translation>
+ <source>Node/Service</source>
+ <translation>Nodo/Servizio</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1327,7 +1327,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
- <translation>Inserisci un indirizzo Bitcoin (e.g. %1)</translation>
+ <translation>Inserisci un indirizzo Bitcoin (ad es. %1)</translation>
</message>
<message>
<source>%1 d</source>
@@ -1346,14 +1346,6 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>RETE</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>SCONOSCIUTO</translation>
- </message>
- <message>
<source>None</source>
<translation>Nessuno</translation>
</message>
@@ -1370,7 +1362,7 @@ Più URL vengono separati da una barra verticale |.</translation>
<name>QRImageWidget</name>
<message>
<source>&amp;Save Image...</source>
- <translation>&amp;Salva Immagine</translation>
+ <translation>&amp;Salva Immagine...</translation>
</message>
<message>
<source>&amp;Copy Image</source>
@@ -1421,7 +1413,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Startup time</source>
- <translation>Tempo di avvio</translation>
+ <translation>Ora di avvio</translation>
</message>
<message>
<source>Network</source>
@@ -1444,6 +1436,10 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>Numero attuale di blocchi</translation>
</message>
<message>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Apre il file log di debug di Bitcoin Core dalla cartella dati attuale. Questa azione può richiedere alcuni secondi per file log di grandi dimensioni.</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Ricevuto</translation>
</message>
@@ -1453,7 +1449,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>&amp;Peers</source>
- <translation>&amp;Peers</translation>
+ <translation>&amp;Peer</translation>
</message>
<message>
<source>Select a peer to view detailed information.</source>
@@ -1477,41 +1473,45 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Starting Height</source>
- <translation>Blocco di partenza</translation>
+ <translation>Nr. Blocco Iniziale</translation>
</message>
<message>
<source>Sync Height</source>
- <translation>valore di sincronizzazione</translation>
+ <translation>Nr. Blocco Sincronizzato</translation>
</message>
<message>
<source>Ban Score</source>
- <translation>divieto di segnalazione </translation>
+ <translation>Punteggio di Ban</translation>
</message>
<message>
<source>Connection Time</source>
- <translation>Tempo di connessione</translation>
+ <translation>Tempo di Connessione</translation>
</message>
<message>
<source>Last Send</source>
- <translation>Ultimo invio</translation>
+ <translation>Ultimo Invio</translation>
</message>
<message>
<source>Last Receive</source>
- <translation>Ultima ricevuta</translation>
+ <translation>Ultima Ricezione</translation>
</message>
<message>
<source>Bytes Sent</source>
- <translation>Bytes Inviati</translation>
+ <translation>Byte Inviati</translation>
</message>
<message>
<source>Bytes Received</source>
- <translation>Bytes Ricevuti</translation>
+ <translation>Byte Ricevuti</translation>
</message>
<message>
<source>Ping Time</source>
<translation>Tempo di Ping</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation>Scarto Temporale</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Ora del blocco più recente</translation>
</message>
@@ -1552,24 +1552,20 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>File log del Debug</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Apri il file di log del debug di Bitcoin dalla cartella attuale. Può richiedere alcuni secondi per file di log grandi.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Cancella console</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Benvenuto nella console RPC di Bitcoin</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Benvenuto nella console RPC di Bitcoin Core.</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
- <translation>Usa le frecce direzionali per navigare la cronologia, e &lt;b&gt;Ctrl-L&lt;/b&gt; per cancellarla.</translation>
+ <translation>Usa le frecce direzionali per scorrere la cronologia, e &lt;b&gt;Ctrl-L&lt;/b&gt; per cancellarla.</translation>
</message>
<message>
<source>Type &lt;b&gt;help&lt;/b&gt; for an overview of available commands.</source>
- <translation>Scrivi &lt;b&gt;help&lt;/b&gt; per un riassunto dei comandi disponibili</translation>
+ <translation>Scrivi &lt;b&gt;help&lt;/b&gt; per un riassunto dei comandi disponibili.</translation>
</message>
<message>
<source>%1 B</source>
@@ -1609,7 +1605,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Fetching...</source>
- <translation>attraente</translation>
+ <translation>Recuperando...</translation>
</message>
</context>
<context>
@@ -1620,7 +1616,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>&amp;Label:</source>
- <translation>&amp;Etichetta</translation>
+ <translation>&amp;Etichetta:</translation>
</message>
<message>
<source>&amp;Message:</source>
@@ -1628,7 +1624,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</source>
- <translation>Riutilizza uno degli indirizzi di ricezione generati in precedenza. Riutilizzare un indirizzo comporta problemi di sicurezza e privacy. Non utilizzare a meno che non si stia rigenerando una richiesta di pagamento creata in precedenza.</translation>
+ <translation>Riutilizza uno degli indirizzi di ricezione generati in precedenza. Riutilizzare un indirizzo comporta problemi di sicurezza e privacy. Non selezionare questa opzione a meno che non si stia rigenerando una richiesta di pagamento creata in precedenza.</translation>
</message>
<message>
<source>R&amp;euse an existing receiving address (not recommended)</source>
@@ -1636,11 +1632,11 @@ Più URL vengono separati da una barra verticale |.</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>Un messaggio opzionale da allegare alla richiesta di pagamento, il quale sarà mostrato all'apertura della richiesta. Nota: Il messaggio non sarà inviato con il pagamento sulla rete Bitcoin.</translation>
+ <translation>Un messaggio opzionale da allegare e mostrare all'apertura della richiesta di pagamento. Nota: Il messaggio non sarà inviato con il pagamento sulla rete Bitcoin.</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
- <translation>Un'etichetta facoltativa da associare al nuovo indirizzo di ricezione</translation>
+ <translation>Un'etichetta opzionale da associare al nuovo indirizzo di ricezione.</translation>
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
@@ -1688,7 +1684,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Copy message</source>
- <translation>Copia messaggio</translation>
+ <translation>Copia il messaggio</translation>
</message>
<message>
<source>Copy amount</source>
@@ -1711,7 +1707,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>&amp;Save Image...</source>
- <translation>&amp;Salva Immagine</translation>
+ <translation>&amp;Salva Immagine...</translation>
</message>
<message>
<source>Request payment to %1</source>
@@ -1747,7 +1743,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Error encoding URI into QR Code.</source>
- <translation>Errore nella codifica dell'URI nel codice QR</translation>
+ <translation>Errore nella codifica dell'URI nel codice QR.</translation>
</message>
</context>
<context>
@@ -1833,7 +1829,7 @@ Più URL vengono separati da una barra verticale |.</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>Se questo è abilitato e l'indirizzo per il resto è vuoto o invalido, il resto sarà inviato ad un nuovo indirizzo bitcoin generato appositamente.</translation>
+ <translation>In caso di abilitazione con indirizzo vuoto o non valido, il resto sarà inviato ad un nuovo indirizzo generato appositamente.</translation>
</message>
<message>
<source>Custom change address</source>
@@ -1841,31 +1837,51 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Transaction Fee:</source>
- <translation>Tasse di Transazione</translation>
+ <translation>Commissione di Transazione:</translation>
</message>
<message>
<source>Choose...</source>
<translation>Scegli...</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Minimizza</translation>
+ <source>collapse fee-settings</source>
+ <translation>minimizza le impostazioni di commissione</translation>
</message>
<message>
<source>per kilobyte</source>
<translation>per kilobyte</translation>
</message>
<message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>Se la commissione personalizzata è impostata su 1000 satoshi e la transazione è di soli 250 byte, allora "per kilobyte" paga solo 250 satoshi di commissione, mentre "somma almeno" paga 1000 satoshi. Per transazioni più grandi di un kilobyte, entrambe le opzioni pagano al kilobyte.</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation>Nascondi</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>somma almeno</translation>
+ </message>
+ <message>
<source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
- <translation>Pagando solo la tariffa minima è bene finché c'è meno volume di transazioni di spazio nei blocchi. Ma essere consapevoli che questo può finire in una transazione non confermando ancora una volta non vi è più richiesta per le transazioni Bitcoin di rete in grado di elaborare.</translation>
+ <translation>Non vi è alcuna controindicazione a pagare la commissione minima, a patto che il volume delle transazioni sia inferiore allo spazio disponibile nei blocchi. Occorre comunque essere consapevoli che ciò potrebbe impedire la conferma delle transazioni nel caso in cui la rete risultasse satura.</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(leggi il suggerimento)</translation>
</message>
<message>
<source>Recommended:</source>
- <translation>Raccomandati:</translation>
+ <translation>Raccomandata:</translation>
</message>
<message>
<source>Custom:</source>
- <translation>Personalizza:</translation>
+ <translation>Personalizzata:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(Commissione intelligente non ancora inizializzata. Normalmente richiede un'attesa di alcuni blocchi...)</translation>
</message>
<message>
<source>Confirmation time:</source>
@@ -1881,11 +1897,15 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Send as zero-fee transaction if possible</source>
- <translation>Invia una transazione a zero commissioni se possibile</translation>
+ <translation>Invia come transazione a zero commissioni se possibile</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(la conferma potrebbe richiedere più tempo)</translation>
</message>
<message>
<source>Send to multiple recipients at once</source>
- <translation>Invia a diversi beneficiari in una volta sola</translation>
+ <translation>Invia simultaneamente a più beneficiari</translation>
</message>
<message>
<source>Add &amp;Recipient</source>
@@ -1897,7 +1917,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Dust:</source>
- <translation>Trascurabile</translation>
+ <translation>Trascurabile:</translation>
</message>
<message>
<source>Clear &amp;All</source>
@@ -1929,7 +1949,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Copy amount</source>
- <translation>Copia l'importo</translation>
+ <translation>Copia importo</translation>
</message>
<message>
<source>Copy fee</source>
@@ -1960,32 +1980,44 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>o</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>L'indirizzo del beneficiario non è valido, si prega di ricontrollare.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
- <translation>L'importo da pagare dev'essere maggiore di 0.</translation>
+ <translation>L'importo da pagare deve essere maggiore di 0.</translation>
</message>
<message>
<source>The amount exceeds your balance.</source>
- <translation>L'importo è superiore al tuo saldo attuale</translation>
+ <translation>L'importo è superiore al tuo saldo attuale.</translation>
</message>
<message>
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
<translation>Il totale è superiore al tuo saldo attuale includendo la commissione di %1.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Rilevato un indirizzo duplicato, è possibile inviare bitcoin una sola volta agli indirizzi durante un'operazione di invio.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Creazione transazione fallita!</translation>
</message>
<message>
<source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>La transazione è stata rifiutata! Questo può accadere se alcuni bitcoin nel tuo portamonete sono già stati spesi, ad esempio se hai utilizzato una copia del file wallet.dat per spendere bitcoin e questi non sono stati considerati spesi dal portamonete corrente.</translation>
+ <translation>La transazione è stata respinta! Questo può accadere se alcuni bitcoin nel tuo portamonete sono già stati spesi, come nel caso in cui tu avessi utilizzato una copia del file wallet.dat per spendere bitcoin e questi non fossero stati considerati come spesi dal portamonete corrente.</translation>
+ </message>
+ <message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation>Una commissione maggiore di %1 è considerata irragionevolmente elevata.</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>Richiesta di pagamento scaduta.</translation>
+ </message>
+ <message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Paga solamente la commissione minima di %1</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>L'indirizzo del beneficiario non è valido. Si prega di ricontrollare.</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation>Rilevato un indirizzo duplicato Ciascun indirizzo dovrebbe essere utilizzato una sola volta.</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
@@ -2001,7 +2033,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Copy dust</source>
- <translation>Copia l'importo</translation>
+ <translation>Copia trascurabile</translation>
</message>
<message>
<source>Are you sure you want to send?</source>
@@ -2024,11 +2056,11 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Enter a label for this address to add it to your address book</source>
- <translation>Inserisci un'etichetta per questo indirizzo, per aggiungerlo nella rubrica</translation>
+ <translation>Inserisci un'etichetta per questo indirizzo, per aggiungerlo alla rubrica</translation>
</message>
<message>
<source>&amp;Label:</source>
- <translation>&amp;Etichetta</translation>
+ <translation>&amp;Etichetta:</translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -2059,12 +2091,24 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>Rimuovi questa voce</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>La commissione sarà sottratta dall'importo che si sta inviando. Il beneficiario riceverà un totale di bitcoin inferiore al valore digitato. Nel caso in cui siano stati selezionati più beneficiari la commissione sarà suddivisa in parti uguali.</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation>S&amp;ottrae la commissione dall'importo</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Messaggio:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Questa è una richiesta di pagamento verificata.</translation>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>Questa è una richiesta di pagamento non autenticata.</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>Questa è una richiesta di pagamento autenticata.</translation>
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
@@ -2075,10 +2119,6 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>Messaggio incluso nel bitcoin URI e che sarà memorizzato con la transazione per vostro riferimento. Nota: Questo messaggio non sarà inviato attraverso la rete Bitcoin.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Questa è una richiesta di pagamento non verificata.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Pagare a:</translation>
</message>
@@ -2106,15 +2146,15 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>&amp;Sign Message</source>
- <translation>&amp;Firma il messaggio</translation>
+ <translation>&amp;Firma Messaggio</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Puoi firmare messaggi con i tuoi indirizzi in modo da dimostrarne il possesso. Presta attenzione a non firmare dichiarazioni vaghe, attacchi di phishing potrebbero cercare di spingerti ad apporre la tua firma su di esse. Firma solo dichiarazioni completamente dettagliate e delle quali condividi in pieno il contenuto.</translation>
+ <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>È possibile firmare messaggi/accordi con i propri indirizzi in modo da dimostrare di poter ricevere bitcoin attraverso di essi. Si consiglia di prestare attenzione a non firmare dichiarazioni vaghe o casuali, attacchi di phishing potrebbero cercare di indurre ad apporre la firma su di esse. Si raccomanda di firmare esclusivamente dichiarazioni completamente dettagliate e delle quali si condivide in pieno il contenuto.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
- <translation>L'indirizzo Bitcoin con cui vuoi contrassegnare il messaggio</translation>
+ <translation>L'indirizzo Bitcoin da utilizzare per firmare il messaggio</translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -2146,7 +2186,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Sign the message to prove you own this Bitcoin address</source>
- <translation>Firma un messaggio per dimostrare di possedere questo indirizzo</translation>
+ <translation>Firma un messaggio per dimostrare di possedere questo indirizzo Bitcoin</translation>
</message>
<message>
<source>Sign &amp;Message</source>
@@ -2158,15 +2198,15 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Clear &amp;All</source>
- <translation>Cancella &amp;tutto</translation>
+ <translation>Cancella &amp;Tutto</translation>
</message>
<message>
<source>&amp;Verify Message</source>
<translation>&amp;Verifica Messaggio</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Inserisci l'indirizzo del firmatario, il messaggio (assicurati di copiare esattamente anche i ritorni a capo, gli spazi, le tabulazioni, etc..) e la firma qui sotto, per verificare il messaggio. Presta attenzione a non vedere nella firma più di quanto non sia riportato nel messaggio stesso, per evitare di cadere vittima di attacchi di tipo man-in-the-middle.</translation>
+ <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>Per verificare il messaggio inserire l'indirizzo del firmatario, il messaggio e la firma nei campi sottostanti, assicurandosi di copiare esattamente anche ritorni a capo, spazi, tabulazioni, etc.. Si raccomanda di non lasciarsi fuorviare dalla firma a leggere più di quanto non sia riportato nel testo del messaggio stesso, in modo da evitare di cadere vittima di attacchi di tipo man-in-the-middle. Si ricorda che la verifica della firma dimostra soltanto che il firmatario può ricevere pagamenti con l'indirizzo corrispondente, non prova l'invio di alcuna transazione.</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
@@ -2194,7 +2234,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Please check the address and try again.</source>
- <translation>Per favore controlla l'indirizzo e prova ancora</translation>
+ <translation>Per favore controlla l'indirizzo e prova di nuovo.</translation>
</message>
<message>
<source>The entered address does not refer to a key.</source>
@@ -2222,7 +2262,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Please check the signature and try again.</source>
- <translation>Per favore controlla la firma e prova ancora.</translation>
+ <translation>Per favore controlla la firma e prova di nuovo.</translation>
</message>
<message>
<source>The signature did not match the message digest.</source>
@@ -2245,7 +2285,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>The Bitcoin Core developers</source>
- <translation>Gli sviluppatori del Bitcoin Core</translation>
+ <translation>Gli sviluppatori di Bitcoin Core</translation>
</message>
<message>
<source>[testnet]</source>
@@ -2275,7 +2315,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>%1/unconfirmed</source>
- <translation>%1/non confermato</translation>
+ <translation>%1/non confermata</translation>
</message>
<message>
<source>%1 confirmations</source>
@@ -2287,7 +2327,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message numerus="yes">
<source>, broadcast through %n node(s)</source>
- <translation><numerusform>, trasmesso attraverso %n nodo</numerusform><numerusform>, trasmesso attraverso %n nodi</numerusform></translation>
+ <translation><numerusform>, trasmesso attraverso %n nodo</numerusform><numerusform>, trasmessa attraverso %n nodi</numerusform></translation>
</message>
<message>
<source>Date</source>
@@ -2315,7 +2355,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>watch-only</source>
- <translation>Guarda solo</translation>
+ <translation>sola lettura</translation>
</message>
<message>
<source>label</source>
@@ -2339,7 +2379,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Total debit</source>
- <translation>Credito Totale</translation>
+ <translation>Debito totale</translation>
</message>
<message>
<source>Total credit</source>
@@ -2367,11 +2407,11 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Merchant</source>
- <translation>Mercante</translation>
+ <translation>Commerciante</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>È necessario attendere %1 blocchi prima che i bitcoin generati possano essere spesi. Quando è stato generato questo blocco, è stato trasmesso alla rete in modo da poter essere aggiunto alla block chain. Se l'inserimento avrà esito negativo il suo stato sarà modificato in "non accettato" e risulterà non spendibile. Questo può occasionalmente accadere se un altro nodo genera un blocco entro pochi secondi dal tuo.</translation>
+ <translation>È necessario attendere %1 blocchi prima che i bitcoin generati possano essere spesi. Al momento della generazione questo blocco è stato trasmesso alla rete in modo da poter essere aggiunto alla block chain. Se l'inserimento avrà esito negativo lo stato del blocco sarà modificato in "non accettato" ed esso risulterà non spendibile. Ciò può verificarsi occasionalmente nel caso in cui un altro blocco sia stato generato entro pochi secondi dal tuo.</translation>
</message>
<message>
<source>Debug information</source>
@@ -2399,7 +2439,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>, has not been successfully broadcast yet</source>
- <translation>, non è stato ancora trasmesso con successo</translation>
+ <translation>, non è ancora stata trasmessa con successo</translation>
</message>
<message numerus="yes">
<source>Open for %n more block(s)</source>
@@ -2432,10 +2472,6 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>Tipo</translation>
</message>
<message>
- <source>Address</source>
- <translation>Indirizzo</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Immaturo (%1 conferme, sarà disponibile fra %2)</translation>
</message>
@@ -2449,11 +2485,11 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Confirmed (%1 confirmations)</source>
- <translation>Confermato (%1 conferme)</translation>
+ <translation>Confermata (%1 conferme)</translation>
</message>
<message>
<source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Questo blocco non è stato ricevuto dagli altri nodi e probabilmente non sarà accettato!</translation>
+ <translation>Questo blocco non è stato ricevuto da alcun altro nodo e probabilmente non sarà accettato!</translation>
</message>
<message>
<source>Generated but not accepted</source>
@@ -2464,8 +2500,12 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etichetta</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
- <translation>Non confermato:</translation>
+ <translation>Non confermata</translation>
</message>
<message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
@@ -2497,11 +2537,11 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>watch-only</source>
- <translation>Guarda solo</translation>
+ <translation>sola lettura</translation>
</message>
<message>
<source>(n/a)</source>
- <translation>(N / a)</translation>
+ <translation>(n/d)</translation>
</message>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
@@ -2516,8 +2556,12 @@ Più URL vengono separati da una barra verticale |.</translation>
<translation>Tipo di transazione.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Indirizzo di destinazione della transazione.</translation>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation>Indica se un indirizzo di sola lettura sia o meno coinvolto in questa transazione.</translation>
+ </message>
+ <message>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation>Intento/scopo della transazione definito dall'utente.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2671,7 +2715,7 @@ Più URL vengono separati da una barra verticale |.</translation>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
- <translation>Tipo di unità visualizzata. Clicca per selezionare un altra unità</translation>
+ <translation>Unità con cui visualizzare gli importi. Clicca per selezionare un altra unità.</translation>
</message>
</context>
<context>
@@ -2696,7 +2740,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation>Esporta su file i dati della tabella corrente</translation>
+ <translation>Esporta su file i dati contenuti nella tabella corrente</translation>
</message>
<message>
<source>Backup Wallet</source>
@@ -2735,7 +2779,7 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Connettiti ad un nodo per recuperare gli indirizzi dei peer e scollegati</translation>
+ <translation>Connessione ad un nodo e successiva disconnessione per recuperare gli indirizzi dei peer</translation>
</message>
<message>
<source>Specify your own public address</source>
@@ -2755,61 +2799,45 @@ Più URL vengono separati da una barra verticale |.</translation>
</message>
<message>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
- <translation>Accetta connessioni dall'esterno (predefinito: 1 se no -proxy o -connect)</translation>
- </message>
- <message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, devi impostare una rpcpassword nel file di configurazione:
-%s
-Si raccomanda l'uso della seguente password generata casualmente:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(non serve ricordare questa password)
-Il nome utente e la password NON DEVONO essere uguali.
-Se il file non esiste, crealo concedendo permessi di lettura al solo proprietario del file.
-Si raccomanda anche di impostare alertnotify così sarai avvisato di eventuali problemi;
-ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
-</translation>
+ <translation>Accetta connessioni dall'esterno (predefinito: 1 se -proxy o -connect non sono utilizzati)</translation>
</message>
<message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
- <translation>Associa all'indirizzo indicato e resta permanentemente in ascolto su questo. Usa la notazione [host]:porta per l'IPv6</translation>
+ <translation>Associa all'indirizzo indicato e resta permanentemente in ascolto su di esso. Usa la notazione [host]:porta per l'IPv6</translation>
</message>
<message>
- <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
- <translation>Elimina tutte le transazioni dal wallet e recupera solo le parti della blockchain con il comando -rescan all'avvio.</translation>
+ <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default: %u)</source>
+ <translation>Limita la quantità di transazioni gratuite ad &lt;n&gt;*1000 byte al minuto (predefinito: %u)</translation>
</message>
<message>
- <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
- <translation>Entra in modalità di test di regressione, la quale usa una speciale catena in cui i blocchi possono essere risolti istantaneamente.</translation>
+ <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
+ <translation>Elimina tutte le transazioni dal portamonete e recupera solo quelle che fanno parte della blockchain attraverso il comando -rescan all'avvio.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Errore: la transazione è stata rifiutata! Questo può accadere se alcuni bitcoin nel tuo portamonete sono già stati spesi, ad esempio se hai utilizzato una copia del file wallet.dat per spendere bitcoin e questi non sono stati considerati spesi dal portamonete corrente.</translation>
+ <source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
+ <translation>Distribuito secondo la licenza software MIT, vedi il file COPYING incluso oppure &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Errore: questa transazione necessita di una commissione di almeno %s a causa del suo ammontare, della sua complessità, o dell'uso di fondi recentemente ricevuti!</translation>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>Entra in modalità test di regressione. Questa utilizza una speciale catena in cui i blocchi possono essere risolti istantaneamente.</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
- <translation>Esegui comando quando una transazione del portamonete cambia (%s in cmd è sostituito da TxID)</translation>
+ <translation>Esegue un comando quando lo stato di una transazione del portamonete cambia (%s in cmd è sostituito da TxID)</translation>
</message>
<message>
<source>In this mode -genproclimit controls how many blocks are generated immediately.</source>
<translation>In questa modalità -genproclimit determina quanti blocchi saranno generati immediatamente.</translation>
</message>
<message>
+ <source>Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Commissioni massime totali da includere in una singola transazione dal portamonete. Un'impostazione troppo bassa potrebbe provocare l'annullamento di transazioni di grosse dimensioni (predefinito: %s)</translation>
+ </message>
+ <message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, &gt;%u = target size in MiB to use for block files)</source>
+ <translation>Riduce i requisiti di spazio di archiviazione attraverso la rimozione dei vecchi blocchi (pruning). Questa modalità disabilita le funzionalità di portamonete ed è incompatibile con l'opzione -txindex. Attenzione: il ripristinando questa opzione l'intera blockchain dovrà essere riscaricata. (predefinito: 0 = disabilita il pruning, &gt;%u = dimensione desiderata in MiB per i file dei blocchi)</translation>
+ </message>
+ <message>
<source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
<translation>Imposta il numero di thread per la verifica degli script (da %u a %d, 0 = automatico, &lt;0 = lascia questo numero di core liberi, predefinito: %d)</translation>
</message>
@@ -2823,23 +2851,27 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
- <translation>Attenzione: -paytxfee è molto alta. Questa è la commissione che si paga quando si invia una transazione.</translation>
+ <translation>Attenzione: -paytxfee è impostato su un valore molto elevato. Questa è la commissione che si paga quando si invia una transazione.</translation>
</message>
<message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
- <translation>Attenzione: La rete non sembra essere d'accordo pienamente! Alcuni minatori sembrano riscontrare problemi.</translation>
+ <translation>Attenzione: La rete non sembra trovarsi in pieno consenso! Alcuni minatori sembrano riscontrare problemi.</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>Attenzione: Sembra che non ci sia completo accordo con i nostri peer! Un aggiornamento da parte tua o degli altri nodi potrebbe essere necessario.</translation>
+ <translation>Attenzione: Sembra che non vi sia pieno consenso con i nostri peer! Un aggiornamento da parte tua o degli altri nodi potrebbe essere necessario.</translation>
</message>
<message>
<source>Warning: error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>Attenzione: errore di lettura di wallet.dat! Tutte le chiavi sono state lette correttamente, ma i dati delle transazioni o le voci in rubrica potrebbero mancare o non essere corretti.</translation>
+ <translation>Attenzione: errore di lettura di wallet.dat! Tutte le chiavi sono state lette correttamente, ma i dati delle transazioni o della rubrica potrebbero essere mancanti o non corretti.</translation>
</message>
<message>
<source>Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
- <translation>Attenzione: wallet.dat corrotto, dati recuperati! Il wallet.dat originale è stato salvato come wallet.{timestamp}.bak in %s; se il tuo saldo o le transazioni non sono corrette dovresti ripristinare da un backup.</translation>
+ <translation>Attenzione: wallet.dat corrotto, dati recuperati! Il wallet.dat originale è stato salvato come wallet.{timestamp}.bak in %s. Se i dati relativi a saldo o transazioni non dovessero risultare corretti si consiglia di procedere al ripristino da un backup.</translation>
+ </message>
+ <message>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Inserisce in whitelist i peer che si connettono da un dato indirizzo IP o netmask. Può essere specificato più volte.</translation>
</message>
<message>
<source>(default: 1)</source>
@@ -2847,7 +2879,7 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>&lt;category&gt; can be:</source>
- <translation>&lt;category&gt; può essere:</translation>
+ <translation>Valori possibili per &lt;category&gt;:</translation>
</message>
<message>
<source>Attempt to recover private keys from a corrupt wallet.dat</source>
@@ -2859,7 +2891,7 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>Connect only to the specified node(s)</source>
- <translation>Connetti solo al nodo specificato</translation>
+ <translation>Connessione ai soli nodi specificati</translation>
</message>
<message>
<source>Connection options:</source>
@@ -2874,12 +2906,8 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
<translation>Opzioni di Debug/Test:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Scopre il proprio indirizzo IP (predefinito: 1 se in ascolto e no -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
- <translation>Non caricare il portamonete e disabilita le chiamate RPC al portamonete</translation>
+ <translation>Disabilita il portamonete e le relative chiamate RPC</translation>
</message>
<message>
<source>Do you want to rebuild the block database now?</source>
@@ -2891,29 +2919,25 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>Error initializing wallet database environment %s!</source>
- <translation>Errore durante l'inizializzazione dell'ambiente %s del database del portamonete!</translation>
+ <translation>Errore durante l'inizializzazione dell'ambiente del database del portamonete %s!</translation>
</message>
<message>
<source>Error loading block database</source>
- <translation>Errore caricamento database blocchi</translation>
+ <translation>Errore durante il caricamento del database blocchi</translation>
</message>
<message>
<source>Error opening block database</source>
- <translation>Errore caricamento database blocchi</translation>
+ <translation>Errore durante l'apertura del database blocchi</translation>
</message>
<message>
<source>Error: A fatal internal error occured, see debug.log for details</source>
- <translation>Errore: si è verificato un errore fatale, consulta il file debug.log for maggiori dettagli.</translation>
+ <translation>Errore: si è verificato un errore interno fatale. Consulta il file debug.log for maggiori dettagli.</translation>
</message>
<message>
<source>Error: Disk space is low!</source>
<translation>Errore: la spazio libero sul disco è insufficiente!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Errore: portamonete bloccato, impossibile creare la transazione!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Nessuna porta disponibile per l'ascolto. Usa -listen=0 se vuoi procedere comunque.</translation>
</message>
@@ -2927,7 +2951,7 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation>Blocco genesis non corretto o non trovato. Cartella dati errata?</translation>
+ <translation>Blocco genesi non corretto o non trovato. È possibile che la cartella dati appartenga ad un'altra rete.</translation>
</message>
<message>
<source>Invalid -onion address: '%s'</source>
@@ -2939,27 +2963,35 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
- <translation>Connetti solo ai nodi nella rete &lt;net&gt; (ipv4, ipv6 o Tor)</translation>
+ <translation>Connessione ai soli nodi appartenenti alla rete &lt;net&gt; (ipv4, ipv6 o Tor)</translation>
+ </message>
+ <message>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>La modalità prune non può essere configurata con un valore negativo.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Ricreare l'indice della catena di blocchi dai file blk000??.dat correnti</translation>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>La modalità prune è incompatibile con l'opzione -txindex.</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
- <translation>Imposta la dimensione cache del database in megabyte (%d a %d, predefinito: %d)</translation>
+ <translation>Imposta la dimensione della cache del database in megabyte (%d a %d, predefinito: %d)</translation>
</message>
<message>
<source>Set maximum block size in bytes (default: %d)</source>
- <translation>Imposta la dimensione massima del blocco in byte (predefinita: %d)</translation>
+ <translation>Imposta la dimensione massima del blocco in byte (predefinito: %d)</translation>
</message>
<message>
<source>Specify wallet file (within data directory)</source>
- <translation>Specifica il file portamonete (all'interno della cartella dati)</translation>
+ <translation>Specifica il file del portamonete (all'interno della cartella dati)</translation>
</message>
<message>
<source>This is intended for regression testing tools and app development.</source>
- <translation>Questo è previsto per l'uso con test di regressione e per lo sviluppo di applicazioni.</translation>
+ <translation>Questa impostazione è destinata all'uso con i test di regressione e per lo sviluppo di applicazioni.</translation>
+ </message>
+ <message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Usa UPnP per mappare la porta di ascolto (predefinito: %u)</translation>
</message>
<message>
<source>Verifying blocks...</source>
@@ -2978,6 +3010,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
<translation>Opzioni portamonete:</translation>
</message>
<message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>Attenzione: questa versione è obsoleta. Aggiornamento necessario!</translation>
+ </message>
+ <message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>È necessario ricostruire il database usando -reindex per cambiare -txindex</translation>
</message>
@@ -2986,54 +3022,201 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
<translation>Importa blocchi da un file blk000??.dat esterno</translation>
</message>
<message>
- <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source>
- <translation>Si è verificato un errore durante l'impostazione della %s porta %u RPC per l'ascolto su: %s</translation>
+ <source>Allow JSON-RPC connections from specified source. Valid for &lt;ip&gt; are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
+ <translation>Permette connessioni JSON-RPC dall'origine specificata. I valori validi per &lt;ip&gt; sono un singolo IP (ad es. 1.2.3.4), una network/netmask (ad es. 1.2.3.4/255.255.255.0) oppure una network/CIDR (ad es. 1.2.3.4/24). Questa opzione può essere specificata più volte.</translation>
+ </message>
+ <message>
+ <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source>
+ <translation>Resta in ascolto sull'indirizzo indicato ed inserisce in whitelist i peer che vi si collegano. Usa la notazione [host]:porta per l'IPv6</translation>
+ </message>
+ <message>
+ <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source>
+ <translation>Resta in attesa di connessioni JSON-RPC sull'indirizzo indicato. Usa la notazione [host]:porta per IPv6. Questa opzione può essere specificata più volte (predefinito: associa a tutte le interfacce) </translation>
</message>
<message>
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
<translation>Non è possibile ottenere un lock sulla cartella %s. Probabilmente Bitcoin Core è già in esecuzione.</translation>
</message>
<message>
+ <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
+ <translation>Crea nuovi file con i permessi di default del sistema, invece che con umask 077 (ha effetto solo con funzionalità di portamonete disabilitate)</translation>
+ </message>
+ <message>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Scopre i propri indirizzi IP (predefinito: 1 se in ascolto ed -externalip o -proxy non sono specificati)</translation>
+ </message>
+ <message>
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
- <translation>Errore: l'ascolto per per connessioni in arrivo fallito (errore riportato %s)</translation>
+ <translation>Errore: attesa per connessioni in arrivo fallita (errore riportato %s)</translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Errore: individuato argomento -socks non supportato. Non è più possibile impostare la versione SOCKS, solamente i proxy SOCKS5 sono supportati.</translation>
</message>
<message>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
- <translation>Esegue un comando quando viene ricevuto un allarme rilevante o quando vediamo un fork veramente lungo (%s in cmd è sostituito dal messaggio)</translation>
+ <translation>Esegue un comando in caso di ricezione di un allarme pertinente o se si rileva un fork molto lungo (%s in cmd è sostituito dal messaggio)</translation>
</message>
<message>
<source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source>
- <translation>Le commissioni (in BTC/kb) minori di questa saranno considerate nulle per la trasmissione (predefinito: %s)</translation>
+ <translation>Le commissioni (in BTC/kB) inferiori a questo valore sono considerate pari a zero relativamente alla trasmissione (predefinito: %s)</translation>
</message>
<message>
<source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source>
- <translation>Le commissioni inferiori a questo valore saranno considerate nulle per la creazione della transazione (predefinito: %s)</translation>
+ <translation>Le commissioni (in BTC/kB) inferiori a questo valore sono considerate pari a zero relativamente alla creazione della transazione (predefinito: %s)</translation>
+ </message>
+ <message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Nel caso in cui paytxfee non sia impostato, include una commissione tale da ottenere un avvio delle conferme entro una media di n blocchi (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Importo non valido per -maxtxfee=&lt;amount&gt;: '%s' (deve essere almeno pari alla commissione 'minrelay fee' di %s per prevenire transazioni bloccate)</translation>
+ </message>
+ <message>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>Dimensione massima dei dati in transazioni di trasporto dati che saranno trasmesse ed incluse nei blocchi (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MB. Please use a higher number.</source>
+ <translation>La modalità prune è configurata al di sotto del minimo di %d MB. Si prega di utilizzare un valore più elevato.</translation>
+ </message>
+ <message>
+ <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
+ <translation>Ottiene gli indirizzi dei peer attraverso interrogazioni DNS, in caso di scarsa disponibilità (predefinito: 1 a meno che -connect non sia specificato)</translation>
+ </message>
+ <message>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>Randomizza le credenziali per ogni connessione proxy. Permette la Tor stream isolation (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Require high priority for relaying free or low-fee transactions (default: %u)</source>
+ <translation>Richiedi alta priorità per la trasmissione di transazioni a zero o basse commissioni (predefinito: %u)</translation>
</message>
<message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
- <translation>Imposta la dimensione massima in byte delle transazioni ad alta-priorità/basse-commissioni (predefinita: %d)</translation>
+ <translation>Imposta la dimensione massima in byte delle transazioni ad alta-priorità/basse-commissioni (predefinito: %d)</translation>
+ </message>
+ <message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>Specifica il numero di thread per la generazione di bitcoin, se abilitata (-1 = tutti i core, predefinito: %d)</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>L'importo della transazione risulta troppo basso per l'invio una volta dedotte le commissioni.</translation>
+ </message>
+ <message>
+ <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
+ <translation>Questo prodotto include software sviluppato dal progetto OpenSSL per l'uso del Toolkit OpenSSL &lt;https://www.openssl.org/&gt;, software crittografico scritto da Eric Young e software UPnP scritto da Thomas Bernard.</translation>
+ </message>
+ <message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>Per utilizzare bitcoind o l'opzione -server in Bitcoin Core è necessario specificare una rpcpassword nel file di configurazione:
+%s
+Si raccomanda di utilizzare la seguente password casuale:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(non è necessario ricordare questa password)
+Il nome utente e la password NON DEVONO corrispondere.
+Se il file non esiste si raccomanda di crearlo con permessi di lettura per il solo proprietario.
+Si raccomanda inoltre di configurare alertnotify in modo da ricevere notifiche di eventuali problemi, ad es. alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Attenzione: -maxtxfee è impostato su un valore molto elevato. Tali commissioni potrebbero essere pagate anche in una singola transazione.</translation>
+ </message>
+ <message>
+ <source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
+ <translation>Attenzione: Si prega di verificare che data ed ora del computer siano corrette! Una configurazione errata dell'orologio di sistema potrebbe impedire a Bitcoin Core di funzionare regolarmente.</translation>
+ </message>
+ <message>
+ <source>Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway</source>
+ <translation>I peer inclusi in whitelist non possono subire ban per DoS e le loro transazioni saranno sempre trasmesse, anche nel caso in cui si trovino già nel mempool. Ciò è utile ad es. per i gateway</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>Per ritornare alla modalità unpruned sarà necessario ricostruire il database utilizzando l'opzione -reindex. L'intera blockchain sarà riscaricata.</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(default: %u)</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Accetta richieste REST pubbliche (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Activating best chain...</source>
+ <translation>Attivazione della blockchain migliore...</translation>
+ </message>
+ <message>
+ <source>Allow self signed root certificates (default: 0)</source>
+ <translation>Permette certificati radice auto-firmati (predefinito: 0)</translation>
+ </message>
+ <message>
+ <source>Can't run with a wallet in prune mode.</source>
+ <translation>Impossibile operare con un portamonete in modalità prune.</translation>
</message>
<message>
<source>Cannot resolve -whitebind address: '%s'</source>
- <translation>Impossibile risolvere -whitebind address: '%s'</translation>
+ <translation>Impossibile risolvere indirizzo -whitebind: '%s'</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Seleziona la cartella dati all'avvio (predefinito: 0)</translation>
</message>
<message>
<source>Connect through SOCKS5 proxy</source>
- <translation>Connetti attraverso SOCKS5 proxy</translation>
+ <translation>Connessione attraverso un proxy SOCKS5</translation>
+ </message>
+ <message>
+ <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
+ <translation>Copyright (C) 2009-%i Gli sviluppatori di Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>Could not parse -rpcbind value %s as network address</source>
+ <translation>Non è stato possibile riconoscere il valore %s di -rpcbind come indirizzo di rete</translation>
</message>
<message>
<source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
- <translation>Errore caricamento wallet.dat: il wallet richiede una versione nuova di Bitcoin Core</translation>
+ <translation>Errore durante il caricamento del file wallet.dat: il portamonete richiede una versione di Bitcoin Core più recente</translation>
+ </message>
+ <message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Errore durante lalettura del database. Arresto in corso.</translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -tor found, use -onion.</source>
+ <translation>Errore: Rilevato argomento -tor non supportato, utilizzare -onion.</translation>
</message>
<message>
<source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
- <translation>Commissione (in BTC/kB) da aggiungere alla transazione che invii (default: %s)</translation>
+ <translation>Commissione (in BTC/kB) da aggiungere alle transazioni che invii (predefinito: %s)</translation>
</message>
<message>
<source>Information</source>
<translation>Informazioni</translation>
</message>
<message>
+ <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
+ <translation>Test di integrità iniziale fallito. Bitcoin Core si arresterà.</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Importo non valido per -maxtxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Importo non valido per -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
</message>
@@ -3042,12 +3225,24 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
<translation>Importo non valido per -mintxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Node relay options:</source>
- <translation>Opzioni relay nodo:</translation>
+ <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation>Importo non valido per -paytxfee=&lt;amount&gt;: '%s' (deve essere almeno %s)</translation>
+ </message>
+ <message>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation>Netmask non valida specificata in -whitelist: '%s'</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Stampa il blocco all'avvio, se presente nell'indice dei blocchi</translation>
+ <source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
+ <translation>Mantiene in memoria al massimo &lt;n&gt; transazioni non collegabili (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Need to specify a port with -whitebind: '%s'</source>
+ <translation>È necessario specificare una porta con -whitebind: '%s'</translation>
+ </message>
+ <message>
+ <source>Node relay options:</source>
+ <translation>Opzioni trasmissione nodo:</translation>
</message>
<message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
@@ -3058,6 +3253,10 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
<translation>Opzioni server RPC:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>Supporto RPC per le connessioni HTTP persistenti (predefinito: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Scarta casualmente 1 ogni &lt;n&gt; messaggi di rete</translation>
</message>
@@ -3071,19 +3270,39 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>Send transactions as zero-fee transactions if possible (default: %u)</source>
- <translation>Invia transazioni a zero commissioni se possibile (default: %u)</translation>
+ <translation>Invia transazioni a zero commissioni se possibile (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Imposta i certificati radice SSL per le richieste di pagamento (predefinito: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Imposta lingua, ad esempio "it_IT" (predefinito: lingua di sistema)</translation>
</message>
<message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Mostra tutte le opzioni di debug (utilizzo: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Mostra finestra di presentazione all'avvio (predefinito: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
- <translation>Riduci il file debug.log all'avvio del client (predefinito: 1 se non impostato -debug)</translation>
+ <translation>Riduce il file debug.log all'avvio del client (predefinito: 1 se -debug non è impostato)</translation>
</message>
<message>
<source>Signing transaction failed</source>
- <translation>Transazione di firma fallita</translation>
+ <translation>Firma transazione fallita</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Avvia ridotto a icona</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>L'importo della transazione è troppo basso per pagare la commissione</translation>
</message>
<message>
<source>This is experimental software.</source>
@@ -3095,36 +3314,51 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>Transaction amounts must be positive</source>
- <translation>L'importo della transazione deve essere positivo</translation>
+ <translation>Gli importi della transazione devono essere positivi</translation>
+ </message>
+ <message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transazione troppo grande in base alla policy sulle commissioni</translation>
</message>
<message>
<source>Transaction too large</source>
<translation>Transazione troppo grande</translation>
</message>
<message>
+ <source>UI Options:</source>
+ <translation>Opzioni Interfaccia Utente:</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer (bind returned error %s)</source>
+ <translation>Impossibile associarsi a %s su questo computer (l'associazione ha restituito l'errore %s)</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
- <translation>Usa UPnP per mappare la porta in ascolto (predefinito: 1 when listening)</translation>
+ <translation>Usa UPnP per mappare la porta in ascolto (predefinito: 1 quando in ascolto)</translation>
</message>
<message>
<source>Username for JSON-RPC connections</source>
- <translation>Nome utente per connessioni JSON-RPC
-</translation>
+ <translation>Nome utente per connessioni JSON-RPC</translation>
</message>
<message>
<source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Il wallet ha bisogno di essere reiscritto : riavvia Bitcoin Core per completare l'operazione</translation>
+ <translation>Il portamonete necessitava di essere riscritto: riavviare Bitcoin Core per completare l'operazione</translation>
</message>
<message>
<source>Warning</source>
<translation>Attenzione</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Attenzione: questa versione è obsoleta, aggiornamento necessario!</translation>
+ <source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Attenzione: Argomento -benchmark ignorato in quanto non supportato, usare -debug=bench.</translation>
+ </message>
+ <message>
+ <source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Attenzione: Argomento -debugnet ignorato in quanto non supportato, usare -debug=net.</translation>
</message>
<message>
<source>Zapping all transactions from wallet...</source>
- <translation>Cancella e ricompila tutte le transazioni dal wallet...</translation>
+ <translation>Eliminazione dal portamonete di tutte le transazioni...</translation>
</message>
<message>
<source>on startup</source>
@@ -3136,12 +3370,11 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>Password for JSON-RPC connections</source>
- <translation>Password per connessioni JSON-RPC
-</translation>
+ <translation>Password per connessioni JSON-RPC</translation>
</message>
<message>
<source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
- <translation>Esegui il comando quando il migliore blocco cambia(%s nel cmd è sostituito dall'hash del blocco)</translation>
+ <translation>Esegue un comando quando il miglior blocco cambia (%s nel cmd è sostituito dall'hash del blocco)</translation>
</message>
<message>
<source>Upgrade wallet to latest format</source>
@@ -3149,22 +3382,19 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>Rescan the block chain for missing wallet transactions</source>
- <translation>Ripeti analisi della catena dei blocchi per cercare le transazioni mancanti dal portamonete
-</translation>
+ <translation>Ripete la scansione della block chain per individuare le transazioni che mancano dal portamonete</translation>
</message>
<message>
<source>Use OpenSSL (https) for JSON-RPC connections</source>
- <translation>Utilizzare OpenSSL (https) per le connessioni JSON-RPC
-</translation>
+ <translation>Utilizza OpenSSL (https) per le connessioni JSON-RPC</translation>
</message>
<message>
<source>This help message</source>
- <translation>Questo messaggio di aiuto
-</translation>
+ <translation>Questo messaggio di aiuto</translation>
</message>
<message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
- <translation>Consenti ricerche DNS per -addnode, -seednode e -connect</translation>
+ <translation>Consente interrogazioni DNS per -addnode, -seednode e -connect</translation>
</message>
<message>
<source>Loading addresses...</source>
@@ -3175,64 +3405,172 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
<translation>Errore caricamento wallet.dat: Portamonete corrotto</translation>
</message>
<message>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = mantiene metadati tx, ad es. proprietario account ed informazioni di richiesta di pagamento, 2 = scarta metadati tx)</translation>
+ </message>
+ <message>
+ <source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Scarica l'attività del database dal pool in memoria al log su disco ogni &lt;n&gt; megabyte (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>Determina quanto sarà approfondita la verifica da parte di -checkblocks (0-4, predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
+ <translation>Abilita il log della priorità di transazione e della commissione per kB quando si generano blocchi (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
+ <translation>Mantiene l'indice completo delle transazioni usato dalla chiamata rpc getrawtransaction (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
+ <translation>Numero di secondi di sospensione prima della riconnessione per i peer che mostrano un comportamento anomalo (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
+ <translation>Emette informazioni di debug (predefinito: %u, fornire &lt;category&gt; è opzionale)</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
+ <translation>Usa un proxy SOCKS5 a parte per raggiungere i peer attraverso gli hidden services di Tor (predefinito: %s)</translation>
+ </message>
+ <message>
+ <source>(default: %s)</source>
+ <translation>(predefinito: %s)</translation>
+ </message>
+ <message>
+ <source>Acceptable ciphers (default: %s)</source>
+ <translation>Cifrari accettabili (predefinito: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>Interroga sempre i DNS per ottenere gli indirizzi dei peer (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Disable safemode, override a real safe mode event (default: %u)</source>
+ <translation>Disabilita la modalità sicura ignorando gli eventi che porterebbero alla sua attivazione (predefinito: %u)</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>Errore caricamento wallet.dat</translation>
</message>
<message>
<source>Force safe mode (default: %u)</source>
- <translation>Forza modalità provvisoria (dafault: %u)</translation>
+ <translation>Forza modalità sicura (predefinito: %u)</translation>
</message>
<message>
<source>Generate coins (default: %u)</source>
- <translation>Genera coins (default: %u)</translation>
+ <translation>Genera bitcoin (predefinito: %u)</translation>
</message>
<message>
<source>How many blocks to check at startup (default: %u, 0 = all)</source>
- <translation>Quanti blocchi da controllare all'avvio (dafault: %u, 0 = tutti)</translation>
+ <translation>Numero di blocchi da controllare all'avvio (predefinito: %u, 0 = tutti)</translation>
+ </message>
+ <message>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>Include gli indirizzi IP nell'output del debug (predefinito: %u)</translation>
</message>
<message>
<source>Invalid -proxy address: '%s'</source>
<translation>Indirizzo -proxy non valido: '%s'</translation>
</message>
<message>
+ <source>Limit size of signature cache to &lt;n&gt; entries (default: %u)</source>
+ <translation>Limita la dimensione della cache delle firme a &lt;n&gt; voci (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Resta in attesa di connessioni JSON-RPC su &lt;port&gt; (predefinito: %u o testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Resta in attesa di connessioni su &lt;port&gt; (predefinito: %u o testnet: %u)</translation>
+ </message>
+ <message>
<source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
- <translation>Mantieni al massimo &lt;n&gt; connessioni ai peers (default: %u)</translation>
+ <translation>Mantiene al massimo &lt;n&gt; connessioni verso i peer (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>Configura il portamonete per la trasmissione di transazioni</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Buffer di ricezione massimo per connessione, &lt;n&gt;*1000 byte (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Buffer di invio massimo per connessione, &lt;n&gt;*1000 byte (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Only accept block chain matching built-in checkpoints (default: %u)</source>
+ <translation>Accetta solo block chain corrispondenti ai checkpoint integrati nel codice (predefinito: %u)</translation>
</message>
<message>
<source>Prepend debug output with timestamp (default: %u)</source>
- <translation>Pretendi output di debug con timestamp (default: %u)</translation>
+ <translation>Antepone un timestamp all'output del debug (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>Trasmette ed include nei blocchi transazioni di trasporto dati (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>Trasmette transazioni non-P2SH multisig (predefinito: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Stampa l'albero dei blocchi all'avvio (default: %u)</translation>
+ <source>Run a thread to flush wallet periodically (default: %u)</source>
+ <translation>Mantieni in esecuzione un thread per scaricare periodicamente il portamonete (predefinito: %u)</translation>
</message>
<message>
<source>Server certificate file (default: %s)</source>
- <translation>File certificato del server (default: %s)</translation>
+ <translation>File del certificato del server (predefinito: %s)</translation>
</message>
<message>
<source>Server private key (default: %s)</source>
- <translation>Chiave privata del server (default: %s)</translation>
+ <translation>Chiave privata del server (predefinito: %s)</translation>
+ </message>
+ <message>
+ <source>Set key pool size to &lt;n&gt; (default: %u)</source>
+ <translation>Imposta la dimensione del pool di chiavi a &lt;n&gt; (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Set minimum block size in bytes (default: %u)</source>
+ <translation>Imposta la dimensione minima del blocco in byte (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Set the number of threads to service RPC calls (default: %d)</source>
+ <translation>Imposta il numero di thread destinati a rispondere alle chiamate RPC (predefinito %d)</translation>
+ </message>
+ <message>
+ <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source>
+ <translation>Imposta il flag DB_PRIVATE nell'ambiente di database del portamonete (predefinito: %u)</translation>
</message>
<message>
<source>Specify configuration file (default: %s)</source>
- <translation>Specifica il file di configurazione (default: %s)</translation>
+ <translation>Specifica il file di configurazione (predefinito: %s)</translation>
</message>
<message>
<source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
- <translation>Specifica il timeout di connessione in millisecondi (minimo:1, default: %d)</translation>
+ <translation>Specifica il timeout di connessione in millisecondi (minimo:1, predefinito: %d)</translation>
</message>
<message>
<source>Specify pid file (default: %s)</source>
- <translation>Specifica il file pid (default: %s)</translation>
+ <translation>Specifica il file pid (predefinito: %s)</translation>
</message>
<message>
<source>Spend unconfirmed change when sending transactions (default: %u)</source>
- <translation>Spendi il resto non confermato quando si inviano transazioni (default: %u)</translation>
+ <translation>Abilita la spesa di resto non confermato quando si inviano transazioni (predefinito: %u)</translation>
</message>
<message>
<source>Stop running after importing blocks from disk (default: %u)</source>
- <translation>Interrompi dopo aver importato i blocchi dal disco (default: %u)</translation>
+ <translation>Interrompi l'esecuzione dopo aver importato i blocchi dal disco (predefinito: %u)</translation>
+ </message>
+ <message>
+ <source>Threshold for disconnecting misbehaving peers (default: %u)</source>
+ <translation>Soglia di disconnessione per i peer che si comportano in maniera anomala (predefinito: %u)</translation>
</message>
<message>
<source>Unknown network specified in -onlynet: '%s'</source>
@@ -3240,7 +3578,7 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
</message>
<message>
<source>Cannot resolve -bind address: '%s'</source>
- <translation>Impossibile risolvere -bind address: '%s'</translation>
+ <translation>Impossibile risolvere indirizzo -bind: '%s'</translation>
</message>
<message>
<source>Cannot resolve -externalip address: '%s'</source>
@@ -3251,20 +3589,16 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
<translation>Importo non valido per -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Importo non valido</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fondi insufficienti</translation>
</message>
<message>
<source>Loading block index...</source>
- <translation>Caricamento dell'indice del blocco...</translation>
+ <translation>Caricamento dell'indice dei blocchi...</translation>
</message>
<message>
<source>Add a node to connect to and attempt to keep the connection open</source>
- <translation>Aggiunge un nodo a cui connettersi e tenta di tenere aperta la connessione</translation>
+ <translation>Aggiunge un nodo a cui connettersi e tenta di mantenere aperta la connessione</translation>
</message>
<message>
<source>Loading wallet...</source>
@@ -3287,10 +3621,6 @@ ad esempio: alertnotify=echo %%s | mail -s "Allarme Bitcoin" admin@foo.com
<translation>Caricamento completato</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Per usare l'opzione %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Errore</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ja.ts b/src/qt/locale/bitcoin_ja.ts
index 0c9805de8f..376d36bed0 100644
--- a/src/qt/locale/bitcoin_ja.ts
+++ b/src/qt/locale/bitcoin_ja.ts
@@ -1,9 +1,9 @@
-<TS language="ja" version="2.0">
+<TS language="ja" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>アドレスまたはラベルを編集するにはダブルクリック</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>右クリックでアドレスまたはラベルを編集します</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>パスフレーズの変更</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>新旧両方のパスフレーズを入力してください。</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>ウォレットの暗号化を確認する</translation>
</message>
@@ -172,6 +168,10 @@
<translation>本当にウォレットを暗号化しますか?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>暗号化処理を完了させるため Bitcoin Core をいますぐ終了します。ウォレットの暗号化では、コンピュータに感染したマルウェアなどによるビットコインの盗難から完全に守ることはできないことにご注意ください。</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>重要: 過去のウォレット ファイルのバックアップは、暗号化された新しいウォレット ファイルに取り替える必要があります。セキュリティ上の理由により、暗号化された新しいウォレットを使い始めると、暗号化されていないウォレット ファイルのバックアップはすぐに使えなくなります。</translation>
</message>
@@ -188,8 +188,8 @@
<translation>ウォレットの新しいパスフレーズを入力してください。&lt;br/&gt;&lt;b&gt;10文字以上のランダムな文字&lt;/b&gt;で構成されたものか、&lt;b&gt;8単語以上の単語&lt;/b&gt;で構成されたパスフレーズを使用してください。</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin は暗号化プロセスを終了するために今すぐ終了します。あなたのコンピュータがマルウェアに感染してコインを盗まれることもあるので、暗号化してもあなたのウォレットを完全に保護できないことを覚えていてください。</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>ウォレットの古いパスフレーズおよび新しいパスフレーズを入力してください。</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -311,10 +311,6 @@
<translation>Bitcoin アドレスにコインを送る</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Bitcoin の設定を変更する</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>ウォレットを他の場所にバックアップ</translation>
</message>
@@ -403,6 +399,10 @@
<translation>ビットコインコアについて (&amp;A)</translation>
</message>
<message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Bitcoin Core の設定を編集する</translation>
+ </message>
+ <message>
<source>Show the list of used sending addresses and labels</source>
<translation>使用済みの送金用アドレスとラベルの一覧を表示する</translation>
</message>
@@ -411,9 +411,17 @@
<translation>支払いを受け取るアドレスとラベルのリストを表示する</translation>
</message>
<message>
+ <source>Open a bitcoin: URI or payment request</source>
+ <translation>bitcoin: URIまたは支払いリクエストを開く</translation>
+ </message>
+ <message>
<source>&amp;Command-line options</source>
<translation>コマンドラインオプション (&amp;C)</translation>
</message>
+ <message>
+ <source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
+ <translation>有効な Bitcoin のコマンドライン オプションを見るために Bitcoin Core のヘルプメッセージを表示します。</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
<translation><numerusform>%n の Bitcoin ネットワークへのアクティブな接続</numerusform></translation>
@@ -423,6 +431,10 @@
<translation>利用可能なブロックがありません...</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>トランザクション履歴の %n ブロックを処理しました。</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n 時間</numerusform></translation>
</message>
@@ -475,6 +487,36 @@
<translation>追跡中...</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation>日付: %1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation>総額: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation>タイプ: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>ラベル: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>アドレス: %1
+</translation>
+ </message>
+ <message>
<source>Sent transaction</source>
<translation>送金取引</translation>
</message>
@@ -483,17 +525,6 @@
<translation>着金取引</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>日付: %1
-総額: %2
-種類: %3
-アドレス: %4</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>ウォレットは&lt;b&gt;暗号化されて、アンロックされています&lt;/b&gt;</translation>
</message>
@@ -536,10 +567,18 @@ Address: %4
<translation>手数料:</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>ダスト:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation>手数料差引後:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation>釣り銭:</translation>
+ </message>
+ <message>
<source>(un)select all</source>
<translation>すべて選択/選択解除</translation>
</message>
@@ -556,6 +595,14 @@ Address: %4
<translation>総額</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>ラベルに対する入金一覧</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>アドレスに対する入金一覧</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>日付</translation>
</message>
@@ -616,10 +663,74 @@ Address: %4
<translation>優先度をコピーする</translation>
</message>
<message>
+ <source>Copy dust</source>
+ <translation>ダストをコピーする</translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation>釣り銭をコピー</translation>
+ </message>
+ <message>
+ <source>highest</source>
+ <translation>最高</translation>
+ </message>
+ <message>
+ <source>higher</source>
+ <translation>非常に高</translation>
+ </message>
+ <message>
+ <source>high</source>
+ <translation>高</translation>
+ </message>
+ <message>
+ <source>medium-high</source>
+ <translation>中〜高</translation>
+ </message>
+ <message>
+ <source>medium</source>
+ <translation>中</translation>
+ </message>
+ <message>
+ <source>low-medium</source>
+ <translation>低〜中</translation>
+ </message>
+ <message>
+ <source>low</source>
+ <translation>低</translation>
+ </message>
+ <message>
+ <source>lower</source>
+ <translation>非常に低</translation>
+ </message>
+ <message>
+ <source>lowest</source>
+ <translation>最低</translation>
+ </message>
+ <message>
+ <source>(%1 locked)</source>
+ <translation>(%1 がロック済み)</translation>
+ </message>
+ <message>
<source>none</source>
<translation>なし</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>トランザクションのサイズが1000バイトを超える場合にはこのラベルは赤色になります。</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>優先度が「中」未満の場合、このラベルは赤色になります。</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>受取人のうち誰かの受取額が %1 未満の場合にこのラベルは赤色になります。</translation>
+ </message>
+ <message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation>ひとつの入力につき %1 satoshi 前後ずれることがあります。</translation>
+ </message>
+ <message>
<source>yes</source>
<translation>はい</translation>
</message>
@@ -628,14 +739,30 @@ Address: %4
<translation>いいえ</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>優先度が「中」未満の場合には、このラベルは赤くなります。</translation>
+ <source>This means a fee of at least %1 per kB is required.</source>
+ <translation>これは少なくとも1kBあたり %1 の手数料が必要であることを意味します。</translation>
+ </message>
+ <message>
+ <source>Can vary +/- 1 byte per input.</source>
+ <translation>ひとつの入力につき1バイト程度ずれることがあります。</translation>
+ </message>
+ <message>
+ <source>Transactions with higher priority are more likely to get included into a block.</source>
+ <translation>より高い優先度を持つトランザクションの方がブロックに取り込まれやすくなります。</translation>
</message>
<message>
<source>(no label)</source>
<translation>(ラベル無し)</translation>
</message>
- </context>
+ <message>
+ <source>change from %1 (%2)</source>
+ <translation>%1 (%2) からのおつり</translation>
+ </message>
+ <message>
+ <source>(change)</source>
+ <translation>(おつり)</translation>
+ </message>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -647,6 +774,14 @@ Address: %4
<translation>ラベル(&amp;L)</translation>
</message>
<message>
+ <source>The label associated with this address list entry</source>
+ <translation>このアドレス帳項目に結びつけられているラベル</translation>
+ </message>
+ <message>
+ <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
+ <translation>このアドレス帳項目に結びつけられているアドレス。この項目は送金用アドレスの場合のみ編集することができます。</translation>
+ </message>
+ <message>
<source>&amp;Address</source>
<translation>アドレス帳 (&amp;A)</translation>
</message>
@@ -717,6 +852,10 @@ Address: %4
<translation>バージョン</translation>
</message>
<message>
+ <source>(%1-bit)</source>
+ <translation>(%1ビット)</translation>
+ </message>
+ <message>
<source>About Bitcoin Core</source>
<translation>Bitcoinコアについて</translation>
</message>
@@ -732,26 +871,6 @@ Address: %4
<source>command-line options</source>
<translation>コマンドライン オプション</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI オプション</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>言語設定 例: "de_DE" (初期値: システムの言語)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>最小化された状態で起動する</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>起動時にスプラッシュ画面を表示する (初期値: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>起動時にデータ ディレクトリを選ぶ (初期値: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -764,6 +883,14 @@ Address: %4
<translation>ようこそ!</translation>
</message>
<message>
+ <source>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</source>
+ <translation>これはプログラム最初の起動です。Bitcoin Coreがデータを保存する場所を選択して下さい。</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source>
+ <translation>Bitcoin Coreは、ビットコインのブロックチェーンのコピーを、ダウンロードして保存します。少なくとも%1ギガバイトのデータが、このディレクトリに保存されます。そしてそれは時間と共に増加します。またウォレットもこのディレクトリに保存されます。</translation>
+ </message>
+ <message>
<source>Use the default data directory</source>
<translation>初期値のデータ ディレクトリを使用</translation>
</message>
@@ -776,6 +903,10 @@ Address: %4
<translation>Bitcoin のコア</translation>
</message>
<message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation>エラー: 指定のデータディレクトリ "%1" を作成できません。</translation>
+ </message>
+ <message>
<source>Error</source>
<translation>エラー</translation>
</message>
@@ -822,14 +953,6 @@ Address: %4
<translation>メイン (&amp;M)</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>システムにログインした時に自動的に Bitcoin を起動します。</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>システムにログインした時に Bitcoin を起動 (&amp;S)</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>データベースキャッシュのサイズ (&amp;D)</translation>
</message>
@@ -846,10 +969,34 @@ Address: %4
<translation>外部からの接続を許可する</translation>
</message>
<message>
+ <source>Allow incoming connections</source>
+ <translation>外部からの接続を許可する</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation>プロキシのIPアドレス (例えば IPv4: 127.0.0.1 / IPv6: ::1)</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>ウィンドウを閉じる際にアプリケーションを終了するのではなく、最小化します。このオプションが有効化された場合、メニューから終了を選択した場合にのみアプリケーションは閉じられます。</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>ユーザ・インタフェイス言語はここで設定できます。この設定はBitcoin Coreの再起動後に有効となります。</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>トランザクションタブのコンテキストメニュー項目に表示する、サードパーティURL (例えばブロックエクスプローラ)。URL中の%sはトランザクションのハッシュ値に置き換えられます。垂直バー | で区切ることで、複数のURLを指定できます。</translation>
+ </message>
+ <message>
+ <source>Third party transaction URLs</source>
+ <translation>サードパーティのトランザクションURL</translation>
+ </message>
+ <message>
+ <source>Active command-line options that override above options:</source>
+ <translation>上のオプションを置き換えることのできる、有効なコマンドラインオプションの一覧:</translation>
+ </message>
+ <message>
<source>Reset all client options to default.</source>
<translation>すべてのオプションを初期値に戻します。</translation>
</message>
@@ -862,6 +1009,18 @@ Address: %4
<translation>ネットワーク (&amp;N)</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>システムにログインした際、自動的にBitcoin Coreを起動する。</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>システムへログインした際にBitcoin Coreを起動する (&amp;S)</translation>
+ </message>
+ <message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation>(0 = 自動、0以上 = 指定した数のコアをフリーにする)</translation>
+ </message>
+ <message>
<source>W&amp;allet</source>
<translation>ウォレット (&amp;A)</translation>
</message>
@@ -874,6 +1033,14 @@ Address: %4
<translation>コインコントロール機能を有効化する (&amp;C)</translation>
</message>
<message>
+ <source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
+ <translation>未検証のおつりの使用を無効化すると、トランザクションが少なくとも1検証を獲得するまではそのトランザクションのおつりは利用できなくなります。これは残高の計算方法にも影響します。</translation>
+ </message>
+ <message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation>未検証のおつりを使用する (&amp;S)</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>自動的にルーター上の Bitcoin クライアントのポートを開きます。あなたのルーターが UPnP に対応していて、それが有効になっている場合に作動します。</translation>
</message>
@@ -882,6 +1049,14 @@ Address: %4
<translation>UPnP を使ってポートを割り当てる (&amp;U)</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>SOCKS5 プロキシ経由でBitcoinネットワークに接続する</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>SOCKS5 プロキシ経由で接続する (デフォルトプロキシ): (&amp;C)</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>プロキシの IP (&amp;I) :</translation>
</message>
@@ -906,10 +1081,6 @@ Address: %4
<translation>タスクバーの代わりにトレイに最小化 (&amp;M)</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 Quit in the menu.</source>
- <translation>ウインドウが閉じられる時アプリケーションを終了せずに最小化します。このオプションが有効な時にアプリケーションを終了するにはメニューから終了を選択します。</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>閉じる時に最小化 (&amp;i)</translation>
</message>
@@ -922,10 +1093,6 @@ Address: %4
<translation>ユーザインターフェースの言語 (&amp;l) :</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>ここでユーザインターフェースの言語を設定できます。設定を反映するには Bitcoin を再起動します。</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>額を表示する単位 (&amp;U) :</translation>
</message>
@@ -934,6 +1101,10 @@ Address: %4
<translation>インターフェース上の表示とコインの送信で使用する単位を選択します。</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation>コインコントロール機能を表示するかどうか。</translation>
+ </message>
+ <message>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
@@ -954,6 +1125,18 @@ Address: %4
<translation>オプションのリセットの確認</translation>
</message>
<message>
+ <source>Client restart required to activate changes.</source>
+ <translation>変更を有効化するにはクライアントを再起動する必要があります。</translation>
+ </message>
+ <message>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>クライアントを終了します。続行してもよろしいですか?</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation>この変更はクライアントの再起動が必要です。</translation>
+ </message>
+ <message>
<source>The supplied proxy address is invalid.</source>
<translation>プロキシアドレスが無効です。</translation>
</message>
@@ -969,10 +1152,22 @@ Address: %4
<translation>表示された情報は古いかもしれません。接続が確立されると、あなたのウォレットは Bitcoin ネットワークと自動的に同期しますが、このプロセスはまだ完了していません。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation>監視限定:</translation>
+ </message>
+ <message>
+ <source>Available:</source>
+ <translation>利用可能:</translation>
+ </message>
+ <message>
<source>Your current spendable balance</source>
<translation>あなたの利用可能残高</translation>
</message>
<message>
+ <source>Pending:</source>
+ <translation>検証待ち:</translation>
+ </message>
+ <message>
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
<translation>未検証の取引で利用可能残高に反映されていない数</translation>
</message>
@@ -985,6 +1180,10 @@ Address: %4
<translation>完成していない採掘された残高</translation>
</message>
<message>
+ <source>Balances</source>
+ <translation>残高</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation>合計:</translation>
</message>
@@ -993,16 +1192,28 @@ Address: %4
<translation>あなたの現在の残高</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation>監視限定アドレス内の現在の残高</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation>使用可能:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation>最近のトランザクション</translation>
</message>
<message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation>監視限定アドレスに対する未検証のトランザクション</translation>
+ </message>
+ <message>
<source>Mined balance in watch-only addresses that has not yet matured</source>
<translation>ウォッチオンリーアドレスの採掘された残高のうち、成熟していないもの</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>同期していない</translation>
+ <source>Current total balance in watch-only addresses</source>
+ <translation>監視限定アドレス内の現在の全残高</translation>
</message>
</context>
<context>
@@ -1020,8 +1231,16 @@ Address: %4
<translation>支払い要求は拒否されました</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>支払いのリクエストは期限切れです</translation>
+ <source>Payment request network doesn't match client network.</source>
+ <translation>支払いリクエストのネットワークは現在のクライアントのネットワークに一致しません。</translation>
+ </message>
+ <message>
+ <source>Payment request is not initialized.</source>
+ <translation>支払いリクエストは開始されていません。</translation>
+ </message>
+ <message>
+ <source>Requested payment amount of %1 is too small (considered dust).</source>
+ <translation>要求された支払額 %1 は少なすぎます (ダストとみなされてしまいます)。</translation>
</message>
<message>
<source>Payment request error</source>
@@ -1032,10 +1251,54 @@ Address: %4
<translation>Bitcoin を起動できません: click-to-pay handler</translation>
</message>
<message>
+ <source>Payment request fetch URL is invalid: %1</source>
+ <translation>支払い要求の取得先URLが無効です: %1</translation>
+ </message>
+ <message>
+ <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation>URI を解析できません! これは無効な Bitcoin アドレスあるいや不正な形式の URI パラメーターによって引き起こされる場合があります。</translation>
+ </message>
+ <message>
+ <source>Payment request file handling</source>
+ <translation>支払いリクエストファイルを処理しています</translation>
+ </message>
+ <message>
+ <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
+ <translation>支払いリクエストファイルを読み込めませんでした!無効な支払いリクエストファイルにより引き起こされた可能性があります。</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>支払いリクエストの期限が切れました。</translation>
+ </message>
+ <message>
+ <source>Unverified payment requests to custom payment scripts are unsupported.</source>
+ <translation>カスタム支払いスクリプトに対する、検証されていない支払いリクエストはサポートされていません。</translation>
+ </message>
+ <message>
+ <source>Invalid payment request.</source>
+ <translation>無効な支払いリクエスト。</translation>
+ </message>
+ <message>
+ <source>Refund from %1</source>
+ <translation>%1 からの返金</translation>
+ </message>
+ <message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>支払リクエスト %1 は大きすぎます(%2バイトですが、%3バイトまでが許されています)。</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>支払リクエストDoS保護</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>%1: %2とコミュニケーション・エラーです</translation>
</message>
<message>
+ <source>Payment request cannot be parsed!</source>
+ <translation>支払リクエストを読み込めませんでした!</translation>
+ </message>
+ <message>
<source>Bad response from server %1</source>
<translation>サーバーの返事は無効 %1</translation>
</message>
@@ -1054,7 +1317,15 @@ Address: %4
<source>User Agent</source>
<translation>ユーザエージェント</translation>
</message>
- </context>
+ <message>
+ <source>Node/Service</source>
+ <translation>ノード・サービス</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Ping時間</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -1062,6 +1333,14 @@ Address: %4
<translation>総額</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation>Bitcoinアドレスを入力してください (例 %1)</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation>%1日</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation>%1 h</translation>
</message>
@@ -1070,10 +1349,22 @@ Address: %4
<translation>%1 m</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation>%1秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>なし</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
- </context>
+ <message>
+ <source>%1 ms</source>
+ <translation>%1ミリ秒</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1116,10 +1407,18 @@ Address: %4
<translation>デバッグ ウインドウ</translation>
</message>
<message>
+ <source>General</source>
+ <translation>一般</translation>
+ </message>
+ <message>
<source>Using OpenSSL version</source>
<translation>使用中の OpenSSL のバージョン</translation>
</message>
<message>
+ <source>Using BerkeleyDB version</source>
+ <translation>使用中のBerkleyDBバージョン</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>起動した日時</translation>
</message>
@@ -1144,10 +1443,82 @@ Address: %4
<translation>現在のブロック数</translation>
</message>
<message>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>現在のデータディレクトリからBitcoin Coreのデバッグ用ログファイルを開きます。ログファイルが巨大な場合、数秒かかることがあります。</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <translation>受取</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation>送金</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation>ピア (&amp;P)</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>詳しい情報を見たいピアを選択してください。</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <translation>方向</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation>バージョン</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation>ユーザエージェント</translation>
</message>
<message>
+ <source>Services</source>
+ <translation>サービス</translation>
+ </message>
+ <message>
+ <source>Starting Height</source>
+ <translation>開始時のブロック高</translation>
+ </message>
+ <message>
+ <source>Sync Height</source>
+ <translation>同期済みブロック高</translation>
+ </message>
+ <message>
+ <source>Ban Score</source>
+ <translation>Banスコア</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation>接続時間</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation>最終送信</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation>最終受信</translation>
+ </message>
+ <message>
+ <source>Bytes Sent</source>
+ <translation>送信済バイト数</translation>
+ </message>
+ <message>
+ <source>Bytes Received</source>
+ <translation>受信済バイト数</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Ping時間</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation>時間オフセット</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>最終ブロックの日時</translation>
</message>
@@ -1188,16 +1559,12 @@ Address: %4
<translation>デバッグ用ログファイル</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>現在のデータ ディレクトリから Bitcoin のデバッグ用ログファイルを開きます。ログファイルが大規模な場合には数秒かかることがあります。</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>コンソールをクリア</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bitcoin RPC コンソールへようこそ。</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Bitcoin CoreのRPCコンソールへようこそ。</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
@@ -1223,7 +1590,31 @@ Address: %4
<source>%1 GB</source>
<translation>%1 GB</translation>
</message>
- </context>
+ <message>
+ <source>via %1</source>
+ <translation>%1経由</translation>
+ </message>
+ <message>
+ <source>never</source>
+ <translation>一度もなし</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <translation>内向き</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <translation>外向き</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>未知</translation>
+ </message>
+ <message>
+ <source>Fetching...</source>
+ <translation>取得中……</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
@@ -1239,6 +1630,30 @@ Address: %4
<translation>メッセージ (&amp;M):</translation>
</message>
<message>
+ <source>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</source>
+ <translation>以前利用した受取用アドレスのどれかを再利用します。アドレスの再利用はセキュリティおよびプライバシーにおいて問題があります。以前作成した支払リクエストを再生成するとき以外は利用しないでください。</translation>
+ </message>
+ <message>
+ <source>R&amp;euse an existing receiving address (not recommended)</source>
+ <translation>既存の受取用アドレスを再利用する (非推奨) (&amp;E)</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>支払リクエストが開始された時に表示される、支払リクエストに添える任意のメッセージです。注意:メッセージはBitcoinネットワークを通じて、支払と共に送られるわけではありません。</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation>受取用アドレスに紐づく任意のラベル。</translation>
+ </message>
+ <message>
+ <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
+ <translation>このフォームを使用して支払のリクエストを行いましょう。すべての項目は&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>リクエストする任意の金額。特定の金額をリクエストするのでない場合には、この欄は空白のままかゼロにしてください。</translation>
+ </message>
+ <message>
<source>Clear all fields of the form.</source>
<translation>全ての入力項目をクリア</translation>
</message>
@@ -1247,6 +1662,18 @@ Address: %4
<translation>クリア</translation>
</message>
<message>
+ <source>Requested payments history</source>
+ <translation>支払リクエスト履歴</translation>
+ </message>
+ <message>
+ <source>&amp;Request payment</source>
+ <translation>支払をリクエストする (&amp;R)</translation>
+ </message>
+ <message>
+ <source>Show the selected request (does the same as double clicking an entry)</source>
+ <translation>選択されたリクエストを表示する(項目をダブルクリックすることでも表示できます)</translation>
+ </message>
+ <message>
<source>Show</source>
<translation>表示</translation>
</message>
@@ -1255,6 +1682,10 @@ Address: %4
<translation>リストから選択項目を削除</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation>削除</translation>
+ </message>
+ <message>
<source>Copy label</source>
<translation>ラベルをコピーする</translation>
</message>
@@ -1344,7 +1775,15 @@ Address: %4
<source>(no label)</source>
<translation>(ラベル無し)</translation>
</message>
- </context>
+ <message>
+ <source>(no message)</source>
+ <translation>(メッセージなし)</translation>
+ </message>
+ <message>
+ <source>(no amount)</source>
+ <translation>(金額なし)</translation>
+ </message>
+</context>
<context>
<name>SendCoinsDialog</name>
<message>
@@ -1392,6 +1831,86 @@ Address: %4
<translation>手数料差引後:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation>釣り銭:</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>これが有効にもかかわらずおつりアドレスが空欄であったり無効であった場合には、おつりは新しく生成されたアドレスへ送金されます。</translation>
+ </message>
+ <message>
+ <source>Custom change address</source>
+ <translation>カスタムおつりアドレス</translation>
+ </message>
+ <message>
+ <source>Transaction Fee:</source>
+ <translation>トランザクション手数料:</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>選択……</translation>
+ </message>
+ <message>
+ <source>collapse fee-settings</source>
+ <translation>手数料設定を折りたたむ</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>1キロバイトあたり手数料</translation>
+ </message>
+ <message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>カスタム手数料が1000satoshiに設定されている場合、トランザクションサイズが250バイトとすると、「1キロバイトあたり手数料」では250satoshiの手数料のみを支払いますが、「最小手数料」では1000satoshiを支払います。1キロバイトを超えるトランザクションの場合には、どちらの方法を選択したとしても1キロバイトあたりで支払われます。</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation>隠す</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>最小手数料</translation>
+ </message>
+ <message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>ブロックの容量に比べてトランザクション流量が少ないうちは最小手数料のみの支払で十分です。しかしながらネットワークが処理しきれないほどbitcoinトランザクションの需要がひとたび生まれてしまった場合には、永遠に検証がされないトランザクションになってしまう可能性があることに注意してください。</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(ツールチップをお読みください)</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>推奨:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>カスタム:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(スマート手数料はまだ初期化されていません。これにはおおよそ数ブロックほどかかります……)</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>検証時間:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>普通</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>高速</translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>可能な場合には手数料ゼロのトランザクションとして送金する</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(検証に長い時間がかかる可能性があります)</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>一度に複数の人に送る</translation>
</message>
@@ -1404,6 +1923,10 @@ Address: %4
<translation>全ての入力項目をクリア</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>ダスト:</translation>
+ </message>
+ <message>
<source>Clear &amp;All</source>
<translation>すべてクリア (&amp;A)</translation>
</message>
@@ -1424,6 +1947,10 @@ Address: %4
<translation>コインを送る確認</translation>
</message>
<message>
+ <source>%1 to %2</source>
+ <translation>%1 から %2</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation>数量をコピーする</translation>
</message>
@@ -1448,8 +1975,16 @@ Address: %4
<translation>優先度をコピーする</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>受取人のアドレスが不正です。再確認してください。</translation>
+ <source>Copy change</source>
+ <translation>釣り銭をコピー</translation>
+ </message>
+ <message>
+ <source>Total Amount %1 (= %2)</source>
+ <translation>総送金額 %1 (= %2)</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation>または</translation>
</message>
<message>
<source>The amount to pay must be larger than 0.</source>
@@ -1464,14 +1999,54 @@ Address: %4
<translation>%1 の取引手数料を含めると額が残高を超えています。</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>重複しているアドレスが見つかりました。1回の送信で同じアドレスに送ることは出来ません。</translation>
+ <source>Transaction creation failed!</source>
+ <translation>トラザクションの作成に失敗しました!</translation>
+ </message>
+ <message>
+ <source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
+ <translation>トランザクションは拒否されました。wallet.dat のコピーを使い、そしてコピーしたウォレットからコインを使用したことがマークされなかったときなど、ウォレットのいくつかのコインがすでに使用されている場合に、このエラーは起こるかもしれません。</translation>
+ </message>
+ <message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation>%1 よりも高い手数料の場合、手数料が高すぎると判断されます。</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>支払いリクエストの期限が切れました。</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation><numerusform>%n ブロック以内に検証が開始されると予想されます。</numerusform></translation>
+ </message>
+ <message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>最小手数料 %1 のみを支払う</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>受取アドレスが不正です。再チェックしてください。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation>重複したアドレスが見つかりました: アドレスはそれぞれ一度のみ使用することができます。</translation>
+ </message>
+ <message>
+ <source>Warning: Invalid Bitcoin address</source>
+ <translation>警告:無効なBitcoinアドレスです</translation>
</message>
<message>
<source>(no label)</source>
<translation>(ラベル無し)</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation>警告:未知のおつりアドレスです</translation>
+ </message>
+ <message>
+ <source>Copy dust</source>
+ <translation>ダストをコピーする</translation>
+ </message>
+ <message>
<source>Are you sure you want to send?</source>
<translation>送ってよろしいですか?</translation>
</message>
@@ -1503,6 +2078,14 @@ Address: %4
<translation>前に使用したアドレスを選ぶ</translation>
</message>
<message>
+ <source>This is a normal payment.</source>
+ <translation>これは通常の支払です。</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation>支払の送金先Bitcoinアドレス</translation>
+ </message>
+ <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1515,10 +2098,38 @@ Address: %4
<translation>Alt+P</translation>
</message>
<message>
+ <source>Remove this entry</source>
+ <translation>この項目を削除する</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>送金する金額から手数料が差し引かれます。受取人は数量フィールドで指定した量よりも少ないビットコインを受け取ります。受取人が複数いる場合には、手数料は均等割されます。</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation>送金額から手数料を差し引く (&amp;U)</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>メッセージ:</translation>
</message>
<message>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>これは未認証の支払いリクエストです。</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>これは認証済みの支払いリクエストです。</translation>
+ </message>
+ <message>
+ <source>Enter a label for this address to add it to the list of used addresses</source>
+ <translation>このアドレスに対するラベルを入力することで、使用済みアドレスの一覧に追加することができます</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>bitcoin: URIに添付されていたメッセージです。これは参照用としてトランザクションとともに保存されます。注意:このメッセージはBitcoinネットワークを通して送信されるわけではありません。</translation>
+ </message>
+ <message>
<source>Pay To:</source>
<translation>支払先:</translation>
</message>
@@ -1549,8 +2160,12 @@ Address: %4
<translation>メッセージの署名 (&amp;S)</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>あなた自身を立証するためにあなたのアドレスでメッセージに署名することができます。フィッシング攻撃によってあなたを騙して署名を譲渡させようとするかもしれないので、不明確なものは絶対に署名しないように注意してください。あなたが同意する完全に詳細な声明にだけ署名してください。</translation>
+ <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>あなたの所有しているアドレスによりメッセージや合意書に署名をすることで、それらアドレスに対して送られたビットコインを受け取ることができることを証明できます。フィッシング攻撃により不正にあなたの識別情報を署名させられてしまうことを防ぐために、不明確なものやランダムなものに対して署名しないよう注意してください。合意することが可能な、よく詳細の記された文言にのみ署名するようにしてください。</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation>メッセージを署名するBitcoinアドレス</translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -1601,8 +2216,12 @@ Address: %4
<translation>メッセージの検証 (&amp;V)</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>メッセージを検証するために、署名するアドレスとメッセージ(改行、スペース、タブなどを正確にコピーしてください)、そして署名を入力します。中間者攻撃によってだまされることを避けるために、署名されたメッセージそのものよりも、署名を読み取られないように注意してください。</translation>
+ <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>受取人のアドレスとメッセージ(改行やスペース、タブなども完全に一致するよう注意してください)および署名を以下に入力し、メッセージの署名を検証してください。中間者攻撃により騙されるのを防ぐため、署名対象のメッセージに書かれていること以上の意味を署名から読み取ろうとしないよう注意してください。これは署名作成者がこのアドレスで受け取ったことを証明するだけであり、トランザクションの送信権限を証明するものではないことに注意してください!</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation>メッセージの署名に使われたBitcoinアドレス</translation>
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
@@ -1698,6 +2317,10 @@ Address: %4
<translation>ユニット %1 を開く</translation>
</message>
<message>
+ <source>conflicted</source>
+ <translation>衝突</translation>
+ </message>
+ <message>
<source>%1/offline</source>
<translation>%1/オフライン</translation>
</message>
@@ -1742,6 +2365,10 @@ Address: %4
<translation>自分のアドレス</translation>
</message>
<message>
+ <source>watch-only</source>
+ <translation>監視限定</translation>
+ </message>
+ <message>
<source>label</source>
<translation>ラベル</translation>
</message>
@@ -1762,6 +2389,14 @@ Address: %4
<translation>引き落とし額</translation>
</message>
<message>
+ <source>Total debit</source>
+ <translation>総出金額</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation>総入金額</translation>
+ </message>
+ <message>
<source>Transaction fee</source>
<translation>取引手数料</translation>
</message>
@@ -1786,6 +2421,10 @@ Address: %4
<translation>商人</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>生成されたコインは使う前に%1のブロックを完成させる必要があります。あなたが生成した時、このブロックはブロック チェーンに追加されるネットワークにブロードキャストされました。チェーンに追加されるのが失敗した場合、状態が"不承認"に変更されて使えなくなるでしょう。これは、別のノードがあなたの数秒前にブロックを生成する場合に時々起こるかもしれません。</translation>
+ </message>
+ <message>
<source>Debug information</source>
<translation>デバッグ情報</translation>
</message>
@@ -1844,8 +2483,8 @@ Address: %4
<translation>タイプ</translation>
</message>
<message>
- <source>Address</source>
- <translation>Helbidea</translation>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation>未成熟(%1検証。%2検証完了後に使用可能となります)</translation>
</message>
<message numerus="yes">
<source>Open for %n more block(s)</source>
@@ -1872,10 +2511,22 @@ Address: %4
<translation>オフライン</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>ラベル</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>未検証</translation>
</message>
<message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation>検証中(%2の推奨検証数のうち、%1検証が完了)</translation>
+ </message>
+ <message>
+ <source>Conflicted</source>
+ <translation>衝突</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>受信元</translation>
</message>
@@ -1896,6 +2547,10 @@ Address: %4
<translation>発掘した</translation>
</message>
<message>
+ <source>watch-only</source>
+ <translation>監視限定</translation>
+ </message>
+ <message>
<source>(n/a)</source>
<translation>(n/a)</translation>
</message>
@@ -1912,8 +2567,12 @@ Address: %4
<translation>取引の種類。</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>取引の宛先アドレス。</translation>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation>監視限定アドレスがこのトランザクションに含まれているかどうか</translation>
+ </message>
+ <message>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation>ユーザ定義のトランザクションの意図や目的。</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2007,6 +2666,10 @@ Address: %4
<translation>トランザクション履歴をエクスポートする</translation>
</message>
<message>
+ <source>Watch-only</source>
+ <translation>監視限定</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation>エクスポートに失敗しました</translation>
</message>
@@ -2019,6 +2682,10 @@ Address: %4
<translation>エクスポートに成功しました</translation>
</message>
<message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation>トランザクション履歴は正常に%1に保存されました。</translation>
+ </message>
+ <message>
<source>Comma separated file (*.csv)</source>
<translation>テキスト CSV (*.csv)</translation>
</message>
@@ -2057,7 +2724,11 @@ Address: %4
</context>
<context>
<name>UnitDisplayStatusBarControl</name>
- </context>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>金額を表示する際の単位。クリックすることで他の単位を選択します。</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2095,6 +2766,14 @@ Address: %4
<translation>バックアップに失敗しました</translation>
</message>
<message>
+ <source>There was an error trying to save the wallet data to %1.</source>
+ <translation>ウォレットデータを%1へ保存する際にエラーが発生しました。</translation>
+ </message>
+ <message>
+ <source>The wallet data was successfully saved to %1.</source>
+ <translation>ウォレット データは正常に%1に保存されました。</translation>
+ </message>
+ <message>
<source>Backup Successful</source>
<translation>バックアップ成功</translation>
</message>
@@ -2134,49 +2813,54 @@ Address: %4
<translation>外部からの接続を許可 (初期値: -proxy または -connect を使用していない場合は1)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, rpcpassword を設定ファイルで設定してください:
-%s
-下記のランダムなパスワードの使用を推奨します:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(このパスワードを覚える必要はありません)
-ユーザー名とパスワードが同じであってはいけません。
-もしもファイルが存在しないなら、所有者だけが読み取れる権限で作成してください。
-また、問題が通知されるように alertnotify を設定することをお勧めします;
-例えば: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>指定のアドレスへバインドし、その上で常にリスンします。IPv6 は [ホスト名]:ポート番号 と表記します</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>エラー: 取引は拒否されました。wallet.dat のコピーを使い、そしてコピーしたウォレットからコインを使用したことがマークされなかったときなど、ウォレットのいくつかのコインがすでに使用されている場合に、このエラーは起こるかもしれません。</translation>
+ <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default: %u)</source>
+ <translation>継続的に無料トランザクションのレートを一分間に&lt;n&gt;*1000バイトに制限する (規定値: %u)</translation>
+ </message>
+ <message>
+ <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
+ <translation>ウォレットの全トランザクションを削除し、これらを-rescanオプションを用いることで起動時にブロックチェインのデータのみからリカバリします。</translation>
</message>
<message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>エラー: この取引は、額、複雑さ、あるいは最近受け取った資金の使用のために、少なくとも %s の手数料が必要です!</translation>
+ <source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
+ <translation>MITソフトウェアライセンスのもとで配布されています。付属のCOPYINGファイルまたは&lt;http://www.opensource.org/licenses/mit-license.php&gt;を参照してください。</translation>
+ </message>
+ <message>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>ブロックを瞬時に解決することができる特別なチェーンを使用して、リグレッションテストモードに入る。</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>ウォレットの取引を変更する際にコマンドを実行 (cmd の %s は TxID に置換される)</translation>
</message>
<message>
+ <source>In this mode -genproclimit controls how many blocks are generated immediately.</source>
+ <translation>このモードでは -genproclimit は何個のブロックをただちに生成するのか制御します。</translation>
+ </message>
+ <message>
+ <source>Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>ひとつのウォレットトランザクションで使用する合計手数料の最大値。低すぎる値を指定すると巨大なトランザクションの作成ができなくなります (規定値: %s)</translation>
+ </message>
+ <message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, &gt;%u = target size in MiB to use for block files)</source>
+ <translation>古いブロックを剪定する(削除する)ことで記憶容量の必要量を削減する。このモードを有効にするとウォレット機能のサポートは無効になり、-txindexとも互換性がなくなります。警告: この設定の再有効化には全ブロックチェインの再ダウンロードが必要となります。(規定値: 0 = ブロックの剪定無効、&gt;%u = ブロックファイルに使用するMiB単位の目標サイズ)</translation>
+ </message>
+ <message>
+ <source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
+ <translation>スクリプト検証スレッドを設定 (%uから%dの間, 0 = 自動, &lt;0 = たくさんのコアを自由にしておく, 初期値: %d)</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>これはリリース前のテストビルドです - 各自の責任で利用すること - 採掘や商取引に使用しないでください</translation>
</message>
<message>
+ <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
+ <translation>このコンピュータの %s にバインドすることができません。おそらく Bitcoin Core は既に実行されています。</translation>
+ </message>
+ <message>
<source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
<translation>警告: -paytxfee が非常に高く設定されています! これは取引を送信する場合に支払う取引手数料です。</translation>
</message>
@@ -2197,10 +2881,18 @@ rpcpassword=%s
<translation>警告: wallet.dat が壊れたのでデータを復旧しました! オリジナルの wallet.dat は wallet.{timestamp}.bak として %s に保存されました; もしもあなたの残高や取引が正しくないならバックアップから復元してください。</translation>
</message>
<message>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>与えられたネットマスクやIPアドレスから接続を行う、ホワイトリストのピア。複数回指定できます。</translation>
+ </message>
+ <message>
<source>(default: 1)</source>
<translation>(デフォルト: 1)</translation>
</message>
<message>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;category&gt;は以下の値を指定できます:</translation>
+ </message>
+ <message>
<source>Attempt to recover private keys from a corrupt wallet.dat</source>
<translation>壊れた wallet.dat から秘密鍵を復旧することを試す</translation>
</message>
@@ -2213,6 +2905,10 @@ rpcpassword=%s
<translation>指定したノードだけに接続</translation>
</message>
<message>
+ <source>Connection options:</source>
+ <translation>接続オプション:</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>破損したブロック データベースが見つかりました
</translation>
@@ -2222,8 +2918,8 @@ rpcpassword=%s
<translation>デバッグ/テスト用オプション:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>自分の IP アドレスを発見 (初期値: リスン中と -externalip を使用していない場合は1)</translation>
+ <source>Do not load the wallet and disable wallet RPC calls</source>
+ <translation>ウォレットは読み込まず、ウォレットRPCコールを無効化する</translation>
</message>
<message>
<source>Do you want to rebuild the block database now?</source>
@@ -2246,12 +2942,12 @@ rpcpassword=%s
<translation>ブロック データベースの開始エラー</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>エラー: ディスク容量不足!</translation>
+ <source>Error: A fatal internal error occured, see debug.log for details</source>
+ <translation>エラー:致命的な内部エラーが発生しました。詳細はdebug.logを参照してください</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>エラー: ウォレットはロックされ、取引を作成できません!</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>エラー: ディスク容量不足!</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
@@ -2262,22 +2958,54 @@ rpcpassword=%s
<translation>&lt;category&gt; が与えられなかった場合には、すべてのデバッグ情報が出力されます。</translation>
</message>
<message>
+ <source>Importing...</source>
+ <translation>インポートしています……</translation>
+ </message>
+ <message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
<translation>不正なブロックあるいは、生成されていないブロックが見つかりました。ネットワークの datadir が間違っていませんか?</translation>
</message>
<message>
+ <source>Invalid -onion address: '%s'</source>
+ <translation>無効な -onion アドレス:'%s'</translation>
+ </message>
+ <message>
<source>Not enough file descriptors available.</source>
<translation>使用可能なファイルディスクリプタが不足しています。</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>現在の blk000??.dat ファイルからブロック チェーンのインデックスを再構築</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>&lt;net&gt; (ipv4, ipv6 または onion) ネットワーク内のノードだけに接続する</translation>
+ </message>
+ <message>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>剪定値は負の値に設定できません。</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>剪定モードは-txindexと互換性がありません。</translation>
+ </message>
+ <message>
+ <source>Set database cache size in megabytes (%d to %d, default: %d)</source>
+ <translation>データベースのキャッシュサイズをメガバイトで設定 (%dから%d。初期値: %d)</translation>
+ </message>
+ <message>
+ <source>Set maximum block size in bytes (default: %d)</source>
+ <translation>最大ブロックサイズをバイトで設定 (初期値: %d)</translation>
</message>
<message>
<source>Specify wallet file (within data directory)</source>
<translation>ウォレットのファイルを指定 (データ・ディレクトリの中に)</translation>
</message>
<message>
+ <source>This is intended for regression testing tools and app development.</source>
+ <translation>これはリグレッションテストツールやアプリ開発のためのものです。</translation>
+ </message>
+ <message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>リッスンポートの割当に UPnP を使用 (初期値: %u)</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>ブロックの検証中...</translation>
</message>
@@ -2290,6 +3018,14 @@ rpcpassword=%s
<translation>財布 %s はデータ・ディレクトリ%sの外にあります</translation>
</message>
<message>
+ <source>Wallet options:</source>
+ <translation>ウォレットオプション:</translation>
+ </message>
+ <message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>警告: このバージョンはサポートされません。アップグレードが必要です!</translation>
+ </message>
+ <message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>-txindex を変更するには -reindex を使用してデータベースを再構築する必要があります</translation>
</message>
@@ -2298,14 +3034,206 @@ rpcpassword=%s
<translation>外部の blk000??.dat ファイルからブロックをインポート</translation>
</message>
<message>
+ <source>Allow JSON-RPC connections from specified source. Valid for &lt;ip&gt; are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
+ <translation>指定したアクセス元からのJSON-RPC接続を許可する。有効な&lt;ip&gt;は、単一のIP (例 1.2.3.4)、ネットワーク/ネットマスク (1.2.3.4/255.255.255.0)、またはネットワーク/CIDR (1.2.3.4/24)です。このオプションは複数回指定できます。</translation>
+ </message>
+ <message>
+ <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source>
+ <translation>リッスンする RPC アドレス %s、ポート %u の設定中にエラーが発生しました: %s</translation>
+ </message>
+ <message>
+ <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source>
+ <translation>指定されたアドレスおよび、そこに接続を行ってきたホワイトリストのピアに対してバインドを行います。IPv6の場合には [host]:port 表記を使用してください</translation>
+ </message>
+ <message>
+ <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source>
+ <translation>指定されたアドレスに対して JSON-RPC 接続をリッスンしするようバインドします。IPv6の場合には [host]:port 表記を使用してください。このオプションは複数回指定することが可能です (初期値: すべてのインターフェースに対してバインドする)</translation>
+ </message>
+ <message>
+ <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
+ <translation>データ ディレクトリ %s のロックを取得することができません。おそらく Bitcoin Core は実行中です。</translation>
+ </message>
+ <message>
+ <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
+ <translation>umask 077 ではなく、システムのデフォルトパーミッションで新規ファイルを作成する (ウォレット機能が無効化されていた場合にのみ有効)</translation>
+ </message>
+ <message>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>自分のIPアドレスを解決する (規定値: リッスンをしており、-externalipまたは-proxyオプションが指定されていない場合は1)</translation>
+ </message>
+ <message>
+ <source>Error: Listening for incoming connections failed (listen returned error %s)</source>
+ <translation>エラー: 内向きの接続をリッスンするのに失敗しました (エラー %s が返却されました)</translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>エラー: サポートされていない引数 -socks が見つかりました。SOCKSバージョンの設定はできないようになりました。SOCKS5プロキシのみがサポートされています。</translation>
+ </message>
+ <message>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
<translation>関連のアラートをもらってもすごく長いのフォークを見てもコマンドを実行 (コマンドの中にあるの%sはメッセージから置き換えさせる)</translation>
</message>
<message>
+ <source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source>
+ <translation>中継の際、この値未満の手数料 (BTC/Kb単位) はゼロであるとみなす (デフォルト: %s)</translation>
+ </message>
+ <message>
+ <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>トランザクション作成の際、この値未満の手数料 (BTC/Kb単位) はゼロであるとみなす (デフォルト: %s)</translation>
+ </message>
+ <message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>paytxfee が設定されていなかった場合、平均して n ブロック以内にトランザクションが検証され始めるのに十分な手数料を含める (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>-maxtxfee=&lt;amount&gt; の数量の指定が不正です: '%s' (トランザクションが詰まってしまうのを防ぐため、少なくとも %s の最小中継手数料を指定しなければいけません)</translation>
+ </message>
+ <message>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>中継および採掘を行う際の、データ運送トランザクションの中のデータの最大サイズ (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MB. Please use a higher number.</source>
+ <translation>剪定が最小値の %d MB以下に設定されています。もっと大きな値を使用してください。</translation>
+ </message>
+ <message>
+ <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
+ <translation>保有するピアアドレスが少ない場合、DNS ルックアップによりピアアドレスを問い合わせる (-connect を使っていない場合の初期値: 1)</translation>
+ </message>
+ <message>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>認証情報をプロキシー接続ごとにランダム化する。これによりTorストリーム分離をすることができます (規定値: %u)</translation>
+ </message>
+ <message>
+ <source>Require high priority for relaying free or low-fee transactions (default: %u)</source>
+ <translation>無料や低い手数料のトランザクションのリレーに際し、高い優先度を要求する (規定値: %u)</translation>
+ </message>
+ <message>
+ <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
+ <translation>最優先/最低手数料の最大サイズをバイトで指定 (初期値: %d)</translation>
+ </message>
+ <message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>コイン生成が有効になっていた場合の利用スレッド数を設定する (-1 = すべてのコア, 初期値: %d)</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>手数料差引後のトランザクションの金額が小さすぎるため、送金できません。</translation>
+ </message>
+ <message>
+ <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
+ <translation>この製品はOpenSSLプロジェクトにより開発されたソフトウェアをOpenSSLツールキットとして利用しています &lt;https://www.openssl.org/&gt;。また、Eric Young氏により開発された暗号ソフトウェア、Thomas Bernard氏により書かれたUPnPソフトウェアを用いています。</translation>
+ </message>
+ <message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>bitcoindを用いる場合や、-server オプションをbitcoin-qtに指定する場合には、設定ファイルにrpcpasswordを設定しなければなりません:
+%s
+以下のランダムなパスワードを用いることが推奨されます:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(このパスワードを暗記する必要はありません)
+ユーザ名とパスワードは一致してはいけません。
+ファイルが存在しない場合には、所有者のみ読み込み可能なファイルパーミッションでファイルを作成してください。
+またalertnotifyを設定し、問題発生時に通知が行くようにすることをおすすめします;
+例: alertnotify=echo %%s | mail -s "Bitcoinアラート" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>警告: -maxtxfee が非常に高く設定されています!ひとつのトランザクションでこの量の手数料が支払われてしまうことがあります。</translation>
+ </message>
+ <message>
+ <source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
+ <translation>警告: あなたのPCの日付と時刻が正しいことを確認して下さい! もしあなたの時計が正しくなければBitcoin Coreが正確に動作しません。</translation>
+ </message>
+ <message>
+ <source>Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway</source>
+ <translation>ホワイトリストのピアはDoSによるアクセス禁止処理が無効化され、トランザクションは例えmempool内に既に存在していたとしても常にリレーされます。これは例えばゲートウェイに対して有用です</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>非剪定モードに戻るためには-reindexオプションを使用してデータベースを再構築する必要があります。これによりブロックチェイン全体の再ダウンロードが行われます。</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(規定値: %u)</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>公開 REST リクエストを許可する (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Activating best chain...</source>
+ <translation>最優良のチェインを有効化しています...</translation>
+ </message>
+ <message>
+ <source>Allow self signed root certificates (default: 0)</source>
+ <translation>自己署名ルート証明書を許可する (規定値: 0)</translation>
+ </message>
+ <message>
+ <source>Can't run with a wallet in prune mode.</source>
+ <translation>剪定モードではウォレット機能付きで起動できません。</translation>
+ </message>
+ <message>
+ <source>Cannot resolve -whitebind address: '%s'</source>
+ <translation>-whitebind アドレス '%s' を解決できません</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>起動時にデータ ディレクトリを選ぶ (初期値: 0)</translation>
+ </message>
+ <message>
+ <source>Connect through SOCKS5 proxy</source>
+ <translation>SOCKS5 プロキシ経由で接続する</translation>
+ </message>
+ <message>
+ <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
+ <translation>Copyright (C) 2009-%i Bitcoin Core 開発者</translation>
+ </message>
+ <message>
+ <source>Could not parse -rpcbind value %s as network address</source>
+ <translation>-rpcbind の値 %s をネットワークアドレスとして解釈できませんでした</translation>
+ </message>
+ <message>
+ <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
+ <translation>wallet.dat の読み込みに失敗しました: ウォレットの読み込みにはより新しいバージョンの Bitcoin Core が必要です</translation>
+ </message>
+ <message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>データベースの読み込みエラー。シャットダウンします。</translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -tor found, use -onion.</source>
+ <translation>エラー: サポートされていない引数 -tor が見つかりました。-onion を使用してください。</translation>
+ </message>
+ <message>
+ <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
+ <translation>送信するトランザクションに付加する手数料 (BTC/kB単位) (初期値: %s)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>情報</translation>
</message>
<message>
+ <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
+ <translation>初期化時の健全性チェックに失敗しました。Bitcoin Coreを終了します。</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>-maxtxfee=&lt;amount&gt; に対する無効な数量です: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>不正な額 -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
</message>
@@ -2314,6 +3242,26 @@ rpcpassword=%s
<translation>不正な額 -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation>-paytxfee=&lt;amount&gt; に対する無効な数量です: '%s' (少なくとも %s でなければいけません)</translation>
+ </message>
+ <message>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation>-whitelist に対する無効なネットマスクです: '%s'</translation>
+ </message>
+ <message>
+ <source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
+ <translation>最大で &lt;n&gt; 個の孤立したトランザクションをメモリの中に保持する (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Need to specify a port with -whitebind: '%s'</source>
+ <translation>-whitebind を用いてポートを指定する必要があります: '%s'</translation>
+ </message>
+ <message>
+ <source>Node relay options:</source>
+ <translation>ノード中継オプション:</translation>
+ </message>
+ <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>RPC SSL オプション: (SSLのセットアップ手順はビットコインWikiを参照してください)</translation>
</message>
@@ -2322,10 +3270,46 @@ rpcpassword=%s
<translation>RPCサーバのオプション:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>RPCにおけるHTTPの持続的接続のサポート (初期値: %d)</translation>
+ </message>
+ <message>
+ <source>Randomly drop 1 of every &lt;n&gt; network messages</source>
+ <translation>&lt;n&gt; 個のネットワークメッセージごとにひとつをランダムに捨てる</translation>
+ </message>
+ <message>
+ <source>Randomly fuzz 1 of every &lt;n&gt; network messages</source>
+ <translation>&lt;n&gt;個のネットワークメッセージごとにひとつをランダムに改変する</translation>
+ </message>
+ <message>
+ <source>Rebuild block chain index from current blk000??.dat files on startup</source>
+ <translation>起動時に現在の blk000??.dat ファイルからブロック チェーンのインデックスを再構築</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>トレース/デバッグ情報を debug.log ファイルの代わりにコンソールへ送る</translation>
</message>
<message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>可能な場合には手数料ゼロのトランザクションとしてトランザクションを送信する (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>支払いリクエスト用にSSLルート証明書を設定する(デフォルト:-system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>言語設定 例: "de_DE" (初期値: システムの言語)</translation>
+ </message>
+ <message>
+ <source>Show all debugging options (usage: --help -help-debug)</source>
+ <translation>すべてのデバッグオプションを表示する (使い方: --help -help-debug)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>起動時にスプラッシュ画面を表示する (初期値: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>クライアント起動時に debug.log ファイルを縮小 (初期値: -debug オプションを指定しない場合は1)</translation>
</message>
@@ -2334,6 +3318,18 @@ rpcpassword=%s
<translation>取引の署名に失敗しました</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>最小化された状態で起動する</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>トランザクションの金額が小さすぎて手数料を支払えません</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation>これは実験的なソフトウェアです。</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>取引の額が小さ過ぎます</translation>
</message>
@@ -2342,10 +3338,22 @@ rpcpassword=%s
<translation>取引の額は0より大きくしてください</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>手数料ポリシーに対してトランザクションが大きすぎます</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>取引が大き過ぎます</translation>
</message>
<message>
+ <source>UI Options:</source>
+ <translation>UIオプション:</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer (bind returned error %s)</source>
+ <translation>このコンピュータの %s にバインドすることができません (バインドが返したエラーは %s)</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
<translation>リスン ポートの割当に UPnP を使用 (初期値: リスン中は1)</translation>
</message>
@@ -2354,12 +3362,28 @@ rpcpassword=%s
<translation>JSON-RPC 接続のユーザー名</translation>
</message>
<message>
+ <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
+ <translation>ウォレットが書き直される必要がありました: 完了するために Bitcoin Core を再起動します</translation>
+ </message>
+ <message>
<source>Warning</source>
<translation>警告</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>警告: このバージョンは古いのでアップグレードが必要です!</translation>
+ <source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>警告: サポートされていない引数 -benchmark は無視されました。-debug=bench を使用してください。</translation>
+ </message>
+ <message>
+ <source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>警告: サポートされていない引数 -debugnet は無視されました。-debug=net を使用してください。</translation>
+ </message>
+ <message>
+ <source>Zapping all transactions from wallet...</source>
+ <translation>ウォレットからすべてのトランザクションを消去しています...</translation>
+ </message>
+ <message>
+ <source>on startup</source>
+ <translation>起動時</translation>
</message>
<message>
<source>wallet.dat corrupt, salvage failed</source>
@@ -2402,14 +3426,174 @@ rpcpassword=%s
<translation>wallet.dat 読み込みエラー: ウォレットが壊れました</translation>
</message>
<message>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = トランザクションのメタデータ、例えばアカウントの所有者や支払リクエストの内容を保持する, 2 = トランザクションのメタデータを破棄する)</translation>
+ </message>
+ <message>
+ <source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</source>
+ <translation>&lt;n&gt; メガバイトごとにメモリプールからデータベースのアクティビティをディスクログに書き出す (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>-checkblocks のブロックの検証レベル (0-4, 初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
+ <translation>ブロックの採掘時にトランザクションの優先度と1kBあたりの手数料をログに残す (デフォルト: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
+ <translation>getrawtransaction rpc 呼び出し時に用いる、完全なトランザクションインデックスを保持する (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
+ <translation>不正なピアを再接続するまでの秒数 (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
+ <translation>デバッグ情報を出力する (初期値: %u, &lt;category&gt; の指定は任意です)</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
+ <translation>Tor 秘匿サービスを通し、別々の SOCKS5 プロキシを用いることでピアに到達する (初期値: %s)</translation>
+ </message>
+ <message>
+ <source>(default: %s)</source>
+ <translation>(デフォルト: %s)</translation>
+ </message>
+ <message>
+ <source>Acceptable ciphers (default: %s)</source>
+ <translation>受付可能な暗号化方式 (初期値: %s)</translation>
+ </message>
+ <message>
+ <source>Always query for peer addresses via DNS lookup (default: %u)</source>
+ <translation>DNS ルックアップを通してピアアドレスを常に問い合わせる (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Disable safemode, override a real safe mode event (default: %u)</source>
+ <translation>セーフモードを無効化し、実際のセーフモードイベントも無効化する (初期値: %u)</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>wallet.dat 読み込みエラー</translation>
</message>
<message>
+ <source>Force safe mode (default: %u)</source>
+ <translation>セーフモードを強制する (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Generate coins (default: %u)</source>
+ <translation>コインを生成 (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>How many blocks to check at startup (default: %u, 0 = all)</source>
+ <translation>起動時に点検するブロック数 (初期値: %u, 0=すべて)</translation>
+ </message>
+ <message>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>デバッグ出力にIPアドレスを含める (初期値: %u)</translation>
+ </message>
+ <message>
<source>Invalid -proxy address: '%s'</source>
<translation>無効な -proxy アドレス: '%s'</translation>
</message>
<message>
+ <source>Limit size of signature cache to &lt;n&gt; entries (default: %u)</source>
+ <translation>署名キャッシュのサイズを &lt;n&gt; エントリーに制限する (デフォルト: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>&lt;port&gt; で JSON-RPC 接続をリスン (初期値: %u、testnet は %u)</translation>
+ </message>
+ <message>
+ <source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>接続のリッスンを &lt;port&gt; で行う (初期値: %u、testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
+ <translation>ピアの接続数を最大でも &lt;n&gt; 個に維持する (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>ウォレットのトランザクションをブロードキャストする</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>接続毎の最大受信バッファ &lt;n&gt;*1000 バイト (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>接続毎の最大送信バッファ &lt;n&gt;*1000 バイト (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Only accept block chain matching built-in checkpoints (default: %u)</source>
+ <translation>内蔵のチェックポイントと一致するブロック チェーンのみを許可 (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Prepend debug output with timestamp (default: %u)</source>
+ <translation>デバッグ出力にタイムスタンプを付ける (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>データ運送トランザクションのリレーおよび採掘を行う (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>P2SHでないマルチシグトランザクションをリレーする (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Run a thread to flush wallet periodically (default: %u)</source>
+ <translation>ウォレットを定期的に書き出すためのスレッドを走らせる (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Server certificate file (default: %s)</source>
+ <translation>サーバ証明書ファイル (初期値: %s)</translation>
+ </message>
+ <message>
+ <source>Server private key (default: %s)</source>
+ <translation>サーバの秘密鍵 (初期値: %s)</translation>
+ </message>
+ <message>
+ <source>Set key pool size to &lt;n&gt; (default: %u)</source>
+ <translation>key pool のサイズを &lt;n&gt; (初期値: %u) にセット</translation>
+ </message>
+ <message>
+ <source>Set minimum block size in bytes (default: %u)</source>
+ <translation>最小ブロックサイズをバイトで設定 (初期値: %u)</translation>
+ </message>
+ <message>
+ <source>Set the number of threads to service RPC calls (default: %d)</source>
+ <translation>RPC サービスのスレッド数を設定 (初期値: %d)</translation>
+ </message>
+ <message>
+ <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source>
+ <translation>ウォレットDB環境内にDB_PRIVATEフラグを設定する (デフォルト: %u)</translation>
+ </message>
+ <message>
+ <source>Specify configuration file (default: %s)</source>
+ <translation>設定ファイルの指定 (初期値: %s)</translation>
+ </message>
+ <message>
+ <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
+ <translation>接続のタイムアウトをミリセコンドで指定 (最小値: 1, 初期値: %d)</translation>
+ </message>
+ <message>
+ <source>Specify pid file (default: %s)</source>
+ <translation>pid ファイルの指定 (初期値: %s)</translation>
+ </message>
+ <message>
+ <source>Spend unconfirmed change when sending transactions (default: %u)</source>
+ <translation>トランザクション送信時に未検証のおつりを使用する (デフォルト: %u)</translation>
+ </message>
+ <message>
+ <source>Stop running after importing blocks from disk (default: %u)</source>
+ <translation>ディスクからブロックを読み込んだ後に終了する (デフォルト: %u)</translation>
+ </message>
+ <message>
+ <source>Threshold for disconnecting misbehaving peers (default: %u)</source>
+ <translation>不正なピアを切断するためのしきい値 (初期値: %u)</translation>
+ </message>
+ <message>
<source>Unknown network specified in -onlynet: '%s'</source>
<translation>-onlynet で指定された '%s' は未知のネットワークです</translation>
</message>
@@ -2426,10 +3610,6 @@ rpcpassword=%s
<translation>-paytxfee=&lt;amount&gt; の額 '%s' が無効です</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>無効な総額</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>残高不足</translation>
</message>
@@ -2462,10 +3642,6 @@ rpcpassword=%s
<translation>読み込み完了</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>%s オプションを使うには</translation>
- </message>
- <message>
<source>Error</source>
<translation>エラー</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ka.ts b/src/qt/locale/bitcoin_ka.ts
index 3faad159ad..b9e118a620 100644
--- a/src/qt/locale/bitcoin_ka.ts
+++ b/src/qt/locale/bitcoin_ka.ts
@@ -1,11 +1,7 @@
-<TS language="ka" version="2.0">
+<TS language="ka" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>დააკლიკეთ ორჯერ მისამართის ან ნიშნულის შესაცვლელად</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>ახალი მისამართის შექმნა</translation>
</message>
@@ -152,10 +148,6 @@
<translation>ფრაზა-პაროლის შეცვლა</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>შეიყვანეთ საფულის ძველი და ახალი ფრაზა-პაროლი.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>დაადასტურეთ საფულის დაშიფრვა</translation>
</message>
@@ -180,10 +172,6 @@
<translation>საფულე დაშიფრულია</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>ახლა Bitcoin დაიხურება დაშიფრვის პროცესის დასასრულებლად. გაითვალისწინეთ, რომ დაშიფრვა სრულად ვერ დაიცავს თქვენს ბითქოინებს თქვენს კომპიუტერში შემოპარული მავნე პროგრამების საშუალებით დატაცებისაგან.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>ვერ მოხერხდა საფულის დაშიფრვა</translation>
</message>
@@ -299,10 +287,6 @@
<translation>მონეტების გაგზავნა Bitcoin-მისამართზე</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Bitcoin-ის საკონფიგურაციო პარამეტრების ცვლილება</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>საფულის არქივირება სხვა ადგილზე</translation>
</message>
@@ -455,18 +439,6 @@
<translation>მიღებული ტრანსაქციები</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>თარიღი: %1
-თანხა: %2
-ტიპი: %3
-მისამართი: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>საფულე &lt;b&gt;დაშიფრულია&lt;/b&gt; და ამჟამად &lt;b&gt;განბლოკილია&lt;/b&gt;</translation>
</message>
@@ -645,10 +617,6 @@ Address: %4
<translation>არა</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>ნიშნული წითლდება, როცა ტრანსაქციის ზომა 1000 ბაიტზე მეტია.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>ეს ნიშნავს, რომ კილობაიტზე საკომისიო იქნება მინიმუმ %1</translation>
</message>
@@ -661,14 +629,6 @@ Address: %4
<translation>მეტი პრიორიტეტის ტრანსაქციებს მეტი შანსი აქვს მოხვდეს ბლოკში.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>ნიშნული წითლდება, როცა პრიორიტეტი "საშუალო"-ზე დაბალია.</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>ნიშნული წითლდება, როცა რომელიმე რეციპიენტი მიიღებს %1-ზე ნაკლებს.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(არ არის ნიშნული)</translation>
</message>
@@ -785,26 +745,6 @@ Address: %4
<source>command-line options</source>
<translation>კომანდების ზოლის ოპციები</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>ინტერფეისის პარამეტრები</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>აირჩიეთ ენა, მაგალითად "de_DE" (ნაგულისხმევია სისტემური ლოკალი)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>გაშვება მინიმიზებული ეკრანით</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>მისალმების ეკრანის ჩვენება გაშვებისას (ნაგულისხმევი:1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>მონაცემთა კატალოგის მითითება ყოველი გაშვებისას (ნაგულისხმევი: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -871,14 +811,6 @@ Address: %4
<translation>&amp;მთავარი</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>სისტემაში შესვლის შემდეგ Bitcoin-ის ავტომატური გაშვება.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;სისტემაში შესვლისას გაშვება</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>მონაცემთა ბაზის კეშის სი&amp;დიდე</translation>
</message>
@@ -951,10 +883,6 @@ Address: %4
<translation>&amp;მინიმიზება სისტემურ ზონაში პროგრამების პანელის ნაცვლად</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 Quit in the menu.</source>
- <translation>პროგრამის მინიმიზება ფანჯრის დახურვისას. ოპციის ჩართვის შემდეგ პროგრამის დახურვა შესაძლებელი იქნება მხოლოდ მენიუდან - პუნქტი "გასვლა".</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>მ&amp;ინიმიზება დახურვისას</translation>
</message>
@@ -967,10 +895,6 @@ Address: %4
<translation>სამომხმარებ&amp;ლო ენა:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>აქ შეგიძლიათ აირჩიოთ სამომხმარებლო ენა. ძალაში შევა Bitcoin-ის რესტარტის შემდეგ.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>ერთეუ&amp;ლი:</translation>
</message>
@@ -1007,10 +931,6 @@ Address: %4
<translation>ცვლილებები ძალაში შევა კლიენტის ხელახალი გაშვების შემდეგ.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>კლიენტი დაიხურება, გავაგრძელოთ?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>ამ ცვლილებების ძალაში შესასვლელად საჭიროა კლიენტის დახურვა და ხელახალი გაშვება.</translation>
</message>
@@ -1061,11 +981,7 @@ Address: %4
<source>Your current total balance</source>
<translation>თქვენი სრული მიმდინარე ბალანსი</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>არ არის სინქრონიზებული</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -1257,18 +1173,10 @@ Address: %4
<translation>დახვეწის ლოგ-ფაილი</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>გახსენით Bitcoin-ის დახვეწის ლოგ-ფაილი მიმდინარე კატალოგიდან. დიდი ლოგ-ფაილის შემთხვევაში ამას შეიძლება რამდენიმე წამი მოუნდეს.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>კონსოლის გასუფთავება</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>მოგესალმებათ Bitcoin-ის RPC კონსოლი.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>კლავიშები "ზევით" და "ქვევით" - ისტორიაში მოძრაობა, &lt;b&gt;Ctrl-L&lt;/b&gt; - ეკრანის გასუფთავება.</translation>
</message>
@@ -1593,10 +1501,6 @@ Address: %4
<translation>ან</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>მიმღების მისამართი არასწორია, შეამოწმეთ.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>გადახდის მოცულობა 0-ზე მეტი უნდა იყოს</translation>
</message>
@@ -1605,10 +1509,6 @@ Address: %4
<translation>თანხა აღემატება თქვენს ბალანსს</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>მისამართები დუბლირებულია, დაშვებულია ერთ ჯერზე თითო მისამართზე ერთხელ გაგზავნა.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>შეცდომა ტრანსაქციის შექმნისას!</translation>
</message>
@@ -1684,10 +1584,6 @@ Address: %4
<translation>მესიჯი:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>ეს არის ვერიფიცირებული გადახდის მოთხოვნა.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>შეიყვანეთ ამ მისამართის ნიშნული გამოყენებული მისამართების სიაში დასამატებლად</translation>
</message>
@@ -1696,10 +1592,6 @@ Address: %4
<translation>მესიჯი, რომელიც თან ერთვის მონეტებს: URI, რომელიც შეინახება ტრანსაქციასთან ერთად თქვენთვის. შენიშვნა: მესიჯი არ გაყვება გადახდას ბითქოინის ქსელში.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>ეს არის არავერიფიცირებული გადახდის მოთხოვნა.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>ადრესატი:</translation>
</message>
@@ -1730,10 +1622,6 @@ Address: %4
<translation>მე&amp;სიჯის ხელმოწერა</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>ხელმოწერით თქვენ ადასტურებთ, რომ მესიჯი თქვენია. ფრთხილად - არ მოაწეროთ ხელი რაიმე საეჭვოს: ფიშინგური ხრიკებით შეიძლება ის თქვენს მესიჯად გაასაღონ. მოაწერეთ ხელი მხოლოდ იმას, რასაც ყველა წვრილმანში ეთანხმებით.</translation>
- </message>
- <message>
<source>Choose previously used address</source>
<translation>აირჩიეთ ადრე გამოყენებული მისამართი</translation>
</message>
@@ -1782,10 +1670,6 @@ Address: %4
<translation>მესიჯის &amp;ვერიფიკაცია</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>შეიყვანეთ ხელმოწერის მისამართი, მესიჯი (დაუკვირდით, რომ ზუსტად იყოს კოპირებული სტრიქონის გადატანები, ჰარები, ტაბულაციები და სხვ) და ხელმოწერა მესიჯის ვერიფიკაციისათვის. მიაქციეთ ყურადღება, რომ რაიმე ზედმეტი არ გაგყვეთ კოპირებისას, რათა არ გახდეთ "man-in-the-middle" შეტევის ობიექტი.</translation>
- </message>
- <message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
<translation>შეამოწმეთ, რომ მესიჯი ხელმოწერილია მითითებული Bitcoin-მისამართით</translation>
</message>
@@ -2021,10 +1905,6 @@ Address: %4
<translation>ტიპი</translation>
</message>
<message>
- <source>Address</source>
- <translation>მისამართი</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>არ არის მომწიფებული (%1 დასტური, საჭიროა სულ %2)</translation>
</message>
@@ -2049,6 +1929,10 @@ Address: %4
<translation>ოფლაინშია</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>ნიშნული</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>დაუდასტურებელია</translation>
</message>
@@ -2097,10 +1981,6 @@ Address: %4
<translation>ტრანსაქციის ტიპი.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>ტრანსაქიის დანიშნულების მისამართი.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>ბალანსიდან მოხსნილი ან დამატებული თანხა.</translation>
</message>
@@ -2331,30 +2211,6 @@ Address: %4
<translation>გარედან შეერთებების დაშვება (ნაგულისხმევი: 1 თუ არ გამოიყენება -proxy ან -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, მიუთითეთ rpcpassword საკონფიგურაციო ფაილში:
-%s
-რეკომენდებულია შემდეგი შემთხვევითი პაროლი:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(ამის დამახსოვრება არ გჭირდებათ)
-სახელი და პაროლი ერთმანეთს არ უნდა ემთხვეოდეს.
-თუ ფაილი არ არსებობს, შექმენით იგი უფლებებით owner-readable-only.
-ასევე რეკომენდებულია დააყენოთ alertnotify რათა მიიღოთ შეტყობინებები პრობლემების შესახებ;
-მაგალითად: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>მოცემულ მისამართზე მიჯაჭვა მუდმივად მასზე მიყურადებით. გამოიყენეთ [host]:port ფორმა IPv6-სათვის</translation>
</message>
@@ -2363,14 +2219,6 @@ rpcpassword=%s
<translation>გადასვლა რეგრესული ტესტირების რეჟიმში, რომელიც იყენებს სპეციალურ ჯაჭვს ბლოკების დაუყოვნებლივი პოვნის შესაძლებლობით.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>შეცდომა: ტრანსაქცია უარყოფილია! შესაძლოა მონეტების ნაწილი თქვენი საფულიდან უკვე გამოყენებულია, რაც შეიძლება მოხდეს wallet.dat-ის ასლის გამოყენებისას, როცა მონეტები გაიგზავნა სხვა ასლიდან, აქ კი არ არის გაგზავნილად მონიშნული.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>შეცდომა: ტრანსაქცია მოითხოვს საკომისიოს მინიმუმ %s რაოდენობის, სირთულის ან ბოლოს მიღებული თანხების შესაბამისად!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>კომანდის შესრულება საფულის ტრანსაქციის ცვლილებისას (%s კომანდაში ჩანაცვლდება TxID-ით)</translation>
</message>
@@ -2419,10 +2267,6 @@ rpcpassword=%s
<translation>შენიშნულია ბლოკთა ბაზის დაზიანება</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>საკუთარი IP-მისამართის განსაზღვრა (ნაგულისხმევი: 1 თუ ჩართულია მიყურადება და არ გამოიყენება -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>არ ჩაიტვირთოს საფულე და აიკრძალოს საფულისადმი RPC-მიმართვები</translation>
</message>
@@ -2451,10 +2295,6 @@ rpcpassword=%s
<translation>შეცდომა: დისზე არ არის ადგილი!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>შეცდომა: საფულე დაბლოკილია, ტრანსაქცია ვერ შეიქმნება!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>ვერ ხერხდება პორტების მიყურადება. თუ გსურთ, გამოიყენეთ -listen=0.</translation>
</message>
@@ -2475,10 +2315,6 @@ rpcpassword=%s
<translation>არ არის საკმარისი ფაილ-დესკრიპტორები.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>ბლოკთა ჯაჭვის ინდექსის ხელახლა აგება blk000??.dat ფაილიდან</translation>
- </message>
- <message>
<source>Set maximum block size in bytes (default: %d)</source>
<translation>ბლოკის მაქსიმალური ზომის განსაზღვრა ბაიტებში (ნადულისხმევი: %d)</translation>
</message>
@@ -2523,6 +2359,10 @@ rpcpassword=%s
<translation>მაღალპრიორიტეტული/დაბალსაკომისიოიანი ტრანსაქციების მაქსიმალური ზომა ბაიტებში (ნაგულისხმევი: %d)</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>მონაცემთა კატალოგის მითითება ყოველი გაშვებისას (ნაგულისხმევი: 0)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>ინფორმაცია</translation>
</message>
@@ -2539,6 +2379,14 @@ rpcpassword=%s
<translation>ტრასირების/დახვეწის ინფოს გაგზავნა კონსოლზე debug.log ფაილის ნაცვლად</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>აირჩიეთ ენა, მაგალითად "de_DE" (ნაგულისხმევია სისტემური ლოკალი)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>მისალმების ეკრანის ჩვენება გაშვებისას (ნაგულისხმევი:1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>debug.log ფაილის შეკუმშვა გაშვებისას (ნაგულისხმევია: 1 როცა არ აყენია -debug)</translation>
</message>
@@ -2547,6 +2395,10 @@ rpcpassword=%s
<translation>ტრანსაქციების ხელმოწერა ვერ მოხერხდა</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>გაშვება მინიმიზებული ეკრანით</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>ტრანსაქციების რაოდენობა ძალიან ცოტაა</translation>
</message>
@@ -2571,10 +2423,6 @@ rpcpassword=%s
<translation>გაფრთხილება</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>ყურადღება: ვერსია მოძველებულია, საჭიროა განახლება!</translation>
- </message>
- <message>
<source>Zapping all transactions from wallet...</source>
<translation>ტრანსაქციების ჩახსნა საფულიდან...</translation>
</message>
@@ -2643,10 +2491,6 @@ rpcpassword=%s
<translation>დაუშვებელი მნიშვნელობა -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>დაუშვებელი თანხა</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>არ არის საკმარისი თანხა</translation>
</message>
@@ -2679,10 +2523,6 @@ rpcpassword=%s
<translation>ჩატვირთვა დასრულებულია</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>%s ოპციის გამოსაყენებლად</translation>
- </message>
- <message>
<source>Error</source>
<translation>შეცდომა</translation>
</message>
diff --git a/src/qt/locale/bitcoin_kk_KZ.ts b/src/qt/locale/bitcoin_kk_KZ.ts
index 5a39417a7a..4cc709fdb2 100644
--- a/src/qt/locale/bitcoin_kk_KZ.ts
+++ b/src/qt/locale/bitcoin_kk_KZ.ts
@@ -1,11 +1,7 @@
-<TS language="kk_KZ" version="2.0">
+<TS language="kk_KZ" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Адресті немесе белгіні өзгерту үшін екі рет шертіңіз</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Жаңа адрес енгізу</translation>
</message>
@@ -377,8 +373,8 @@
<translation>Күні</translation>
</message>
<message>
- <source>Address</source>
- <translation>Адрес</translation>
+ <source>Label</source>
+ <translation>таңба</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_ko_KR.ts b/src/qt/locale/bitcoin_ko_KR.ts
index efc41ec6b7..42eb9eedbb 100644
--- a/src/qt/locale/bitcoin_ko_KR.ts
+++ b/src/qt/locale/bitcoin_ko_KR.ts
@@ -1,11 +1,7 @@
-<TS language="ko_KR" version="2.0">
+<TS language="ko_KR" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>지갑 주소나 이름을 수정하려면 더블클릭하세요.</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>새 주소 만들기</translation>
</message>
@@ -152,10 +148,6 @@
<translation>암호 변경</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>지갑의 예전 암호와 새로운 암호를 입력</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>지갑의 암호화를 확정</translation>
</message>
@@ -180,10 +172,6 @@
<translation>지갑 암호화 완료</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>암호화 처리 과정을 끝내기 위해 비트코인을 종료합니다. 지갑 암호화는 컴퓨터로의 멀웨어 감염으로 인한 비트코인 도난을 완전히 방지할 수 없음을 기억하세요.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>지갑 암호화 실패</translation>
</message>
@@ -303,10 +291,6 @@
<translation>비트코인 주소로 코인 전송</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>비트코인 설정 옵션 수정</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>지갑을 다른장소에 백업</translation>
</message>
@@ -475,18 +459,6 @@
<translation>들어오고 있는 거래</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>날짜: %1
-거래액: %2
-형식: %3
-주소: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>지갑이 암호화 되었고 현재 차단해제 되었습니다</translation>
</message>
@@ -665,10 +637,6 @@ Address: %4
<translation>아니요</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>만약 거래 양이 1000bytes 보다 크면 제목이 빨간색으로 변합니다</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>이 의미는 수수료가 최소한 %1 per 키로바이트 필요합니다</translation>
</message>
@@ -677,10 +645,6 @@ Address: %4
<translation>우선 순위가 높은 거래의 경우 블럭에 포함될 가능성이 더 많습니다.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>우선권이 중간보다 작으면 제목이 빨간색으로 변합니다. </translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(표 없음)</translation>
</message>
@@ -793,30 +757,6 @@ Address: %4
<source>command-line options</source>
<translation>명령줄 옵션</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI 옵션</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>"de_DE"와 같이 언어를 설정하십시오 (기본값: 시스템 로캘)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>최소화 상태에서 시작</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>지불 요청을 위해 SSL 최상위 인증을 설정합니다. (기본값: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>시작시 시작 화면 표시 (기본값: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>파일목록을 선택하여 시작하시오(기본값: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -887,14 +827,6 @@ Address: %4
<translation>메인(&amp;M)</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>시스템 로그인후에 비트코인을 자동으로 시작합니다.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>시스템 로그인시 비트코인 시작(&amp;S)</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>데이터베이스 캐시 크기</translation>
</message>
@@ -987,10 +919,6 @@ Address: %4
<translation>작업 표시줄 대신 트레이로 최소화(&amp;M)</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 Quit in the menu.</source>
- <translation>창을 닫으면 프로그램에서 나가지 않고 최소화합니다. 이 옵션을 활성화하면, 프로그램은 메뉴에서 나가기를 선택한 후에만 닫힙니다.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>닫을때 최소화(&amp;I)</translation>
</message>
@@ -1003,10 +931,6 @@ Address: %4
<translation>사용자 인터페이스 언어(&amp;L):</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>사용자 인터페이스 언어를 여기서 설정할 수 있습니다. 이 설정은 비트코인을 다시 시작할때 적용됩니다.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>거래액을 표시할 단위(&amp;U):</translation>
</message>
@@ -1043,10 +967,6 @@ Address: %4
<translation>변경 사항을 적용하기 위해서는 프로그램이 종료 후 재시작되어야 합니다.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>클라이언트가 종료됩니다, 계속 진행하시겠습니까?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>이 변경 사항 적용을 위해 프로그램 재시작이 필요합니다. </translation>
</message>
@@ -1105,11 +1025,7 @@ Address: %4
<source>Your current balance in watch-only addresses</source>
<translation>모니터링 지갑의 현재 잔액</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>동기화 필요</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -1293,18 +1209,10 @@ Address: %4
<translation>로그 파일 디버그</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>비트코인 디버그 로그파일을 현재 데이터 폴더에서 여십시요. 용량이 큰 로그 파일들은 몇 초가 걸릴 수 있습니다.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>콘솔 초기화</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>비트코인 RPC 콘솔에 오신걸 환영합니다</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>기록을 찾아보려면 위 아래 화살표 키를, 화면을 지우려면 &lt;b&gt;Ctrl-L&lt;/b&gt;키를 사용하십시오.</translation>
</message>
@@ -1601,10 +1509,6 @@ Address: %4
<translation>또는</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>수령인 주소가 정확하지 않습니다. 재확인 바랍니다</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>지불하는 금액은 0 보다 커야 합니다.</translation>
</message>
@@ -1617,10 +1521,6 @@ Address: %4
<translation>%1 의 거래수수료를 포함하면 잔고를 초과합니다.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>두개 이상의 주소입니다. 한번에 하나의 주소에만 작업할 수 있습니다.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>거래를 생성하는 것을 실패하였습니다</translation>
</message>
@@ -1696,10 +1596,6 @@ Address: %4
<translation>메시지:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>지급 확인요청입니다.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>사용된 주소 목록에 새 주소를 추가하기 위해 제목을 입력합니다. </translation>
</message>
@@ -1708,10 +1604,6 @@ Address: %4
<translation>비트코인에 첨부된 메시지: 참고용으로 거래와 함께 저장될 URI. 메모: 이 메시지는 비트코인 네트워크로 전송되지 않습니다.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>지급요청 미확인입니다</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>송금할 대상 : </translation>
</message>
@@ -1742,10 +1634,6 @@ Address: %4
<translation>메시지 서명(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>여러분 자신을 증명하기 위해 주소를 첨가하고 섬여할 수 있습니다. 피싱 공격으로 말미암아 여러분의 서명을 통해 속아 넘어가게 할 수 있으므로, 서명하지 않은 어떤 모호한 요소든 주의하십시오. 동의하는 완전 무결한 조항에만 서명하십시오.</translation>
- </message>
- <message>
<source>Choose previously used address</source>
<translation>이전에 사용한 주소를 선택하십시오</translation>
</message>
@@ -1794,10 +1682,6 @@ Address: %4
<translation>메시지 검증(&amp;V)</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>메시지를 검증하기 위해 아래 칸에 각각 지갑 주소와 메시지, 전자서명을 입력하세요. (메시지 원본의 띄어쓰기, 들여쓰기, 행 나눔 등이 정확하게 입력되어야 하므로 원본을 복사해서 입력하세요) 이 기능은 메시지 검증이 주 목적이며, 네트워크 침입자에 의해 변조되지 않도록 전자서명 해독에 불필요한 시간을 소모하지 마세요. </translation>
- </message>
- <message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
<translation>정확한 비트코인주소가 입력됬는지 메시지를 확인하시오</translation>
</message>
@@ -2033,10 +1917,6 @@ Address: %4
<translation>종류</translation>
</message>
<message>
- <source>Address</source>
- <translation>주소</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>충분히 숙성되지 않은 상태 (%1 승인, %2 후에 사용 가능합니다)</translation>
</message>
@@ -2061,6 +1941,10 @@ Address: %4
<translation>오프라인</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>표</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>미확인</translation>
</message>
@@ -2109,10 +1993,6 @@ Address: %4
<translation>거래의 종류.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>거래가 도달할 주소</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>변경된 잔고.</translation>
</message>
@@ -2347,16 +2227,6 @@ Address: %4
<translation>선택된 주소로 고정하며 항상 리슨(Listen)합니다. IPv6 프로토콜인 경우 [host]:port 방식의 명령어 표기법을 사용합니다.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>에러: 거래가 거부되었습니다! 이런 일이 생길 수 있습니다 만약 몇개의 코인들을 지갑에서 이미 사용했다면요, 예를 들어 만약 당신이 wallet.dat를 복사해서 사용했거나 코인들을 사용 후에 복사했다면 여기선 표시가 안되서 사용할 수 없습니다
-
--번역은 했으나 약간 이상한점이 있어서 수정해야함-</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>오류 : 해당 거래는 송금액, 다중 거래, 최근 수령한 금액의 사용 등의 이유로 최소 %s 이상의 송금 수수료가 필요합니다.</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>지갑 거래가 바뀌면 명령을 실행합니다.(%s 안의 명령어가 TxID로 바뀝니다)</translation>
</message>
@@ -2413,10 +2283,6 @@ Address: %4
<translation>디버그 및 테스트 설정</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>자신의 아이피 주소를 발견합니다 (기본값: 1 반응이 없거나 외부 아이피가 없을 때)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>지갑 불러오기를 하지마시오 또한 지갑 RPC 연결을 차단하십시오</translation>
</message>
@@ -2441,10 +2307,6 @@ Address: %4
<translation>오류: 디스크 공간이 부족합니다!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>오류: 지갑이 잠금상태여서 거래를 생성할 수 없습니다!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>어떤 포트도 반응하지 않습니다. 사용자 반응=0 만약 원한다면</translation>
</message>
@@ -2469,10 +2331,6 @@ Address: %4
<translation>사용 가능한 파일 디스크립터-File Descriptor-가 부족합니다. </translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>현재의 blk000??.dat 파일들로부터 블록체인 색인을 재구성합니다.</translation>
- </message>
- <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>데이터베이스 케시 크기를 메가바이트로 설정(%d 부터 %d, 기본값: %d)</translation>
</message>
@@ -2521,6 +2379,10 @@ Address: %4
<translation>최대 크기를 최우선으로 설정 / 바이트당 최소 수수료로 거래(기본값: %d)</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>파일목록을 선택하여 시작하시오(기본값: 0)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>정보</translation>
</message>
@@ -2533,10 +2395,6 @@ Address: %4
<translation>최저 거래 수수료가 부족합니다. -mintxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>블럭 색인을 발견하면 구동 시 블럭을 출력합니다.</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>RPC SSL 옵션: (비트코인 위키의 SSL 설정 설명서 참고)</translation>
</message>
@@ -2553,10 +2411,22 @@ Address: %4
<translation>추적오류 정보를 degug.log 자료로 보내는 대신 콘솔로 보내기</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>지불 요청을 위해 SSL 최상위 인증을 설정합니다. (기본값: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>"de_DE"와 같이 언어를 설정하십시오 (기본값: 시스템 로캘)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>모든 디버그 설정 보기(설정: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>시작시 시작 화면 표시 (기본값: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>클라이언트 시작시 debug.log 파일 비우기(기본값: 디버그 안할때 1)</translation>
</message>
@@ -2565,6 +2435,10 @@ Address: %4
<translation>거래를 서명하는것을 실패하였습니다.</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>최소화 상태에서 시작</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>거래량이 너무 적습니다</translation>
</message>
@@ -2589,10 +2463,6 @@ Address: %4
<translation>경고</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>경고: 이 버전이 오래되어 업그레이드가 필요합니다!</translation>
- </message>
- <message>
<source>Zapping all transactions from wallet...</source>
<translation>지갑의 모든거래내역 건너뛰기...</translation>
</message>
@@ -2665,10 +2535,6 @@ Address: %4
<translation>-paytxfee=&lt;amount&gt;에 대한 양이 잘못되었습니다: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>효력없는 금액</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>자금 부족</translation>
</message>
@@ -2701,10 +2567,6 @@ Address: %4
<translation>로딩 완료</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>%s 옵션을 사용하려면</translation>
- </message>
- <message>
<source>Error</source>
<translation>오류</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ky.ts b/src/qt/locale/bitcoin_ky.ts
index ed7542261c..8edee19c70 100644
--- a/src/qt/locale/bitcoin_ky.ts
+++ b/src/qt/locale/bitcoin_ky.ts
@@ -1,4 +1,4 @@
-<TS language="ky" version="2.0">
+<TS language="ky" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
@@ -149,11 +149,7 @@
</context>
<context>
<name>OverviewPage</name>
- <message>
- <source>out of sync</source>
- <translation>синхрондоштурулган эмес</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
</context>
@@ -292,10 +288,6 @@
<source>Date</source>
<translation>Дата</translation>
</message>
- <message>
- <source>Address</source>
- <translation>Дарек</translation>
- </message>
</context>
<context>
<name>TransactionView</name>
diff --git a/src/qt/locale/bitcoin_la.ts b/src/qt/locale/bitcoin_la.ts
index c399f36159..3e25cf95b6 100644
--- a/src/qt/locale/bitcoin_la.ts
+++ b/src/qt/locale/bitcoin_la.ts
@@ -1,11 +1,7 @@
-<TS language="la" version="2.0">
+<TS language="la" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dupliciter-clicca ut inscriptionem vel titulum mutes</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Crea novam inscriptionem</translation>
</message>
@@ -108,10 +104,6 @@
<translation>Muta tesseram</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Insero veterem novamque tesseram cassidili.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirma cifrationem cassidilis</translation>
</message>
@@ -136,10 +128,6 @@
<translation>Cassidile cifratum</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin iam desinet ut finiat actionem cifrandi. Memento cassidile cifrare non posse cuncte curare ne tui nummi clepantur ab malis programatibus in tuo computatro.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Cassidile cifrare abortum est</translation>
</message>
@@ -239,10 +227,6 @@
<translation>Mitte nummos ad inscriptionem Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Muta configurationis optiones pro Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Conserva cassidile in locum alium</translation>
</message>
@@ -318,26 +302,10 @@
<source>Bitcoin Core</source>
<translation>Bitcoin Nucleus</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n activa conexio ad rete Bitcoin</numerusform><numerusform>%n activae conexiones ad rete Bitcoin</numerusform></translation>
- </message>
<message>
<source>No block source available...</source>
<translation>Nulla fons frustorum absens...</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n hora</numerusform><numerusform>%n horae</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n dies</numerusform><numerusform>%n dies</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n hebdomas</numerusform><numerusform>%n hebdomades</numerusform></translation>
- </message>
<message>
<source>%1 behind</source>
<translation>%1 post</translation>
@@ -379,18 +347,6 @@
<translation>Transactio incipiens</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Dies: %1
-Quantitas: %2
-Typus: %3
-Inscriptio: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Cassidile &lt;b&gt;cifratum&lt;/b&gt; est et iam nunc &lt;b&gt;reseratum&lt;/b&gt;</translation>
</message>
@@ -517,23 +473,7 @@ Inscriptio: %4
<source>command-line options</source>
<translation>Optiones mandati intiantis</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI optiones</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Constitue linguam, exempli gratia "de_DE" (praedefinitum: lingua systematis)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Incipe minifactum ut icon</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Monstra principem imaginem ad initium (praedefinitum: 1)</translation>
- </message>
- </context>
+</context>
<context>
<name>Intro</name>
<message>
@@ -559,14 +499,6 @@ Inscriptio: %4
<translation>&amp;Princeps</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Pelle Bitcoin per se postquam in systema inire.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Pelle Bitcoin cum inire systema</translation>
- </message>
- <message>
<source>Reset all client options to default.</source>
<translation>Reconstitue omnes optiones clientis ad praedefinita.</translation>
</message>
@@ -611,10 +543,6 @@ Inscriptio: %4
<translation>&amp;Minifac in tabellam systematis potius quam applicationum</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 Quit in the menu.</source>
- <translation>Minifac potius quam exire applicatione quando fenestra clausa sit. Si haec optio activa est, applicatio clausa erit tantum postquam selegeris Exi in menu.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inifac ad claudendum</translation>
</message>
@@ -627,10 +555,6 @@ Inscriptio: %4
<translation>&amp;Lingua monstranda utenti:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Lingua monstranda utenti hic constitui potest. Haec configuratio effectiva erit postquam Bitcoin iterum initiatum erit.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unita qua quantitates monstrare:</translation>
</message>
@@ -677,11 +601,7 @@ Inscriptio: %4
<source>Mined balance that has not yet matured</source>
<translation>Fossum pendendum quod nondum maturum est</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>non synchronizato</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -777,18 +697,10 @@ Inscriptio: %4
<translation>Debug catalogi plica</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Aperi plicam catalogi de Bitcoin debug ex activo indice datorum. Hoc possit pauca secunda pro plicis magnis catalogi.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Vacuefac terminale</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bene ventio in terminale RPC de Bitcoin.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Utere sagittis sursum deorsumque ut per historiam naviges, et &lt;b&gt;Ctrl+L&lt;/b&gt; ut scrinium vacuefacias.</translation>
</message>
@@ -905,10 +817,6 @@ Inscriptio: %4
<translation>Copia quantitatem</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Inscriptio accipientis non est valida, sodes reproba.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Oportet quantitatem ad pensandum maiorem quam 0 esse.</translation>
</message>
@@ -921,10 +829,6 @@ Inscriptio: %4
<translation>Quantitas est ultra quod habes cum merces transactionis %1 includitur.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Geminata inscriptio inventa, tantum posse mittere ad quamque inscriptionem semel singulare operatione.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(nullus titulus)</translation>
</message>
@@ -953,7 +857,7 @@ Inscriptio: %4
</message>
<message>
<source>Paste address from clipboard</source>
- <translation>Conglutina inscriptionem ex latibulo</translation>
+ <translation>Glutina inscriptionem ex latibulo</translation>
</message>
<message>
<source>Alt+P</source>
@@ -978,10 +882,6 @@ Inscriptio: %4
<translation>&amp;Signa Nuntium</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Potes nuntios signare inscriptionibus tuis ut demonstres te eas possidere. Cautus es non amibiguum signare, quia impetus phiscatorum conentur te fallere ut signes identitatem tuam ad eos. Solas signa sententias cuncte descriptas quibus convenis.</translation>
- </message>
- <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1026,10 +926,6 @@ Inscriptio: %4
<translation>&amp;Verifica Nuntium</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Insere inscriptionem signantem, nuntium (cura ut copias intermissiones linearum, spatia, tabs, et cetera exacte) et signationem infra ut nuntium verifices. Cautus esto ne magis legas in signationem quam in nuntio signato ipso est, ut vites falli ab impetu homo-in-medio.</translation>
- </message>
- <message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
<translation>Verifica nuntium ut cures signatum esse cum specifica inscriptione Bitcoin</translation>
</message>
@@ -1130,10 +1026,6 @@ Inscriptio: %4
<source>Status</source>
<translation>Status</translation>
</message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, disseminatum per %n nodo</numerusform><numerusform>, disseminata per %n nodis</numerusform></translation>
- </message>
<message>
<source>Date</source>
<translation>Dies</translation>
@@ -1166,10 +1058,6 @@ Inscriptio: %4
<source>Credit</source>
<translation>Creditum</translation>
</message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>maturum erit in %n plure frusto</numerusform><numerusform>maturum erit in %n pluribus frustis</numerusform></translation>
- </message>
<message>
<source>not accepted</source>
<translation>non acceptum</translation>
@@ -1253,14 +1141,6 @@ Inscriptio: %4
<translation>Typus</translation>
</message>
<message>
- <source>Address</source>
- <translation>Inscriptio</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Aperi pro %n plure frusto</numerusform><numerusform>Aperi pro %n pluribus frustis</numerusform></translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Apertum donec %1</translation>
</message>
@@ -1277,6 +1157,10 @@ Inscriptio: %4
<translation>Generatum sed non acceptum</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Titulus</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Acceptum cum</translation>
</message>
@@ -1313,10 +1197,6 @@ Inscriptio: %4
<translation>Typus transactionis.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Inscriptio destinationis transactionis.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Quantitas remota ex pendendo aut addita ei.</translation>
</message>
@@ -1515,42 +1395,10 @@ Inscriptio: %4
<translation>Accipe conexiones externas (praedefinitum: 1 nisi -proxy neque -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, necesse est te rpcpassword constituere in plica configurationis:
-%s
-Hortatur te hanc fortuitam tesseram uti:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(non est necesse te hanc tesseram meminisse)
-Nomen usoris et tessera eadem esse NON POSSUNT.
-Si plica non existit, eam crea cum permissionibus ut eius dominus tantum sinitur id legere.
-Quoque hortatur alertnotify constituere ut tu notificetur de problematibus;
-exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Conglutina ad inscriptionem datam et semper in eam ausculta. Utere [moderatrum]:porta notationem pro IPv6</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Error: Transactio eiecta est! Hoc possit accidere si alii nummorum in cassidili tuo iam soluti sint, ut si usus es exemplar de wallet.dat et nummi soluti sunt in exemplari sed non hic notati ut soluti.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Error: Huic transactioni necesse est merces saltem %s propter eius magnitudinem, complexitatem, vel usum recentum acceptorum nummorum!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Facere mandatum quotiescumque cassidilis transactio mutet (%s in mandato sbstituitur ab TxID)</translation>
</message>
@@ -1587,10 +1435,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c
<translation>Corruptum databasum frustorum invenitur</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Discooperi propriam inscriptionem IP (praedefinitum: 1 quando auscultans et nullum -externalip)</translation>
- </message>
- <message>
<source>Do you want to rebuild the block database now?</source>
<translation>Visne reficere databasum frustorum iam?</translation>
</message>
@@ -1615,10 +1459,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c
<translation>Error: Inopia spatii disci!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Error: Cassidile seratum, non posse transactionem creare!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Non potuisse auscultare in ulla porta. Utere -listen=0 si hoc vis.</translation>
</message>
@@ -1627,10 +1467,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c
<translation>Inopia descriptorum plicarum.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Restituere indicem catenae frustorum ex activis plicis blk000??.dat</translation>
- </message>
- <message>
<source>Verifying blocks...</source>
<translation>Verificante frusta...</translation>
</message>
@@ -1659,6 +1495,14 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c
<translation>Mitte informationem vestigii/debug ad terminale potius quam plicam debug.log</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Constitue linguam, exempli gratia "de_DE" (praedefinitum: lingua systematis)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Monstra principem imaginem ad initium (praedefinitum: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Diminue plicam debug.log ad initium clientis (praedefinitum: 1 nisi -debug)</translation>
</message>
@@ -1667,6 +1511,10 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c
<translation>Signandum transactionis abortum est</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Incipe minifactum ut icon</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Magnitudo transactionis nimis parva</translation>
</message>
@@ -1691,10 +1539,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c
<translation>Monitio</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Monitio: Haec versio obsoleta est, progressio postulata!</translation>
- </message>
- <message>
<source>wallet.dat corrupt, salvage failed</source>
<translation>wallet.dat corrupta, salvare abortum est</translation>
</message>
@@ -1759,10 +1603,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c
<translation>Quantitas non valida pro -paytxfee=&lt;quantitas&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Quantitas non valida</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Inopia nummorum</translation>
</message>
@@ -1795,10 +1635,6 @@ exempli gratia: alertnotify=echo %%s | mail -s "Bitcoin Notificatio" admin@foo.c
<translation>Completo lengendi</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Ut utaris optione %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Error</translation>
</message>
diff --git a/src/qt/locale/bitcoin_lt.ts b/src/qt/locale/bitcoin_lt.ts
index 1f70400df6..01fa94bab3 100644
--- a/src/qt/locale/bitcoin_lt.ts
+++ b/src/qt/locale/bitcoin_lt.ts
@@ -1,11 +1,7 @@
-<TS language="lt" version="2.0">
+<TS language="lt" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Spragtelėkite, kad pakeistumėte adresą arba žymę</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Sukurti naują adresą</translation>
</message>
@@ -63,7 +59,7 @@
</message>
<message>
<source>Comma separated file (*.csv)</source>
- <translation>Kableliais išskirtas failas (*.csv)</translation>
+ <translation>Kableliais atskirtų duomenų failas (*.csv)</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -132,10 +128,6 @@
<translation>Pakeisti slaptafrazę</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Įveskite seną ir naują piniginės slaptafrazes.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Patvirtinkite piniginės užšifravimą</translation>
</message>
@@ -156,10 +148,6 @@
<translation>Piniginė užšifruota</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin dabar užsidarys šifravimo proceso pabaigai. Atminkite, kad piniginės šifravimas negali pilnai apsaugoti bitcoinų vagysčių kai tinkle esančios kenkėjiškos programos patenka į jūsų kompiuterį.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Nepavyko užšifruoti piniginę</translation>
</message>
@@ -275,10 +263,6 @@
<translation>Siųsti monetas Bitcoin adresui</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Keisti bitcoin konfigūracijos galimybes</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Daryti piniginės atsarginę kopiją</translation>
</message>
@@ -354,26 +338,6 @@
<source>&amp;About Bitcoin Core</source>
<translation>&amp;Apie Bitcoin Core</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n Bitcoin tinklo aktyvus ryšys</numerusform><numerusform>%n Bitcoin tinklo aktyvūs ryšiai</numerusform><numerusform>%n Bitcoin tinklo aktyvūs ryšiai</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n valanda</numerusform><numerusform>%n valandos</numerusform><numerusform>%n valandų</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n diena</numerusform><numerusform>%n dienos</numerusform><numerusform>%n dienų</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n savaitė</numerusform><numerusform>%n savaitės</numerusform><numerusform>%n savaičių</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation><numerusform>%n metas</numerusform><numerusform>%n metai</numerusform><numerusform>%n metų</numerusform></translation>
- </message>
<message>
<source>Error</source>
<translation>Klaida</translation>
@@ -403,17 +367,6 @@
<translation>Ateinantis sandoris</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Data: %1
-Suma: %2
-Tipas: %3
-Adresas: %4</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Piniginė &lt;b&gt;užšifruota&lt;/b&gt; ir šiuo metu &lt;b&gt;atrakinta&lt;/b&gt;</translation>
</message>
@@ -656,19 +609,7 @@ Adresas: %4</translation>
<source>command-line options</source>
<translation>komandinės eilutės parametrai</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Naudotoji sąsajos parametrai</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Nustatyti kalbą, pavyzdžiui "lt_LT" (numatyta: sistemos kalba)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Paleisti sumažintą</translation>
- </message>
- </context>
+</context>
<context>
<name>Intro</name>
<message>
@@ -702,14 +643,6 @@ Adresas: %4</translation>
<translation>&amp;Pagrindinės</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Automatiškai paleisti Bitkoin programą įjungus sistemą.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Paleisti Bitcoin programą su window sistemos paleidimu</translation>
- </message>
- <message>
<source>&amp;Network</source>
<translation>&amp;Tinklas</translation>
</message>
@@ -746,10 +679,6 @@ Adresas: %4</translation>
<translation>&amp;M sumažinti langą bet ne užduočių juostą</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 Quit in the menu.</source>
- <translation>Uždarant langą neuždaryti programos. Kai ši parinktis įjungta, programa bus uždaryta tik pasirinkus meniu komandą Baigti.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>&amp;Sumažinti uždarant</translation>
</message>
@@ -762,10 +691,6 @@ Adresas: %4</translation>
<translation>Naudotojo sąsajos &amp;kalba:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Čia gali būti nustatyta naudotojo sąsajos kalba. Šis nustatymas įsigalios iš naujo paleidus Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Vienetai, kuriais rodyti sumas:</translation>
</message>
@@ -812,11 +737,7 @@ Adresas: %4</translation>
<source>Your current total balance</source>
<translation>Jūsų balansas</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>nesinchronizuota</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -928,10 +849,6 @@ Adresas: %4</translation>
<translation>Išvalyti konsolę</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Sveiki atvykę į Bitcoin RPC konsolę.</translation>
- </message>
- <message>
<source>%1 B</source>
<translation>%1 B</translation>
</message>
@@ -1104,10 +1021,6 @@ Adresas: %4</translation>
<translation>Kopijuoti pirmumą</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Negaliojantis gavėjo adresas. Patikrinkite.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Apmokėjimo suma turi būti didesnė nei 0.</translation>
</message>
@@ -1120,10 +1033,6 @@ Adresas: %4</translation>
<translation>Jei pridedame sandorio mokestį %1 bendra suma viršija jūsų balansą.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Rastas adreso dublikatas.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(nėra žymės)</translation>
</message>
@@ -1404,10 +1313,6 @@ Adresas: %4</translation>
<translation>Tipas</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresas</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Atidaryta iki %1</translation>
</message>
@@ -1424,6 +1329,10 @@ Adresas: %4</translation>
<translation>Išgauta bet nepriimta</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Žymė</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Gauta su</translation>
</message>
@@ -1433,7 +1342,7 @@ Adresas: %4</translation>
</message>
<message>
<source>Sent to</source>
- <translation>Siųsta </translation>
+ <translation>Išsiųsta</translation>
</message>
<message>
<source>Payment to yourself</source>
@@ -1460,10 +1369,6 @@ Adresas: %4</translation>
<translation>Sandorio tipas.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Sandorio paskirties adresas</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Suma pridėta ar išskaičiuota iš balanso</translation>
</message>
@@ -1678,6 +1583,14 @@ Adresas: %4</translation>
<translation>Siųsti atsekimo/derinimo info į konsolę vietoj debug.log failo</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Nustatyti kalbą, pavyzdžiui "lt_LT" (numatyta: sistemos kalba)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Paleisti sumažintą</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
<translation>Bandymas naudoti UPnP struktūra klausymosi prievadui (default: 1 when listening)</translation>
</message>
@@ -1734,10 +1647,6 @@ Adresas: %4</translation>
<translation>Neteisinga suma -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Neteisinga suma</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nepakanka lėšų</translation>
</message>
diff --git a/src/qt/locale/bitcoin_lv_LV.ts b/src/qt/locale/bitcoin_lv_LV.ts
index ac5a1a1396..25f92b6642 100644
--- a/src/qt/locale/bitcoin_lv_LV.ts
+++ b/src/qt/locale/bitcoin_lv_LV.ts
@@ -1,11 +1,7 @@
-<TS language="lv_LV" version="2.0">
+<TS language="lv_LV" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Adresi vai nosaukumu rediģē ar dubultklikšķi</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Izveidot jaunu adresi</translation>
</message>
@@ -144,10 +140,6 @@
<translation>Mainīt paroli</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Ierakstiet maciņa veco un jauno paroli.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Apstiprināt maciņa šifrēšanu</translation>
</message>
@@ -168,10 +160,6 @@
<translation>Maciņš nošifrēts</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin aizvērsies, lai pabeigtu šifrēšanu. Atcerieties, ka maciņa šifrēšana nevar pilnībā novērst bitkoinu zādzību, ko veic datorā ieviesušās kaitīgas programmas.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Maciņa šifrēšana neizdevās</translation>
</message>
@@ -291,10 +279,6 @@
<translation>Nosūtīt bitkoinus uz Bitcoin adresi</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Mainīt Bitcoin konfigurācijas uzstādījumus</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Izveidot maciņa rezerves kopiju citur</translation>
</message>
@@ -390,34 +374,14 @@
<source>&amp;Command-line options</source>
<translation>&amp;Komandrindas iespējas</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n aktīvu savienojumu ar Bitcoin tīklu</numerusform><numerusform>%n aktīvs savienojums ar Bitcoin tīklu</numerusform><numerusform>%n aktīvu savienojumu as Bitcoin tīklu</numerusform></translation>
- </message>
<message>
<source>No block source available...</source>
<translation>Nav pieejams neviens bloku avots...</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n stundas</numerusform><numerusform>%n stunda</numerusform><numerusform>%n stundas</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n dienas</numerusform><numerusform>%n diena</numerusform><numerusform>%n dienas</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n nedēļas</numerusform><numerusform>%n nedēļa</numerusform><numerusform>%n nedēļas</numerusform></translation>
- </message>
<message>
<source>%1 and %2</source>
<translation>%1 un %2</translation>
</message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation><numerusform>%n gadi</numerusform><numerusform>%n gads</numerusform><numerusform>%n gadi</numerusform></translation>
- </message>
<message>
<source>%1 behind</source>
<translation>%1 aizmugurē</translation>
@@ -455,18 +419,6 @@
<translation>Ienākoša transakcija</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Datums: %1
-Daudzums: %2
-Tips: %3
-Adrese: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Maciņš ir &lt;b&gt;šifrēts&lt;/b&gt; un pašlaik &lt;b&gt;atslēgts&lt;/b&gt;</translation>
</message>
@@ -634,7 +586,7 @@ Adrese: %4
</message>
<message>
<source>none</source>
- <translation>neviens</translation>
+ <translation>neviena</translation>
</message>
<message>
<source>yes</source>
@@ -749,23 +701,7 @@ Adrese: %4
<source>command-line options</source>
<translation>komandrindas izvēles</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Lietotāja interfeisa izvēlnes</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Uzstādiet valodu, piemēram "de_DE" (pēc noklusēšanas: sistēmas lokāle)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Sākt minimizētu</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Uzsākot, parādīt programmas informācijas logu (pēc noklusēšanas: 1)</translation>
- </message>
- </context>
+</context>
<context>
<name>Intro</name>
<message>
@@ -827,14 +763,6 @@ Adrese: %4
<translation>&amp;Galvenais</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Automātiski sākt Bitcoin pēc pieteikšanās sistēmā.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Sākt Bitcoin reizē ar sistēmu</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>&amp;Datubāzes kešatmiņas izmērs</translation>
</message>
@@ -919,10 +847,6 @@ Adrese: %4
<translation>&amp;Minimizēt uz sistēmas tekni, nevis rīkjoslu</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 Quit in the menu.</source>
- <translation>Logu aizverot, minimizēt, nevis beigt darbu. Kad šī izvēlne iespējota, programma aizvērsies tikai pēc Beigt komandas izvēlnē.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimizēt aizverot</translation>
</message>
@@ -935,10 +859,6 @@ Adrese: %4
<translation>Lietotāja interfeiss un &amp;valoda:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Šeit var iestatīt lietotāja valodu. Iestatījums aktivizēsies pēc Bitcoin pārstartēšanas.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Vienības, kurās attēlot daudzumus:</translation>
</message>
@@ -971,10 +891,6 @@ Adrese: %4
<translation>Apstiprināt iestatījumu atiestatīšanu</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Klients tiks izslēgts, vai vēlaties turpināt?</translation>
- </message>
- <message>
<source>The supplied proxy address is invalid.</source>
<translation>Norādītā starpniekservera adrese nav derīga.</translation>
</message>
@@ -1017,11 +933,7 @@ Adrese: %4
<source>Your current total balance</source>
<translation>Jūsu kopējā tekošā bilance</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>nav sinhronizēts</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -1193,10 +1105,6 @@ Adrese: %4
<translation>Notīrīt konsoli</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Laipni lūgti Bitcoin RPC konsolē.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Izmantojiet bultiņas uz augšu un leju, lai pārvietotos pa vēsturi, un &lt;b&gt;Ctrl-L&lt;/b&gt; ekrāna notīrīšanai.</translation>
</message>
@@ -1374,7 +1282,7 @@ Adrese: %4
<name>SendCoinsDialog</name>
<message>
<source>Send Coins</source>
- <translation>Sūtīt bitkoinus</translation>
+ <translation>Sūtīt Bitkoinus</translation>
</message>
<message>
<source>Coin Control Features</source>
@@ -1497,10 +1405,6 @@ Adrese: %4
<translation>vai</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Saņēmēja adrese ir nepareiza, lūdzu pārbaudi.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Nosūtāmajai summai jābūt lielākai par 0.</translation>
</message>
@@ -1513,10 +1417,6 @@ Adrese: %4
<translation>Kopsumma pārsniedz pieejamo, ja pieskaitīta %1 transakcijas maksa.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Atrastas divas vienādas adreses, vienā nosūtīšanas reizē uz katru adresi var sūtīt tikai vienreiz.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Transakcijas izveidošana neizdevās!</translation>
</message>
@@ -1584,14 +1484,6 @@ Adrese: %4
<translation>Ziņojums:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Šis ir pārbaudīts maksājuma pieprasījums.</translation>
- </message>
- <message>
- <source>This is an unverified payment request.</source>
- <translation>Šis ir nepārbaudīts maksājuma pieprasījums.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Maksāt:</translation>
</message>
@@ -1870,10 +1762,6 @@ Adrese: %4
<source>, has not been successfully broadcast yet</source>
<translation>, vēl nav veiksmīgi izziņots</translation>
</message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Atvērts vel %n blokus</numerusform><numerusform>Atvērts vel %n bloku</numerusform><numerusform>Atvērts vel %n blokus</numerusform></translation>
- </message>
<message>
<source>unknown</source>
<translation>nav zināms</translation>
@@ -1901,14 +1789,6 @@ Adrese: %4
<translation>Tips</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adrese</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Atvērts vel %n blokus</numerusform><numerusform>Atvērts vel %n bloku</numerusform><numerusform>Atvērts vel %n blokus</numerusform></translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Atvērts līdz %1</translation>
</message>
@@ -1929,6 +1809,10 @@ Adrese: %4
<translation>Bezsaitē</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Nosaukums</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Neapstiprināts</translation>
</message>
@@ -1973,10 +1857,6 @@ Adrese: %4
<translation>Transakcijas tips.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Transakcijas mērķa adrese.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Bilancei pievienotais vai atņemtais daudzums.</translation>
</message>
@@ -2235,10 +2115,6 @@ Adrese: %4
<translation>Kļūda: Zema diska vieta!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Kļūda: Maciņš ir aizslēgts, nevar izveidot transakciju!</translation>
- </message>
- <message>
<source>If &lt;category&gt; is not supplied, output all debugging information.</source>
<translation>Ja &lt;category&gt; nav norādīta, izvadīt visu atkļūdošanas informāciju.</translation>
</message>
@@ -2275,10 +2151,22 @@ Adrese: %4
<translation>Debug/trace informāciju izvadīt konsolē, nevis debug.log failā</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Uzstādiet valodu, piemēram "de_DE" (pēc noklusēšanas: sistēmas lokāle)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Uzsākot, parādīt programmas informācijas logu (pēc noklusēšanas: 1)</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation>Transakcijas parakstīšana neizdevās</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Sākt minimizētu</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Transakcijas summa ir pārāk maza</translation>
</message>
@@ -2299,10 +2187,6 @@ Adrese: %4
<translation>Brīdinājums</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Brīdinājums: Šī versija ir novecojusi, nepieciešams atjauninājums!</translation>
- </message>
- <message>
<source>on startup</source>
<translation>startēšanas laikā</translation>
</message>
@@ -2371,10 +2255,6 @@ Adrese: %4
<translation>Nederīgs daudzums priekš -paytxfree=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Nederīgs daudzums</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nepietiek bitkoinu</translation>
</message>
@@ -2407,10 +2287,6 @@ Adrese: %4
<translation>Ielāde pabeigta</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Izmantot opciju %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Kļūda</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mn.ts b/src/qt/locale/bitcoin_mn.ts
index f1b0174111..a1a07af8d5 100644
--- a/src/qt/locale/bitcoin_mn.ts
+++ b/src/qt/locale/bitcoin_mn.ts
@@ -1,11 +1,7 @@
-<TS language="mn" version="2.0">
+<TS language="mn" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Хаяг эсвэл шошгыг ѳѳрчлѳхийн тулд хоёр удаа дар</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Шинэ хаяг нээх</translation>
</message>
@@ -46,7 +42,7 @@
</message>
<message>
<source>(no label)</source>
- <translation>(шошго алга)</translation>
+ <translation>(шошгогүй)</translation>
</message>
</context>
<context>
@@ -88,10 +84,6 @@
<translation>Нууц үгийг солих</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Түрүйвчийн хуучин болоод шинэ нууц үгсийг оруулна уу</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Түрүйвчийн цоожийг баталгаажуулах</translation>
</message>
@@ -100,10 +92,6 @@
<translation>Түрүйвч цоожлогдлоо</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Цоожлолтын процесыг дуусгахын тулд Биткойн одоо хаагдана. Ѳѳрийн түрүйвчийг цоожлох нь таны биткойнуудыг компьютерийн вирус хулгайлахаас бүрэн сэргийлж чадахгүй гэдгийг санаарай.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Түрүйвчийн цоожлол амжилттай болсонгүй</translation>
</message>
@@ -218,18 +206,6 @@
<source>&amp;Help</source>
<translation>&amp;Тусламж</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>Биткойны сүлжээрүү %n идэвхитэй холболт байна </numerusform><numerusform>Биткойны сүлжээрүү %n идэвхитэй холболтууд байна </numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n цаг</numerusform><numerusform>%n цаг</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n ѳдѳр</numerusform><numerusform>%n ѳдрүүд</numerusform></translation>
- </message>
<message>
<source>Error</source>
<translation>Алдаа</translation>
@@ -247,21 +223,6 @@
<translation>Дотогшоо гүйлгээ</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Огноо: %1
-
-Хэмжээ: %2
-
-Тѳрѳл: %3
-
-Хаяг: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Түрүйвч &lt;b&gt;цоожтой&lt;/b&gt; ба одоогоор цоож &lt;b&gt;онгорхой&lt;/b&gt; байна</translation>
</message>
@@ -406,10 +367,6 @@ Address: %4
<translation>Ѳѳрчлѳлтүүдийг идэвхижүүлхийн тулд клиентийг ахин эхлүүлэх шаардлагтай</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Клиент унтрах гэж байна, яг унтраах уу?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Энэ ѳѳрчлѳлтийг оруулахын тулд кли1нт програмыг ахин эхлүүлэх шаардлагтай</translation>
</message>
@@ -574,7 +531,7 @@ Address: %4
</message>
<message>
<source>(no label)</source>
- <translation>(шошго алга)</translation>
+ <translation>(шошгогүй)</translation>
</message>
<message>
<source>(no message)</source>
@@ -804,10 +761,6 @@ Address: %4
<translation>Тѳрѳл</translation>
</message>
<message>
- <source>Address</source>
- <translation>Хаяг</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>%1 хүртэл нээлттэй</translation>
</message>
@@ -824,6 +777,10 @@ Address: %4
<translation>Үүсгэгдсэн гэхдээ хүлээн авагдаагүй</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Шошго</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Баталгаажаагүй</translation>
</message>
@@ -868,10 +825,6 @@ Address: %4
<translation>Гүйлгээний тѳрѳл</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Гүйлгээг хүлээн авах хаяг</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Балансаас авагдсан болон нэмэгдсэн хэмжээ.</translation>
</message>
@@ -1038,10 +991,6 @@ Address: %4
<translation>Эдгээр прокси хаягнууд буруу байна: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Буруу хэмжээ</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Таны дансны үлдэгдэл хүрэлцэхгүй байна</translation>
</message>
@@ -1066,10 +1015,6 @@ Address: %4
<translation>Ачааллаж дууслаа</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>%s сонголтыг ашиглахын тулд</translation>
- </message>
- <message>
<source>Error</source>
<translation>Алдаа</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ms_MY.ts b/src/qt/locale/bitcoin_ms_MY.ts
index d2e8efbb49..999961beb8 100644
--- a/src/qt/locale/bitcoin_ms_MY.ts
+++ b/src/qt/locale/bitcoin_ms_MY.ts
@@ -1,11 +1,7 @@
-<TS language="ms_MY" version="2.0">
+<TS language="ms_MY" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Klik dua kali untuk mengubah alamat atau label</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Cipta alamat baru</translation>
</message>
@@ -160,10 +156,6 @@
</context>
<context>
<name>TransactionTableModel</name>
- <message>
- <source>Address</source>
- <translation>Alamat</translation>
- </message>
</context>
<context>
<name>TransactionView</name>
diff --git a/src/qt/locale/bitcoin_nb.ts b/src/qt/locale/bitcoin_nb.ts
index bdde3da534..6e2b4e9fcc 100644
--- a/src/qt/locale/bitcoin_nb.ts
+++ b/src/qt/locale/bitcoin_nb.ts
@@ -1,13 +1,13 @@
-<TS language="nb" version="2.0">
+<TS language="nb" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dobbelklikk for å redigere adresse eller merkelapp</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Høyreklikk for å redigere adressen eller merkelappen</translation>
</message>
<message>
<source>Create a new address</source>
- <translation>Lag en ny adresse</translation>
+ <translation>Opprett en ny addresse</translation>
</message>
<message>
<source>&amp;New</source>
@@ -91,7 +91,7 @@
</message>
<message>
<source>Exporting Failed</source>
- <translation>Ekport Feilet</translation>
+ <translation>Eksportering feilet</translation>
</message>
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
@@ -156,10 +156,6 @@
<translation>Endre adgangsfrase</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Skriv inn gammel og ny adgangsfrase for lommeboken.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Bekreft kryptering av lommebok</translation>
</message>
@@ -172,6 +168,10 @@
<translation>Er du sikker på at du vil kryptere lommeboken?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Bitcoin Core vil nå avslutte for å fullføre krypteringsprosessen. Husk at kryptering av lommeboken ikke kan beskytte fullstendig mot tyveri av dine bitcoins hvis datamaskinen din er infisert av skadevare.</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>VIKTIG: Tidligere sikkerhetskopier av din lommebokfil bør erstattes med den nylig genererte og krypterte filen, da de blir ugyldiggjort av sikkerhetshensyn så snart du begynner å bruke den nye krypterte lommeboken.</translation>
</message>
@@ -188,8 +188,8 @@
<translation>Oppgi adgangsfrasen til lommeboken.&lt;br/&gt;Vennligst bruk en adgangsfrase med &lt;b&gt;ti eller flere tilfeldige tegn&lt;/b&gt;, eller &lt;b&gt;åtte eller flere ord&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin vil nå lukkes for å fullføre krypteringsprosessen. Husk at kryptering av lommeboken ikke fullt ut kan beskytte dine bitcoins fra å bli stjålet om skadevare infiserer datamaskinen.</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Oppgi gammel og ny adgangsfrase til lommeboken.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -311,10 +311,6 @@
<translation>Send til en Bitcoin-adresse</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Endre oppsett for Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Sikkerhetskopier lommebok til annet sted</translation>
</message>
@@ -403,6 +399,10 @@
<translation>&amp;Om Bitcoin Core</translation>
</message>
<message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Endre konfigurasjonsvalg for Bitcoin Core</translation>
+ </message>
+ <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Vis listen av brukte utsendingsadresser og merkelapper</translation>
</message>
@@ -431,6 +431,10 @@
<translation>Ingen kilde for blokker tilgjengelig...</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>Lastet %n blokk med transaksjonshistorikk.</numerusform><numerusform>Lastet %n blokker med transaksjonshistorikk.</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n time</numerusform><numerusform>%n timer</numerusform></translation>
</message>
@@ -476,39 +480,53 @@
</message>
<message>
<source>Up to date</source>
- <translation>Ajour</translation>
- </message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>Lastet %n blokk med transaksjonshistorikk.</numerusform><numerusform>Lastet %n blokker med transaksjonshistorikk.</numerusform></translation>
+ <translation>Oppdatert</translation>
</message>
<message>
<source>Catching up...</source>
- <translation>Kommer ajour...</translation>
+ <translation>Laster ned...</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>Sendt transaksjon</translation>
+ <source>Date: %1
+</source>
+ <translation>Dato: %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>Innkommende transaksjon</translation>
+ <source>Amount: %1
+</source>
+ <translation>Beløp: %1:
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Type: %1
</source>
- <translation>Dato: %1
-Beløp: %2
-Type: %3
-Adresse: %4
+ <translation>Type: %1
</translation>
</message>
<message>
+ <source>Label: %1
+</source>
+ <translation>Merkelapp: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Adresse: %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation>Sendt transaksjon</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Innkommende transaksjon</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation>Lommeboken er &lt;b&gt;kryptert&lt;/b&gt; og for tiden &lt;b&gt;ulåst&lt;/b&gt;</translation>
+ <translation>Lommeboken er &lt;b&gt;kryptert&lt;/b&gt; og for tiden &lt;b&gt;låst opp&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>
@@ -554,7 +572,7 @@ Adresse: %4
</message>
<message>
<source>After Fee:</source>
- <translation>Etter Gebyr:</translation>
+ <translation>Totalt:</translation>
</message>
<message>
<source>Change:</source>
@@ -562,15 +580,15 @@ Adresse: %4
</message>
<message>
<source>(un)select all</source>
- <translation>velg (fjern) alt</translation>
+ <translation>velg (fjern) alle</translation>
</message>
<message>
<source>Tree mode</source>
- <translation>Tremodus</translation>
+ <translation>Trevisning</translation>
</message>
<message>
<source>List mode</source>
- <translation>Listemodus</translation>
+ <translation>Listevisning</translation>
</message>
<message>
<source>Amount</source>
@@ -634,7 +652,7 @@ Adresse: %4
</message>
<message>
<source>Copy after fee</source>
- <translation>Kopier fra gebyr</translation>
+ <translation>Kopier totalt</translation>
</message>
<message>
<source>Copy bytes</source>
@@ -697,6 +715,18 @@ Adresse: %4
<translation>ingen</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Denne teksten blir rød hvis transaksjonsstørrelsen er større enn 1000 bytes.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Denne teksten blir rød hvis prioriteten er lavere enn "medium".</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>Denne teksten blir rød dersom en mottaker mottar et beløp mindre enn %1.</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation>Kan variere +/- %1 satoshi(er) per input.</translation>
</message>
@@ -709,10 +739,6 @@ Adresse: %4
<translation>nei</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Denne merkelappen blir rød, hvis transaksjonsstørrelsen er større enn 1000 bytes.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Dette betyr at et gebyr på minst %1 per KB er påkrevd.</translation>
</message>
@@ -725,14 +751,6 @@ Adresse: %4
<translation>Transaksjoner med høyere prioritet har mer sannsynlighet for å bli inkludert i en blokk.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Denne merkelappen blir rød, hvis prioriteten er mindre enn "medium".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Denne merkelappen blir rød, hvis en mottaker mottar en mengde på mindre enn %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(ingen merkelapp)</translation>
</message>
@@ -853,30 +871,6 @@ Adresse: %4
<source>command-line options</source>
<translation>kommandolinjevalg</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>valg i brukergrensesnitt</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Sett språk, for eksempel "nb_NO" (standardverdi: fra operativsystem)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Start minimert</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Sett SSL-rotsertifikat for betalingsetterspørring (standard: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Vis splashskjerm ved oppstart (standardverdi: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Velg datamappe ved oppstart (standard: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -959,14 +953,6 @@ Adresse: %4
<translation>&amp;Hoved</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Start Bitcoin automatisk etter innlogging.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Start Bitcoin ved systeminnlogging</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Størrelse på &amp;database hurtigbuffer</translation>
</message>
@@ -991,6 +977,14 @@ Adresse: %4
<translation>IP-adressen til proxyen (f.eks. IPv4: 127.0.0.1 / IPv6: ::1)</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>Minimer i stedet for å avslutte applikasjonen når vinduet lukkes. Når dette er valgt, vil applikasjonen avsluttes kun etter at Avslutte er valgt i menyen.</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>Språk for brukergrensesnittet kan velges her. Denne innstillingen trer i kraft etter omstart av Bitcoin Core.</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>Tredjepart URLer (f. eks. en blokkutforsker) som dukker opp i transaksjonsfanen som kontekst meny elementer. %s i URLen er erstattet med transaksjonen sin hash. Flere URLer er separert av en vertikal linje |.</translation>
</message>
@@ -1015,6 +1009,14 @@ Adresse: %4
<translation>&amp;Nettverk</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>Start Bitcoin Core automatisk ved oppstart av datamaskinen.</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>&amp;Start Bitcoin Core ved oppstart av datamaskinen</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = automatisk, &lt;0 = la så mange kjerner være ledig)</translation>
</message>
@@ -1079,10 +1081,6 @@ Adresse: %4
<translation>&amp;Minimer til systemkurv istedenfor oppgavelinjen</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 Quit in the menu.</source>
- <translation>Minimerer vinduet istedenfor å avslutte applikasjonen når vinduet lukkes. Når dette er slått på avsluttes applikasjonen kun ved å velge avslutt i menyen.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimer ved lukking</translation>
</message>
@@ -1095,10 +1093,6 @@ Adresse: %4
<translation>&amp;Språk for brukergrensesnitt</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Språket for brukergrensesnittet kan settes her. Innstillingen trer i kraft ved omstart av Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Enhet for visning av beløper:</translation>
</message>
@@ -1135,8 +1129,8 @@ Adresse: %4
<translation>Omstart av klienten er nødvendig for å aktivere endringene.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Klienten vil bli lukket, vil du fortsette?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>Klienten vil bli lukket. Ønsker du å gå videre?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1221,10 +1215,6 @@ Adresse: %4
<source>Current total balance in watch-only addresses</source>
<translation>Nåværende totale balanse i kun observerbare adresser</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>ute av synk</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1245,10 +1235,6 @@ Adresse: %4
<translation>Nettverk for betalingsetterspørring er ikke i overensstemmelse med klientnettverket.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Betalingsetterspørringen har utløpt.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>Betalingsetterspørringen er ikke initialisert.</translation>
</message>
@@ -1281,14 +1267,30 @@ Adresse: %4
<translation>Betalingsetterspørringsfil kan ikke leses! Dette kan være forårsaket av en ugyldig betalingsetterspørringsfil.</translation>
</message>
<message>
+ <source>Payment request expired.</source>
+ <translation>Betalingsetterspørringen har utløpt.</translation>
+ </message>
+ <message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>Uverifiserte betalingsforespørsler til egentilpassede betalingscript er ikke støttet.</translation>
</message>
<message>
+ <source>Invalid payment request.</source>
+ <translation>Ugyldig betalingsetterspørring.</translation>
+ </message>
+ <message>
<source>Refund from %1</source>
<translation>Refundering fra %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>Betalingsforespørsel %1 er for stor (%2 bytes, tillatt %3 bytes).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Betalingsforespørsel DoS-beskyttelse</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Feil i kommunikasjonen med %1: %2</translation>
</message>
@@ -1316,8 +1318,8 @@ Adresse: %4
<translation>Brukeragent</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adresse/Vertsnavn</translation>
+ <source>Node/Service</source>
+ <translation>Node/Tjeneste</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1351,14 +1353,6 @@ Adresse: %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>NETTVERK</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>UKJENT</translation>
- </message>
- <message>
<source>None</source>
<translation>Ingen</translation>
</message>
@@ -1449,6 +1443,10 @@ Adresse: %4
<translation>Nåværende antall blokker</translation>
</message>
<message>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Åpne Bitcoin Core sin loggfil for feilsøk fra gjeldende datamappe. Dette kan ta noen sekunder for store loggfiler.</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Mottatt</translation>
</message>
@@ -1517,6 +1515,10 @@ Adresse: %4
<translation>Ping-tid</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation>Tidsforskyvning</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Tidspunkt for siste blokk</translation>
</message>
@@ -1557,16 +1559,12 @@ Adresse: %4
<translation>Loggfil for feilsøk</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Åpne Bitcoin sin loggfil for feilsøk fra den gjeldende datamappen. Dette kan ta noen sekunder for store loggfiler.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Tøm konsoll</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Velkommen til Bitcoin sin RPC-konsoll.</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Velkommen til Bitcoin Core sin RPC-konsoll.</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
@@ -1857,14 +1855,6 @@ Adresse: %4
<translation>Legg ned gebyrinnstillinger</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Minimer</translation>
- </message>
- <message>
- <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
- <translation>Hvis den egendefinerte avgiften er satt til 1000 satoshis og transaksjonen bare er 250 bytes, da vil "per kilobyte" bare betale 250 satoshis i gebyr, mens "minst" betaler 1000 satoshis. For transaksjoner større enn en kilobyte vil begge betale for antall kilobyte.</translation>
- </message>
- <message>
<source>per kilobyte</source>
<translation>per kilobyte</translation>
</message>
@@ -1873,6 +1863,10 @@ Adresse: %4
<translation>Hvis den egendefinerte avgiften er satt til 1000 satoshis og transaksjonen bare er 250 bytes, da vil "per kilobyte" bare betale 250 satoshis i gebyr, mens "minstebeløp" betaler 1000 satoshis. For transaksjoner større enn en kilobyte vil begge betale for antall kilobyte.</translation>
</message>
<message>
+ <source>Hide</source>
+ <translation>Skjul</translation>
+ </message>
+ <message>
<source>total at least</source>
<translation>minstebeløp</translation>
</message>
@@ -1993,10 +1987,6 @@ Adresse: %4
<translation>eller</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Adresse for mottaker er ugyldig.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Beløpet som skal betales må være over 0.</translation>
</message>
@@ -2009,10 +1999,6 @@ Adresse: %4
<translation>Totalbeløpet overstiger saldo etter at %1 transaksjonsgebyr er lagt til.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Doble antall adresser funnet. Kan bare sende en gang til hver adresse per operasjon.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Opprettelse av transaksjon feilet!</translation>
</message>
@@ -2021,16 +2007,28 @@ Adresse: %4
<translation>Transaksjonen ble avvist! Dette kan skje hvis noen av myntene i lommeboken allerede er brukt, som hvis du kopierte wallet.dat og mynter ble brukt i kopien uten å bli markert som brukt her.</translation>
</message>
<message>
- <source>A fee higher than %1 is considered an insanely high fee.</source>
- <translation>Et gebyr høyere enn %1 er ansett som et sinnsykt høyt gebyr.</translation>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation>Et gebyr høyere enn %1 er ansett som et absurd høyt gebyr.</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>Betalingsetterspørringen har utløpt.</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation><numerusform>Anslått til å begynne bekreftelse innen %n blokk.</numerusform><numerusform>Anslått til å begynne bekreftelse innen %n blokker.</numerusform></translation>
</message>
<message>
<source>Pay only the minimum fee of %1</source>
<translation>Betal kun minimumsgebyret på %1</translation>
</message>
<message>
- <source>Estimated to begin confirmation within %1 block(s).</source>
- <translation>Beregner å begynne bekreftelse innen %1 blokk(er).</translation>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>Mottakeradressen er ikke gyldig. Vennligst kontroller på nytt.</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation>Gjenbruk av adresse funnet: adresser skal bare brukes en gang hver.</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
@@ -2104,12 +2102,24 @@ Adresse: %4
<translation>Fjern denne oppføringen</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>Gebyret vil bli trukket fra beløpet som blir sendt. Mottakeren vil motta mindre bitcoins enn det du skriver inn i beløpsfeltet. Hvis det er valgt flere mottakere, deles gebyret likt.</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation>T&amp;rekk fra gebyr fra beløp</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Melding:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Dette er en verifisert betalingsetterspørring</translation>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>Dette er en uautorisert betalingsetterspørring.</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>Dette er en autorisert betalingsetterspørring.</translation>
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
@@ -2120,10 +2130,6 @@ Adresse: %4
<translation>En melding som var tilknyttet bitcoinen: URI vil bli lagret med transaksjonen for din oversikt. Denne meldingen vil ikke bli sendt over Bitcoin-nettverket.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Dette er en uverifisert betalingsetterspørring</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Betal Til:</translation>
</message>
@@ -2154,8 +2160,8 @@ Adresse: %4
<translation>&amp;Signer Melding</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Du kan signere meldinger med dine adresser for å bevise at du eier dem. Ikke signer vage meldinger da phishing-angrep kan prøve å lure deg til å signere din identitet over til andre. Signer kun fullt detaljerte utsagn som du er enig i.</translation>
+ <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>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>
@@ -2210,8 +2216,8 @@ Adresse: %4
<translation>&amp;Verifiser Melding</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Angi adresse for signering, melding (vær sikker på at du kopierer linjeskift, mellomrom, tab, etc. helt nøyaktig) og signatur under for å verifisere meldingen. Vær forsiktig med at du ikke gir signaturen mer betydning enn det som faktisk står i meldingen, for å unngå å bli lurt av såkalte "man-in-the-middle" angrep.</translation>
+ <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>Skriv inn mottakerens adresse, melding (forsikre deg om at du kopier linjeskift, mellomrom, faner osv. nøyaktig) og underskrift nedenfor for å bekrefte meldingen. Vær forsiktig så du ikke leser mer ut av signaturen enn hva som er i den signerte meldingen i seg selv, for å unngå å bli lurt av et man-in-the-middle-angrep. Merk at dette bare beviser at den som signerer kan motta med adressen, dette beviser ikke hvem som har sendt transaksjoner!</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
@@ -2477,10 +2483,6 @@ Adresse: %4
<translation>Type</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresse</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Umoden (%1 bekreftelser, vil være tilgjengelig etter %2)</translation>
</message>
@@ -2509,6 +2511,10 @@ Adresse: %4
<translation>Frakoblet</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Merkelapp</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Ubekreftet</translation>
</message>
@@ -2565,8 +2571,8 @@ Adresse: %4
<translation>Hvorvidt en kun observerbar adresse er involvert i denne transaksjonen.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Mottaksadresse for transaksjonen.</translation>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation>Brukerdefinert intensjon/hensikt med transaksjonen.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2807,33 +2813,14 @@ Adresse: %4
<translation>Ta imot tilkoblinger fra utsiden (standardverdi: 1 hvis uten -proxy eller -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, du må angi rpcpassord i konfigurasjonsfilen.
-%s
-Det anbefales at du bruker det følgende tilfeldige passordet:
-rpcbruker=bitcoinrpc
-rpcpassord=%s
-(du behøver ikke å huske passordet)
-Brukernavnet og passordet MÅ IKKE være like.
-Om filen ikke eksisterer, opprett den nå med eier-kun-les filrettigheter.
-Det er også anbefalt at å sette varselsmelding slik du får melding om problemer.
-For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Bind til angitt adresse. Bruk [vertsmaskin]:port notasjon for IPv6</translation>
</message>
<message>
+ <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default: %u)</source>
+ <translation>Ratebegrens gratistransaksjoner kontinuerlig til &lt;n&gt;*1000 bytes per minutt (standardverdi: %u)</translation>
+ </message>
+ <message>
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
<translation>Slett alle transaksjoner i lommeboken og gjenopprett kun de delene av blokkjeden gjennom -rescan ved oppstart</translation>
</message>
@@ -2846,14 +2833,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Gå til modus for regresjonstesting, som bruker en spesiell blokkjede der blokker kan bli løst momentant.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Feil: Transaksjonen ble avvist! Dette kan skje hvis noen av myntene i lommeboken allerede er blitt brukt, som om du brukte en kopi av wallet.dat og myntene ble brukt i kopien, men ikke markert som brukt her.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Feil: Denne transaksjonen trenger et gebyr på minst %s på grunn av beløpet, kompleksiteten eller bruk av allerede mottatte penger!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Kjør kommando når en lommeboktransaksjon endres (%s i kommando er erstattet med TxID)</translation>
</message>
@@ -2862,6 +2841,14 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>I denne modusen kontrollerer -genproclimit hvor mange blokker som genereres øyeblikkelig.</translation>
</message>
<message>
+ <source>Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Maksimalt samlede gebyrer til å bruke i en enkelt lommeboktransaksjon; settes dette for lavt kan store transaksjoner kanskje avbrytes (standardverdi: %s)</translation>
+ </message>
+ <message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, &gt;%u = target size in MiB to use for block files)</source>
+ <translation>Reduser lagringsbehovet ved beskjæring (slette) gamle blokker. Denne modusen deaktiverer støtte for lommebok og er ikke kompatibel med -txindex. Advarsel: Tilbakestilling av denne innstillingen krever at hele blokkjeden må lastes ned på nytt. (Standardverdi: 0 = deaktiver beskjæringsblokker, &gt;%u = mål for størrelse i MiB å bruke for blokkfiler)</translation>
+ </message>
+ <message>
<source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
<translation>Angi antall tråder for skriptverifisering (%u til %d, 0 = auto, &lt;0 = la det antallet kjerner være ledig, standard: %d)</translation>
</message>
@@ -2930,10 +2917,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Valg for feilsøking/testing:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Oppdag egen IP-adresse (standardverdi: 1 ved lytting og uten -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Ikke last inn lommeboken og deaktiver RPC-kall</translation>
</message>
@@ -2966,10 +2949,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Feil: Lite ledig lagringsplass!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Feil: Lommebok låst, kan ikke opprette transaksjon!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Kunne ikke lytte på noen port. Bruk -listen=0 hvis det er dette du vil.</translation>
</message>
@@ -2998,8 +2977,12 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Bare koble til noder i nettverket &lt;net&gt; (IPv4, IPv6 eller onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Gjenopprett blokkjedeindeks fra blk000??.dat filer</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>Beskjæringsmodus kan ikke konfigureres med en negativ verdi.</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Beskjæringsmodus er ikke kompatibel med -txindex.</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -3038,6 +3021,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Valg for lommebok:</translation>
</message>
<message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>Advarsel: Denne versjonen er utdatert; oppgradering er påkrevd!</translation>
+ </message>
+ <message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>Du må gjenoppbygge databasen med å bruke -reindex for å endre -txindex</translation>
</message>
@@ -3066,14 +3053,14 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Ute av stand til å låse datamappen %s. Bitcoin Core kjører sannsynligvis allerede.</translation>
</message>
<message>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
- <translation>Ratebegrens gratistransaksjoner kontinuerlig til &lt;n&gt;*1000 bytes per minutt (standardverdi: %u)</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Opprett nye filer med standardtillatelser i systemet, i stedet for umask 077 (kun virksom med lommebokfunksjonalitet slått av)</translation>
</message>
<message>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Oppdag egne IP-adresser (standardverdi: 1 ved lytting og ingen -externalip eller -proxy)</translation>
+ </message>
+ <message>
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
<translation>Feil: Lytting etter innkommende tilkoblinger feilet (lytting returnerte feil %s)</translation>
</message>
@@ -3094,14 +3081,34 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Gebyrer (i BTC/Kb) mindre enn dette anses som null gebyr for laging av transaksjoner (standardverdi: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Hvis paytxfee ikke er angitt, inkluderer da nok i gebyr til at transaksjoner gjennomsnittligt bekreftes innen n blokker (standardverdi: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Ugyldig beløp for -maxtxfee=&lt;amount&gt;: '%s' (må være minst minimum relé gebyr på %s for å hindre fastlåste transaksjoner)</translation>
+ </message>
+ <message>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation>Maksimal størrelse på data i databærende transaksjoner vi videresender og ufører graving på (standardverdi: %u)</translation>
</message>
<message>
+ <source>Prune configured below the minimum of %d MB. Please use a higher number.</source>
+ <translation>Beskjæringsmodus er konfigurert under minimum på %d MB. Vennligst bruk et høyere nummer.</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Søk etter nodeadresser via DNS-oppslag, hvis vi har få adresser å koble til (standard: 1 med mindre -connect)</translation>
</message>
<message>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>Bruk tilfeldig identitet for hver proxytilkobling. Dette muliggjør TOR stream isolasjon (standardverdi: %u)</translation>
+ </message>
+ <message>
+ <source>Require high priority for relaying free or low-fee transactions (default: %u)</source>
+ <translation>Krev høy prioritet for videresending av gratistransaksjoner eller transaksjoner med lavt gebyr (standardverdi: %u)</translation>
+ </message>
+ <message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation>Sett maksimum størrelse for transaksjoner med høy prioritet / lavt gebyr, i bytes (standardverdi: %d)</translation>
</message>
@@ -3110,10 +3117,42 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Angi antall tråder for mynt generering hvis aktivert (-1 = alle kjerner, standardverdi: %d)</translation>
</message>
<message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>Transaksjonsbeløpet er for lite til å sendes etter at gebyret er fratrukket</translation>
+ </message>
+ <message>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation>Dette produktet inneholder programvare utviklet av OpenSSL Project for bruk i OpenSSL Toolkit &lt;https://www.openssl.org/&gt; og kryptografisk programvare skrevet av Eric Young og UPnP-programvare skrevet av Thomas Bernard.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>For å bruke bitcoind, eller -server valget til bitcoin-qt, må du angi et rpcpassord i konfigurasjonsfilen:
+%s
+Det anbefales at du bruker det følgende tilfeldige passordet:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(du behøver ikke å huske passordet)
+Brukernavnet og passordet MÅ IKKE være like.
+Om filen ikke eksisterer, opprett den med eier-kun-les filrettigheter.
+Det er også anbefalt at å sette varselsmelding slik du får melding om problemer;
+for eksempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Advarsel: -paytxfee er satt veldig høyt! Så stort gebyr kan bli betalt ved en enkelt transaksjon.</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Advarsel: Vennligst undersøk at din datamaskin har riktig dato og klokkeslett! Hvis klokken er stilt feil vil ikke Bitcoin Core fungere riktig.</translation>
</message>
@@ -3122,10 +3161,38 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Hvitlistede noder kan ikke DoS-blokkeres, og deres transaksjoner videresendes alltid, selv om de allerede er i minnelageret. Nyttig f.eks. for en gateway.</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>Du må gjenoppbygge databasen ved hjelp av -reindex for å gå tilbake til ubeskåret modus. Dette vil laste ned hele blokkjeden på nytt.</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(standardverdi: %u)</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Godta offentlige REST forespørsler (standardverdi: %u)</translation>
+ </message>
+ <message>
+ <source>Activating best chain...</source>
+ <translation>Aktiverer beste kjede...</translation>
+ </message>
+ <message>
+ <source>Allow self signed root certificates (default: 0)</source>
+ <translation>Tillat selvsignerte rotsertifikater (standardverdi: 0)</translation>
+ </message>
+ <message>
+ <source>Can't run with a wallet in prune mode.</source>
+ <translation>Kan ikke kjøre med en lommebok i beskjæringsmodus.</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>Kan ikke løse -whitebind-adresse: '%s'</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Velg datamappe ved oppstart (standard: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Koble til via SOCKS5-proxy</translation>
</message>
@@ -3142,6 +3209,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Feil ved lasting av wallet.dat: Lommeboken krever en nyere versjon av Bitcoin Core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Feil ved lesing fra database, stenger ned.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Feil: Argumentet -tor er ikke støttet, bruk -onion.</translation>
</message>
@@ -3158,6 +3229,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Sunnhetssjekk ved oppstart feilet. Bitcoin Core stenges ned.</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Ugyldig beløp for -maxtxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Ugyldig mengde for -minrelaytxfee=&lt;beløp&gt;: '%s'</translation>
</message>
@@ -3174,10 +3249,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Ugyldig nettmaske spesifisert i -whitelist: '%s'</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Behold på det meste &lt;n&gt; blokker i minnet som ikke er mulig å koble (standardverdi: %u)</translation>
- </message>
- <message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>Hold på det meste &lt;n&gt; transaksjoner som ikke kobles i minnet (standardverdi: %u)</translation>
</message>
@@ -3190,10 +3261,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Node alternativer for videresending:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Skriv ut blokken ved oppstart, hvis funnet i blokkindeksen</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>RPC SSL-valg: (se Bitcoin Wiki for oppsettsinstruksjoner for SSL)</translation>
</message>
@@ -3202,6 +3269,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Innstillinger for RPC-server:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>RPC-støtte for persistente HTTP-forbindelser (standardverdi: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Slumpvis dropp 1 av hver &lt;n&gt; nettverksmeldinger</translation>
</message>
@@ -3210,6 +3281,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Slumpvis bland 1 av hver &lt;n&gt; nettverksmeldinger</translation>
</message>
<message>
+ <source>Rebuild block chain index from current blk000??.dat files on startup</source>
+ <translation>Gjenopprett blokkjedeindeks fra gjeldende blk000??.dat filer ved oppstart</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Send spor-/feilsøkingsinformasjon til konsollen istedenfor filen debug.log</translation>
</message>
@@ -3218,10 +3293,22 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Send transaksjoner uten transaksjonsgebyr hvis mulig (standardverdi: %u)</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Sett SSL-rotsertifikat for betalingsetterspørring (standard: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Sett språk, for eksempel "nb_NO" (standardverdi: fra operativsystem)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Vis alle feilsøkingsvalg (bruk: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Vis splashskjerm ved oppstart (standardverdi: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Krymp filen debug.log når klienten starter (standardverdi: 1 hvis uten -debug)</translation>
</message>
@@ -3230,6 +3317,14 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Signering av transaksjon feilet</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Start minimert</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>Transaksjonsbeløpet er for lite til å betale gebyr</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Dette er eksperimentell programvare.</translation>
</message>
@@ -3242,10 +3337,18 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Transaksjonsbeløpet må være positivt</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transaksjon for stor for gebyrpolitikken</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Transaksjonen er for stor</translation>
</message>
<message>
+ <source>UI Options:</source>
+ <translation>Innstillinger for Brukergrensesnitt:</translation>
+ </message>
+ <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation>Kan ikke binde til %s på denne datamaskinen (binding returnerte feilen %s)</translation>
</message>
@@ -3266,10 +3369,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Advarsel</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Advarsel: Denne versjonen er foreldet, oppgradering kreves!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Advarsel: Argumentet -benchmark er ikke støttet og ble ignorert, bruk -debug=bench.</translation>
</message>
@@ -3338,10 +3437,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Hvor grundig blokkverifiseringen til -checkblocks er (0-4, standardverdi: %u)</translation>
</message>
<message>
- <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
- <translation>Hvis paytxfee ikke er angitt, inkluderer da nok gebyr til at transaksjoner gjennomsnittligt bekreftes innen n blokker (standardverdi: %u)</translation>
- </message>
- <message>
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
<translation>Logg transaksjonsprioritet og gebyr per kB under blokkutvinning (standardverdi: %u)</translation>
</message>
@@ -3418,6 +3513,10 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Hold maks &lt;n&gt; koblinger åpne til andre noder (standardverdi: %u)</translation>
</message>
<message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>Få lommeboken til å kringkaste transaksjoner</translation>
+ </message>
+ <message>
<source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
<translation>Maks mottaksbuffer per forbindelse, &lt;n&gt;*1000 bytes (standardverdi: %u)</translation>
</message>
@@ -3434,10 +3533,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Sett inn tidsstempel i front av feilsøkingsdata (standardverdi: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Skriv ut blokktreet ved oppstart (standardverdi: %u)</translation>
- </message>
- <message>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation>Videresend og ufør graving av databærende transaksjoner (standardverdi: %u)</translation>
</message>
@@ -3514,10 +3609,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Ugyldig beløp for -paytxfee=&lt;beløp&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Ugyldig beløp</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Utilstrekkelige midler</translation>
</message>
@@ -3550,10 +3641,6 @@ For eksempel: varselmelding=echo %%s | mail -s "Bitcoin Varsel" admin@foo.com</t
<translation>Ferdig med lasting</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>For å bruke %s opsjonen</translation>
- </message>
- <message>
<source>Error</source>
<translation>Feil</translation>
</message>
diff --git a/src/qt/locale/bitcoin_nl.ts b/src/qt/locale/bitcoin_nl.ts
index 258c7f109f..385972845a 100644
--- a/src/qt/locale/bitcoin_nl.ts
+++ b/src/qt/locale/bitcoin_nl.ts
@@ -1,13 +1,13 @@
-<TS language="nl" version="2.0">
+<TS language="nl" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dubbelklik om het adres of label te wijzigen</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Klik met de rechtermuisknop om het adres of label te wijzigen</translation>
</message>
<message>
<source>Create a new address</source>
- <translation>Maak een nieuw adres aan</translation>
+ <translation>Maak een nieuw adres</translation>
</message>
<message>
<source>&amp;New</source>
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation>Kopieer het huidig geselecteerde adres naar het klembord</translation>
+ <translation>Kopieer het geselecteerde adres naar het klembord</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -51,7 +51,7 @@
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation>Kies het adres om munten voor te ontvangen</translation>
+ <translation>Kies het adres om munten op te ontvangen</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -59,15 +59,15 @@
</message>
<message>
<source>Sending addresses</source>
- <translation>Bezig met het versturen van de adressen</translation>
+ <translation>Verstuur adressen</translation>
</message>
<message>
<source>Receiving addresses</source>
- <translation>Adressen ontvangen</translation>
+ <translation>Ontvang adressen</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>Dit zijn uw Bitcoinadressen om betalingen mee te verzenden. Controleer altijd het bedrag en het ontvangende adres voordat u uw bitcoins verzendt.</translation>
+ <translation>Dit zijn uw Bitcoinadressen om betalingen mee te verzenden. Controleer altijd het bedrag en het ontvang adres voordat u uw bitcoins verzendt.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
@@ -117,7 +117,7 @@
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation>Wachtwoorddialoogscherm</translation>
+ <translation>Wachtwoorddialoog</translation>
</message>
<message>
<source>Enter passphrase</source>
@@ -156,10 +156,6 @@
<translation>Wijzig wachtwoord</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Vul uw oude en nieuwe portemonneewachtwoord in.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Bevestig versleuteling van de portemonnee</translation>
</message>
@@ -172,6 +168,10 @@
<translation>Weet u zeker dat u uw portemonnee wilt versleutelen?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Bitcoin Core zal nu afsluiten om het versleutelingsproces te voltooien. Hou er rekening mee dat versleuteling van je portemonnee je niet volledig beschermt tegen diefstal van jouw bitcoins door malware op je computer.</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>BELANGRIJK: Elke eerder gemaakte backup van uw portemonneebestand dient u te vervangen door het nieuw gegenereerde, versleutelde portemonneebestand. Om veiligheidsredenen zullen eerdere backups van het niet-versleutelde portemonneebestand onbruikbaar worden zodra u uw nieuwe, versleutelde, portemonnee begint te gebruiken.</translation>
</message>
@@ -185,11 +185,11 @@
</message>
<message>
<source>Enter the new passphrase to 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>Vul een nieuw </translation>
+ <translation>Voer een nieuw wachtwoord in voor uw portemonnee.&lt;br/&gt;Gebruik een wachtwoord van &lt;b&gt;tien of meer willekeurige karakters&lt;/b&gt;, of &lt;b&gt;acht of meer woorden&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin zal nu afsluiten om het versleutelingsproces te voltooien. Onthoud dat het versleutelen van uw portemonnee u niet volledig kan beschermen: Malware kan uw computer infecteren en uw bitcoins stelen.</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Voer het oude en nieuwe wachtwoord in voor uw portemonnee.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -240,7 +240,7 @@
</message>
<message>
<source>Show general overview of wallet</source>
- <translation>Toon algemeen overzicht van de portemonnee</translation>
+ <translation>Toon algemeen overzicht van uw portemonnee</translation>
</message>
<message>
<source>&amp;Transactions</source>
@@ -284,11 +284,11 @@
</message>
<message>
<source>&amp;Sending addresses...</source>
- <translation>&amp;Adressen aan het versturen.</translation>
+ <translation>V&amp;erstuur adressen...</translation>
</message>
<message>
<source>&amp;Receiving addresses...</source>
- <translation>&amp;Adressen aan het ontvangen...</translation>
+ <translation>O&amp;ntvang adressen...</translation>
</message>
<message>
<source>Open &amp;URI...</source>
@@ -296,7 +296,7 @@
</message>
<message>
<source>Bitcoin Core client</source>
- <translation>Bitcoin kern applicatie</translation>
+ <translation>Bitcoin Kern applicatie</translation>
</message>
<message>
<source>Importing blocks from disk...</source>
@@ -311,10 +311,6 @@
<translation>Verstuur munten naar een Bitcoinadres</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Wijzig instellingen van Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Backup portemonnee naar een andere locatie</translation>
</message>
@@ -424,11 +420,15 @@
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n actieve connectie naar Bitcoinnetwerk</numerusform><numerusform>%n actieve connecties naar Bitcoinnetwerk</numerusform></translation>
+ <translation><numerusform>%n actieve connectie naar Bitcoin netwerk</numerusform><numerusform>%n actieve connecties naar Bitcoin netwerk</numerusform></translation>
</message>
<message>
<source>No block source available...</source>
- <translation>Geen bron van blokken beschikbaar...</translation>
+ <translation>Geen bron voor blokken beschikbaar...</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>%n blok aan transactie geschiedenis verwerkt.</numerusform><numerusform>%n blokken aan transactie geschiedenis verwerkt.</numerusform></translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
@@ -478,35 +478,49 @@
<source>Up to date</source>
<translation>Bijgewerkt</translation>
</message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>%n Blok verwerkt van transactie geschiedenis.</numerusform><numerusform>%n Blokken verwerkt van transactie geschiedenis.</numerusform></translation>
- </message>
<message>
<source>Catching up...</source>
<translation>Aan het bijwerken...</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>Verzonden transactie</translation>
+ <source>Date: %1
+</source>
+ <translation>Datum: %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>Binnenkomende transactie</translation>
+ <source>Amount: %1
+</source>
+ <translation>Aantal: %1
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Type: %1
</source>
- <translation>Datum: %1
-Bedrag: %2
-Type: %3
-Adres: %4
+ <translation>Type: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>Label: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Adres: %1
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation>Verzonden transactie</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Binnenkomende transactie</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Portemonnee is &lt;b&gt;versleuteld&lt;/b&gt; en momenteel &lt;b&gt;geopend&lt;/b&gt;</translation>
</message>
@@ -618,7 +632,7 @@ Adres: %4
</message>
<message>
<source>Lock unspent</source>
- <translation>Blokeer niet gebruikte</translation>
+ <translation>Blokeer ongebruikte</translation>
</message>
<message>
<source>Unlock unspent</source>
@@ -697,6 +711,18 @@ Adres: %4
<translation>geen</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Dit label wordt rood als de transactie groter is dan 1000 bytes.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Dit label wordt rood als de prioriteit lager is dan "gemiddeld".</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>Dit label wordt rood wanneer een ontvanger minder dan %1 krijgt.</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation>Kan per input +/- %1 satoshi(s) variëren.</translation>
</message>
@@ -709,10 +735,6 @@ Adres: %4
<translation>nee</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Dit label wordt rood, als de transactie grootte meer dan 1000 bytes is.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Dit betekent dat een vergoeding van minimaal %1 per kB nodig is.</translation>
</message>
@@ -725,14 +747,6 @@ Adres: %4
<translation>Transacties met een hogere prioriteit zullen eerder in een block gezet worden.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Als dit label rood is, is de prioriteit minder dan "medium".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Dit label wordt rood, als een ontvanger een bedrag van minder dan %1 gekregen heeft.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(geen label)</translation>
</message>
@@ -853,30 +867,6 @@ Adres: %4
<source>command-line options</source>
<translation>commandoregel-opties</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>gebruikersinterfaceopties</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Stel taal in, bijvoorbeeld ''de_DE" (standaard: systeeminstellingen)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Geminimaliseerd starten</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Zet SSL root certificaten voor betalingsverzoek (standaard: -sytem-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Laat laadscherm zien bij het opstarten. (standaard: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Kies de gegevensmap tijdens het opstarten (standaard: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -959,14 +949,6 @@ Adres: %4
<translation>&amp;Algemeen</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Start Bitcoin automatisch na inloggen in het systeem</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>Start &amp;Bitcoin bij het inloggen in het systeem</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Grootte van de &amp;database cache</translation>
</message>
@@ -991,6 +973,10 @@ Adres: %4
<translation>IP-adres van de proxy (bijv. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
<message>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>Stel hier de taal van de applicatie in. Deze instelling zal van kracht worden na het herstarten van de applicatie.</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>Derde partijen URL's (bijvoorbeeld block explorer) dat in de transacties tab verschijnen als contextmenu elementen. %s in de URL is vervangen door transactie hash. Verscheidene URL's zijn gescheiden door een verticale streep |. </translation>
</message>
@@ -1015,6 +1001,14 @@ Adres: %4
<translation>&amp;Netwerk</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>Bitcoin Kern automatisch starten bij inloggen.</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>&amp;Start Bitcoin Kern tijdens login.</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = auto, &lt;0 = laat dit aantal kernen vrij)</translation>
</message>
@@ -1079,10 +1073,6 @@ Adres: %4
<translation>&amp;Minimaliseer naar het systeemvak in plaats van de taakbalk</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 Quit in the menu.</source>
- <translation>Minimaliseer het venster in de plaats van de applicatie af te sluiten als het venster gesloten wordt. Wanneer deze optie aan staan, kan de applicatie alleen worden afgesloten door Afsluiten te kiezen in het menu.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>Minimaliseer bij sluiten van het &amp;venster</translation>
</message>
@@ -1095,10 +1085,6 @@ Adres: %4
<translation>Taal &amp;Gebruikersinterface:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>De taal van de gebruikersinterface kan hier ingesteld worden. Deze instelling zal pas van kracht worden nadat Bitcoin herstart wordt.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Eenheid om bedrag in te tonen:</translation>
</message>
@@ -1135,8 +1121,8 @@ Adres: %4
<translation>Herstart van de client is vereist om veranderingen door te voeren.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>De client zal worden afgesloten, wilt u doorgaan?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>Applicatie zal worden afgesloten. Wilt u doorgaan?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1221,10 +1207,6 @@ Adres: %4
<source>Current total balance in watch-only addresses</source>
<translation>Huidige balans in alleen-bekijkbare adressen.</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>niet gesynchroniseerd</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1245,10 +1227,6 @@ Adres: %4
<translation>Betalingsaanvraagnetwerk komt niet overeen met klantennetwerk.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Betalingsverzoek is verlopen.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>Betalingsaanvraag is niet geïnitialiseerd.</translation>
</message>
@@ -1289,6 +1267,14 @@ Adres: %4
<translation>Restitutie van %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>Betalingsverzoek %1 is te groot (%2 bytes, toegestaan ​​%3 bytes).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Betalingsaanvraag DoS bescherming</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Fout bij communiceren met %1: %2</translation>
</message>
@@ -1316,10 +1302,6 @@ Adres: %4
<translation>User Agent</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adres/Hostnaam</translation>
- </message>
- <message>
<source>Ping Time</source>
<translation>Ping tijd</translation>
</message>
@@ -1351,14 +1333,6 @@ Adres: %4
<translation>%1s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>Netwerk</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>ONBEKEND</translation>
- </message>
- <message>
<source>None</source>
<translation>Geen</translation>
</message>
@@ -1557,18 +1531,10 @@ Adres: %4
<translation>Debug-logbestand</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Open het Bitcoindebug-logbestand van de huidige datamap. Dit kan een aantal seconden duren voor grote logbestanden.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Maak console leeg</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Welkom bij de Bitcoin RPC-console.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Gebruik de pijltjestoetsen om door de geschiedenis te navigeren, en &lt;b&gt;Ctrl-L&lt;/b&gt; om het scherm leeg te maken.</translation>
</message>
@@ -1853,18 +1819,30 @@ Adres: %4
<translation>Kies...</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Minimaliseer</translation>
+ <source>collapse fee-settings</source>
+ <translation>Transactiekosteninstellingen verbergen</translation>
</message>
<message>
<source>per kilobyte</source>
<translation>per kilobyte</translation>
</message>
<message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>Als de aangepaste toeslag is ingesteld op 1000 satoshis en de transactie is maar 250 bytes, dan wordt bij "per kilobyte" 250 satoshis aan toeslag berekend, terwijl er bij "totaal tenminste" 1000 satoshis worden berekend. Voor transacties die groter zijn dan een kilobyte, wordt in beide gevallen per kilobyte de toeslag berekend.</translation>
+ </message>
+ <message>
<source>total at least</source>
<translation>totaal ten minste</translation>
</message>
<message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>De minimale toeslag betalen is prima mits het transactievolume kleiner is dan de ruimte in de blokken. Let wel op dat dit tot gevolg kan hebben dat een transactie nooit wordt bevestigd als er meer vraag is naar bitcointransacties dan het netwerk kan verwerken.</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(lees de tooltip)</translation>
+ </message>
+ <message>
<source>Recommended:</source>
<translation>Aanbevolen:</translation>
</message>
@@ -1873,6 +1851,10 @@ Adres: %4
<translation>Handmatig:</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(Slimme vergoeding is nog niet geïnitialiseerd. Dit duurt meestal een paar blokken...)</translation>
+ </message>
+ <message>
<source>Confirmation time:</source>
<translation>Bevestigings tijd:</translation>
</message>
@@ -1885,6 +1867,10 @@ Adres: %4
<translation>snel</translation>
</message>
<message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Verstuur als transactie zonder verzendkosten indien mogelijk</translation>
+ </message>
+ <message>
<source>(confirmation may take longer)</source>
<translation>(bevestiging kan langer duren)</translation>
</message>
@@ -1965,10 +1951,6 @@ Adres: %4
<translation>of</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Het ontvangstadres is niet geldig, controleer uw invoer.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Het ingevoerde bedrag moet groter zijn dan 0.</translation>
</message>
@@ -1981,10 +1963,6 @@ Adres: %4
<translation>Totaal overschrijdt uw huidige saldo wanneer de %1 transactiekosten worden meegerekend</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Dubbel adres gevonden, u kunt slechts eenmaal naar een bepaald adres verzenden per verstuurtransactie</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Transactie creatie niet gelukt!</translation>
</message>
@@ -1993,18 +1971,10 @@ Adres: %4
<translation>De transactie was afgewezen. Dit kan gebeuren als u eerder uitgegeven munten opnieuw wilt versturen, zoals wanneer u een kopie van uw wallet.dat heeft gebruikt en in de kopie deze munten zijn gemarkeerd als uitgegeven, maar in de huidige nog niet.</translation>
</message>
<message>
- <source>A fee higher than %1 is considered an insanely high fee.</source>
- <translation>Transactiekosten hoger dan %1 worden gezien als waanzinnig hoog.</translation>
- </message>
- <message>
<source>Pay only the minimum fee of %1</source>
<translation>Betaal alleen de minimale transactiekosten van %1</translation>
</message>
<message>
- <source>Estimated to begin confirmation within %1 block(s).</source>
- <translation>Beginnen van bevesting geschat binnen %1 blok(ken).</translation>
- </message>
- <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Waarschuwing: Ongeldig Bitcoin adres</translation>
</message>
@@ -2080,10 +2050,6 @@ Adres: %4
<translation>Bericht:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Dit is een geverifieerd betalingsverzoek.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Vul een label voor dit adres in om het aan de lijst met gebruikte adressen toe te voegen</translation>
</message>
@@ -2092,10 +2058,6 @@ Adres: %4
<translation>Een bericht dat werd toegevoegd aan de bitcoin: URI dewelke wordt opgeslagen met de transactie ter referentie. Opmerking: Dit bericht zal niet worden verzonden over het Bitcoin netwerk.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Dit is een ongeverifieerd betalingsverzoek.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Betaal Aan:</translation>
</message>
@@ -2126,10 +2088,6 @@ Adres: %4
<translation>O&amp;nderteken Bericht</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>U kunt berichten ondertekenen met een van uw adressen om te bewijzen dat u dit adres bezit. Pas op dat u geen onduidelijke dingen ondertekent, want phishingaanvallen zouden u kunnen misleiden om zo uw identiteit te stelen. Onderteken alleen berichten waarmee u het volledig eens bent.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>Het Bitcoin adres om bericht mee te ondertekenen</translation>
</message>
@@ -2182,10 +2140,6 @@ Adres: %4
<translation>&amp;Verifiëer Bericht</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Voer het ondertekenende adres, bericht en handtekening hieronder in (let erop dat u nieuwe regels, spaties en tabs juist overneemt) om de handtekening te verifiëren. Let erop dat u niet meer uit het bericht interpreteert dan er daadwerkelijk staat, om te voorkomen dat u wordt misleid in een man-in-the-middle-aanval.</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>Het Bitcoin adres waarmee het bericht ondertekend is</translation>
</message>
@@ -2449,10 +2403,6 @@ Adres: %4
<translation>Type</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>immatuur (%1 bevestigingen, zal beschikbaar zijn na %2)</translation>
</message>
@@ -2481,6 +2431,10 @@ Adres: %4
<translation>Niet verbonden</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Label</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Onbevestigd</translation>
</message>
@@ -2533,8 +2487,8 @@ Adres: %4
<translation>Type transactie.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Ontvangend adres van transactie.</translation>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation>Of er een alleen-bekijken adres is betrokken bij deze transactie.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2775,42 +2729,20 @@ Adres: %4
<translation>Accepteer verbindingen van buitenaf (standaard: 1 als geen -proxy of -connect is opgegeven)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, u moet een RPC-wachtwoord instellen in het configuratiebestand: %s
-U wordt aangeraden het volgende willekeurige wachtwoord te gebruiken:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(u hoeft dit wachtwoord niet te onthouden)
-De gebruikersnaam en wachtwoord mogen niet hetzelfde zijn.
-Als het bestand niet bestaat, make hem dan aan met leesrechten voor enkel de eigenaar.
-Het is ook aan te bevelen "alertnotify" in te stellen zodat u op de hoogte gesteld wordt van problemen;
-bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Bind aan opgegeven adres en luister er altijd op. Gebruik [host]:port notatie voor IPv6</translation>
</message>
<message>
- <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
- <translation>Schakel regressietest-modus in, die een speciale blokketen gebruikt waarin blokken onmiddellijk opgelost kunnen worden.</translation>
+ <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
+ <translation>Verwijder alle transacties van de portemonnee en herstel alleen de delen van de blockchain door -rescan tijdens het opstarten</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Fout: De transactie was afgewezen! Dit kan gebeuren als sommige munten in uw portemonnee al eerder uitgegeven zijn, zoals wanneer u een kopie van uw wallet.dat heeft gebruikt en in de kopie deze munten zijn uitgegeven, maar in deze portemonnee die munten nog niet als zodanig zijn gemarkeerd.</translation>
+ <source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
+ <translation>Uitgegeven onder de MIT software licentie, zie het bijgevoegde bestand COPYING of &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Fout: Deze transactie vereist transactiekosten van tenminste %s, vanwege zijn grootte, complexiteit, of het gebruik van onlangs ontvangen munten!</translation>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>Schakel regressietest-modus in, die een speciale blokketen gebruikt waarin blokken onmiddellijk opgelost kunnen worden.</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
@@ -2853,6 +2785,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Waarschuwing: wallet.dat is corrupt, data is veiliggesteld! Originele wallet.dat is opgeslagen als wallet.{tijdstip}.bak in %s; als uw balans of transacties incorrect zijn dient u een backup terug te zetten.</translation>
</message>
<message>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Goedgekeurde peers die verbinden van het ingegeven netmask of IP adres. Kan meerdere keren gespecificeerd worden.</translation>
+ </message>
+ <message>
<source>(default: 1)</source>
<translation>(standaard: 1)</translation>
</message>
@@ -2885,10 +2821,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Foutopsporing/Testopties:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Ontdek eigen IP-adres (standaard: 1 als er wordt geluisterd en geen -externalip is opgegeven)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Laad de wallet niet en schakel wallet RPC oproepen uit</translation>
</message>
@@ -2913,12 +2845,12 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Fout bij openen blokkendatabase</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>Fout: Weinig vrije diskruimte!</translation>
+ <source>Error: A fatal internal error occured, see debug.log for details</source>
+ <translation>Fout: Een fatale interne fout is opgetreden, zie debug.log voor details</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Fout: Portemonnee vergrendeld, aanmaak transactie niet mogelijk!</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>Fout: Weinig vrije diskruimte!</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
@@ -2945,8 +2877,8 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Niet genoeg file descriptors beschikbaar.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Blokketen opnieuw opbouwen met behulp van huidige blk000??.dat-bestanden</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Verbind alleen met nodes in netwerk &lt;net&gt; (ipv4, ipv6 of onion)</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -2993,26 +2925,143 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Importeert blokken van extern blk000??.dat bestand</translation>
</message>
<message>
+ <source>Allow JSON-RPC connections from specified source. Valid for &lt;ip&gt; are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
+ <translation>Sta JSON-RPC verbindingen toe vanuit een gespecificeerde bron. Geldig voor &lt;ip&gt; zijn een enkel IP (bijv. 1.2.3.4), een netwerk/netmask (bijv. 1.2.3.4/255.255.255.0) of een netwerk/CIDR (bijv. 1.2.3.4/24). Deze optie kan meerdere keren gespecificeerd worden.</translation>
+ </message>
+ <message>
+ <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source>
+ <translation>Er is een fout opgetreden tijdens het opzetten van het RPC adres %s poort %u voor luisteren: %s</translation>
+ </message>
+ <message>
+ <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source>
+ <translation>Bind aan opgegeven adres en keur peers die ermee verbinden goed. Gebruik [host]:poort notatie voor IPv6</translation>
+ </message>
+ <message>
+ <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source>
+ <translation>Bind aan gegeven adres om te luisteren voor JSON-RPC verbindingen. Gebruik [host]:poort notatie voor IPv6. Deze optie kan meerdere keren gespecificeerd worden (standaard: bind aan alle interfaces.</translation>
+ </message>
+ <message>
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
<translation>Kan geen lock verkrijgen op gegevensmap %s. Bitcoin Core draait waarschijnlijk al.</translation>
</message>
<message>
+ <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
+ <translation>Creër nieuwe bestanden met standaard systeem bestandsrechten in plaats van umask 077 (alleen effectief met uitgeschakelde portemonnee functionaliteit)</translation>
+ </message>
+ <message>
+ <source>Error: Listening for incoming connections failed (listen returned error %s)</source>
+ <translation>Fout: luisteren naar binnenkomende verbindingen mislukt (luisteren gaf foutmelding %s)</translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Fout: er is een niet-ondersteund argument -socks aangetroffen. Het instellen van de SOCKS-versie is niet langer mogelijk. Alleen SOCKS5-proxy's worden ondersteund.</translation>
+ </message>
+ <message>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
<translation>Voer commando uit zodra een waarschuwing is ontvangen of wanneer we een erg lange fork detecteren (%s in commando wordt vervangen door bericht)</translation>
</message>
<message>
+ <source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source>
+ <translation>Toeslagen (in BTC/Kb) kleiner dan dit worden beschouwd als geen vergoeding (voor doorgeven) (standaard: %s)</translation>
+ </message>
+ <message>
+ <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Toeslagen (in BTC/Kb) kleiner dan dit worden beschouwd als geen vergoeding transactieaanmaak (standaard: %s)</translation>
+ </message>
+ <message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Als paytxfee niet is ingesteld, het pakket voldoende vergoeding zodat transacties beginnen bevestiging gemiddeld binnen in blokken (default: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>ongeldig bedrag voor -maxtxfee=&lt;amount&gt;: '%s' (moet ten minste de minrelay vergoeding van %s het voorkomen geplakt transacties voorkomen)</translation>
+ </message>
+ <message>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>Maximale grootte va n de gegevens in gegevensdrager transacties we relais en de mijnen
+(default: %u)</translation>
+ </message>
+ <message>
+ <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
+ <translation>Query voor peer- adressen via DNS- lookup , als laag op adressen (default: 1 unless -connect)</translation>
+ </message>
+ <message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation>Stel maximumgrootte in bytes in voor hoge-prioriteits-/lage-transactiekosten-transacties (standaard: %d)</translation>
</message>
<message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>Stel het aantal threads in voor het genereren van coins indien ingesteld (-1 = alle kernen, standaard: %d)</translation>
+ </message>
+ <message>
+ <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
+ <translation>Dit product bevat software dat ontwikkeld is door het OpenSSL Project voor gebruik in de OpenSSL Toolkit &lt;https://www.openssl.org/&gt; en cryptografische software geschreven door Eric Young en UPnP software geschreven door Thomas Bernard.</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Let op: -maxtxfee is erg hoog ingesteld! Transactiekosten van dergelijke groottes kunnen in een enkele transactie worden betaald.</translation>
+ </message>
+ <message>
+ <source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
+ <translation>Waarschuwing: Controleer dat de datum en tijd van uw computer correct zijn ingesteld! Bij een onjuist ingestelde klok zal Bitcoin Core niet goed werken.</translation>
+ </message>
+ <message>
+ <source>Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway</source>
+ <translation>Goedgekeurde peers kunnen niet ge-DoS-banned worden en hun transacties worden altijd doorgestuurd, zelfs als ze reeds in de mempool aanwezig zijn, nuttig voor bijv. een gateway</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Accepteer publieke REST-requests (standaard: %u)</translation>
+ </message>
+ <message>
+ <source>Cannot resolve -whitebind address: '%s'</source>
+ <translation>Kan -whitebind adres niet herleiden: '%s'</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Kies de gegevensmap tijdens het opstarten (standaard: 0)</translation>
+ </message>
+ <message>
+ <source>Connect through SOCKS5 proxy</source>
+ <translation>Verbind door SOCKS5 proxy</translation>
+ </message>
+ <message>
+ <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
+ <translation>Auteursrecht (C) 2009-%i De Bitcoin Core Ontwikkelaars</translation>
+ </message>
+ <message>
+ <source>Could not parse -rpcbind value %s as network address</source>
+ <translation>Niet mogelijk om -rpcbind waarde %s te verwerken als netwerk adres</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
<translation>Fout bij laden wallet.dat: Portemonnee vereist een nieuwere versie van Bitcoin Core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Fout bij het lezen van de database, afsluiten. </translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -tor found, use -onion.</source>
+ <translation>Fout: Niet ondersteund argument -tor gevonden, gebruik -onion.</translation>
+ </message>
+ <message>
+ <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
+ <translation>Transactiekosten (in BTC/kB) om toe te voegen aan transacties die u verstuurd (standaard: %s)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Informatie</translation>
</message>
<message>
+ <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
+ <translation>Initialisatie sanity check mislukt. Bitcoin Core is aan het afsluiten.</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Ongeldig bedrag voor -maxtxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Ongeldig bedrag voor -minrelaytxfee=&lt;bedrag&gt;: '%s'</translation>
</message>
@@ -3025,16 +3074,20 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Ongeldig bedrag voor -paytxfee=&lt;bedrag&gt;: '%s' (Minimum %s)</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Houd maximaal &lt;n&gt; onverbonden blokken in geheugen (standaard: %u)</translation>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation>Ongeldig netmask gespecificeerd in -whitelist: '%s'</translation>
</message>
<message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>Houd maximaal &lt;n&gt; onverbonden transacties in geheugen (standaard: %u)</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Toon block bij opstarten, wanneer gevonden in block index</translation>
+ <source>Need to specify a port with -whitebind: '%s'</source>
+ <translation>Verplicht een poort met -whitebind op te geven: '%s'</translation>
+ </message>
+ <message>
+ <source>Node relay options:</source>
+ <translation>Node relay opties:</translation>
</message>
<message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
@@ -3045,6 +3098,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>RPC server opties:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>RPC ondersteuning voor HTTP persisten verbindingen (default: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Laat willekeurig 1 elke &lt;n&gt; netwerkberichten vallen</translation>
</message>
@@ -3057,10 +3114,26 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Stuur trace/debug-info naar de console in plaats van het debug.log bestand</translation>
</message>
<message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>Verstuur transacties zonder verzendkosten indien mogelijk (standaard: %u)</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Zet SSL root certificaten voor betalingsverzoek (standaard: -sytem-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Stel taal in, bijvoorbeeld ''de_DE" (standaard: systeeminstellingen)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Toon alle foutopsporingsopties (gebruik: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Laat laadscherm zien bij het opstarten. (standaard: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Verklein debug.log-bestand bij het opstarten van de client (standaard: 1 als geen -debug)</translation>
</message>
@@ -3069,6 +3142,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Ondertekenen van transactie mislukt</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Geminimaliseerd starten</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Dit is experimentele software.</translation>
</message>
@@ -3081,10 +3158,18 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Transactiebedragen moeten positief zijn</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>De transactie is te groot voor het toeslagenbeleid</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Transactie te groot</translation>
</message>
<message>
+ <source>Unable to bind to %s on this computer (bind returned error %s)</source>
+ <translation>Niet in staat om aan %s te binden op deze computer (bind gaf error %s)</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
<translation>Gebruik UPnP om de luisterende poort te mappen (standaard: 1 als er wordt geluisterd)</translation>
</message>
@@ -3093,12 +3178,20 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Gebruikersnaam voor JSON-RPC-verbindingen</translation>
</message>
<message>
+ <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
+ <translation>Portemonnee moest herschreven worden: Herstart Bitcoin Core om te voltooien</translation>
+ </message>
+ <message>
<source>Warning</source>
<translation>Waarschuwing</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Waarschuwing: Deze versie is verouderd, een upgrade is vereist!</translation>
+ <source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Waarschuwing: Niet ondersteund argument -benchmark genegeerd, gebruik -debug=bench.</translation>
+ </message>
+ <message>
+ <source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Waarschuwing: Niet ondersteund argument -debugnet genegeerd, gebruik -debug=net.</translation>
</message>
<message>
<source>Zapping all transactions from wallet...</source>
@@ -3149,6 +3242,22 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Fout bij laden wallet.dat: Portemonnee corrupt</translation>
</message>
<message>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = behoudt tx meta data bijv. account eigenaar en betalingsverzoek informatie, 2. sla tx meta data niet op)</translation>
+ </message>
+ <message>
+ <source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Leeg database-activiteit uit de geheugen pool naar schijf log elke &lt;n&gt; megabytes (standaard: %u) </translation>
+ </message>
+ <message>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>Hoe grondig de blokverificatie van -checkblocks is (0-4, standaard: %u)</translation>
+ </message>
+ <message>
+ <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
+ <translation>Log transactieprioriteit en -kosten per kB bij het mijnen van blokken (standaard: %u)</translation>
+ </message>
+ <message>
<source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
<translation>Onderhoud een volledige transactieindex, gebruikt door de getrawtransaction rpc call (standaard: %u)</translation>
</message>
@@ -3165,6 +3274,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Gebruik een aparte SOCKS5 proxy om 'Tor hidden services' te bereiken (standaard: %s)</translation>
</message>
<message>
+ <source>Acceptable ciphers (default: %s)</source>
+ <translation>Geaccepteerde versleutelingen (standaard: %s)</translation>
+ </message>
+ <message>
<source>Always query for peer addresses via DNS lookup (default: %u)</source>
<translation>Vind anderen door middel van een DNS-naslag (standaard: %u)</translation>
</message>
@@ -3189,6 +3302,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Aantal te checken blokken bij het opstarten (standaard: %u, 0 = allemaal)</translation>
</message>
<message>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>IP-adressen toevoegen in de debuguitvoer (standaard: %u)</translation>
+ </message>
+ <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Ongeldig -proxy adres: '%s'</translation>
</message>
@@ -3225,8 +3342,12 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Prepend debug output met tijdstempel (standaard: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Toon block structuur bij opstarten (default: %u)</translation>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>Gegevensdrager transacties relay en de mijnen (default: %u)</translation>
+ </message>
+ <message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>Relay non-P2SH multisig (default: %u)</translation>
</message>
<message>
<source>Run a thread to flush wallet periodically (default: %u)</source>
@@ -3273,6 +3394,10 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Besteed onbevestigd wisselgeld bij het versturen van transacties (standaard: %u)</translation>
</message>
<message>
+ <source>Stop running after importing blocks from disk (default: %u)</source>
+ <translation>Stop uitvoeren na het importeren van blokken van de schijf (standaard: %u)</translation>
+ </message>
+ <message>
<source>Threshold for disconnecting misbehaving peers (default: %u)</source>
<translation>Drempel om verbinding te verbreken naar zich misdragende peers (standaard: %u)</translation>
</message>
@@ -3293,10 +3418,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Ongeldig bedrag voor -paytxfee=&lt;bedrag&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Ongeldig bedrag</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Ontoereikend saldo</translation>
</message>
@@ -3329,10 +3450,6 @@ bijvoorbeeld: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</tran
<translation>Klaar met laden</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Om de %s optie te gebruiken</translation>
- </message>
- <message>
<source>Error</source>
<translation>Fout</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pam.ts b/src/qt/locale/bitcoin_pam.ts
index b0a92a1578..54c30dfb6f 100644
--- a/src/qt/locale/bitcoin_pam.ts
+++ b/src/qt/locale/bitcoin_pam.ts
@@ -1,11 +1,7 @@
-<TS language="pam" version="2.0">
+<TS language="pam" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Pindutan meng makatidduang besis ban ayalilan me ing address o label</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Maglalang kang bayung address</translation>
</message>
@@ -51,7 +47,7 @@
</message>
<message>
<source>Sending addresses</source>
- <translation>Address king pamag-Padala</translation>
+ <translation>Address king pamag-Send</translation>
</message>
<message>
<source>Receiving addresses</source>
@@ -136,10 +132,6 @@
<translation>Alilan ya ing passphrase</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Palub ye ing luma ampo ing bayung passphrase king wallet.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Kumpirman ya ing wallet encryption</translation>
</message>
@@ -164,10 +156,6 @@
<translation>Me-encrypt ne ing wallet</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Ing Bitcoin ngeni magsara ya ban ayari ing proseso ning pamag-encrypt. Tandanan yu king pamag-encrypt wallet, ali nala aprotektan king kabuuan reng bitcoins yu kareng malware a kasalunsungan atiu kareng computer yu.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Memali ya ing pamag-encrypt king wallet </translation>
</message>
@@ -259,10 +247,6 @@
<translation>Magpadalang barya king Bitcoin address</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Alilan ing pipamilian konpigurasion para keng Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>I-backup ing wallet king aliwang lugal</translation>
</message>
@@ -355,18 +339,6 @@
<translation>Paparatang a transaksion</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Aldo: %1
-Alaga: %2
-Type: %3
-Address: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Maka-&lt;b&gt;encrypt&lt;/b&gt; ya ing wallet at kasalukuyan yang maka-&lt;b&gt;unlocked&lt;/b&gt;</translation>
</message>
@@ -485,23 +457,7 @@ Address: %4
<source>command-line options</source>
<translation>pipamilian command-line</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Pipamilian ning UI</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Mamiling Amanu, alimbawa "de_DE"(default: system locale)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Umpisan ing pamaglati</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Ipalto ing splash screen keng umpisa (default: 1)</translation>
- </message>
- </context>
+</context>
<context>
<name>Intro</name>
<message>
@@ -531,14 +487,6 @@ Address: %4
<translation>&amp;Pun</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Umpisan yang antimu ing Bitcoin kaibat mekapag-log in king sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Umpisan ya ing Bitcoin king pamag-log-in na ning sistema.</translation>
- </message>
- <message>
<source>&amp;Network</source>
<translation>&amp;Network</translation>
</message>
@@ -575,10 +523,6 @@ Address: %4
<translation>&amp;Latian ya ing tray kesa king taskbar</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 Quit in the menu.</source>
- <translation>Palatian namu kesa king iluwal ya ing aplikasion istung makasara ya ing awang. Istung ing pipamilian a ini atiu king "magsilbi", ing aplikasion misara yamu kaibat meng pinili ing "Tuknangan" king menu.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>P&amp;alatian istung isara</translation>
</message>
@@ -591,10 +535,6 @@ Address: %4
<translation>Amanu na ning user interface:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Ing amanu na ning user interface maliari yang i-ayus o ilage keni. Ing ayus a ini magsilbi yamu istung pesibayuan meng pasibayu ing Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>Ing &amp;Unit a ipakit king alaga ning:</translation>
</message>
@@ -653,11 +593,7 @@ Address: %4
<source>Your current total balance</source>
<translation>Ing kekang kasalungsungan kabuuang balanse</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>ali ya maka-sync</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
</context>
@@ -745,18 +681,10 @@ Address: %4
<translation>Debug log file</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Ibuklat ing Bitcoin debug log file menibat king kasalungsungan data directory. Magluat ya ining pilan segundu para kareng mamaragul a log files.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>I-Clear ing console</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Malaus kayu king Bitcoin RPC console.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Gamitan me ing patas at pababang arrow para alibut me ing kasalesayan, at &lt;b&gt;Ctrl-L&lt;/b&gt; ban I-clear ya ing screen.</translation>
</message>
@@ -861,10 +789,6 @@ Address: %4
<translation>Kopyan ing alaga</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Ing address na ning tumanggap ali ya katanggap-tanggap, maliari pung pakilaue pasibayu.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Ing alaga na ning bayaran dapat mung mas matas ya king 0.</translation>
</message>
@@ -877,10 +801,6 @@ Address: %4
<translation>Ing kabuuan mipasobra ya king kekang balanse istung inabe ya ing %1 a bayad king transaksion </translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Atin meakit a milupang address, maliari kamung magpadalang misan king metung a address king misan a pamagpadalang transaksion.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(alang label)</translation>
</message>
@@ -930,10 +850,6 @@ Address: %4
<translation>&amp;Pirman ing Mensayi</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Maliari kang mamirmang mensayi king kekang address bilang patune na keka ya ini. Mimingat mu king pamag-pirmang e malino uling mapalyari kang mabiktimang phishing attack a manloku keka na pirman me ing sarili mu para king karela. Only sign fully-detailed statements you agree to.</translation>
- </message>
- <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1189,10 +1105,6 @@ Address: %4
<translation>Klase</translation>
</message>
<message>
- <source>Address</source>
- <translation>Address</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Makabuklat anggang %1</translation>
</message>
@@ -1209,6 +1121,10 @@ Address: %4
<translation>Me-generate ya oneng ali ya metanggap</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Label</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Atanggap kayabe ning</translation>
</message>
@@ -1245,10 +1161,6 @@ Address: %4
<translation>Klase ning transaksion</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Kepuntalan a address ning transaksion</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Alagang milako o miragdag king balanse.</translation>
</message>
@@ -1435,10 +1347,6 @@ Address: %4
<translation>Mekapansin lang me-corrupt a block database</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>I-discover ing sariling IP address (default: 1 istung makiramdam at -externalip)</translation>
- </message>
- <message>
<source>Do you want to rebuild the block database now?</source>
<translation>Buri meng buuan pasibayu ing block database ngene?</translation>
</message>
@@ -1467,6 +1375,18 @@ Address: %4
<translation>Magpadalang trace/debug info okeng console kesa keng debug.log file</translation>
</message>
<message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Mamiling Amanu, alimbawa "de_DE"(default: system locale)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Ipalto ing splash screen keng umpisa (default: 1)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Umpisan ing pamaglati</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Maragul yang masiadu ing transaksion</translation>
</message>
@@ -1479,10 +1399,6 @@ Address: %4
<translation>Kapabaluan</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Kapabaluan: Ing bersioin a ini laus ne, kailangan nang mag-upgrade!</translation>
- </message>
- <message>
<source>Password for JSON-RPC connections</source>
<translation>Password para king JSON-RPC koneksion</translation>
</message>
@@ -1543,10 +1459,6 @@ Address: %4
<translation>Eya maliari ing alaga keng -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Ing alaga e ya katanggap-tanggap</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Kulang a pondo</translation>
</message>
@@ -1579,10 +1491,6 @@ Address: %4
<translation>Yari ne ing pamag-load</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Para agamit ing %s a pimamilian</translation>
- </message>
- <message>
<source>Error</source>
<translation>Mali</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts
index c53a9970ef..db49e20cf1 100644
--- a/src/qt/locale/bitcoin_pl.ts
+++ b/src/qt/locale/bitcoin_pl.ts
@@ -1,9 +1,9 @@
-<TS language="pl" version="2.0">
+<TS language="pl" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Kliknij dwukrotnie, aby edytować adres lub etykietę</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Kliknij prawy przycisk aby edytować adres lub etykietę</translation>
</message>
<message>
<source>Create a new address</source>
@@ -47,11 +47,11 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation>Wybierz adres żeby wysłać bitcoins</translation>
+ <translation>Wybierz adres, na który chcesz wysłać monety</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation>Wybierz adres do otrzymania monet.</translation>
+ <translation>Wybierz adres, na który chcesz otrzymać monety</translation>
</message>
<message>
<source>C&amp;hoose</source>
@@ -67,11 +67,11 @@
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Tutaj znajdują się Twoje adresy Bitcoin do wysyłania płatności. Zawsze sprawdzaj ilość i adres odbiorcy przed wysyłką monet.</translation>
+ <translation>Tutaj znajdują się adresy Bitcoin na które wysyłasz płatności. Zawsze sprawdzaj ilość i adres odbiorcy przed wysyłką monet.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
- <translation>To twoje adresy bitcoin do odbierania płatności. Zaleca się używanie nowych adresów odbiorczych dla każdej tranzakcji.</translation>
+ <translation>To twoje adresy Bitcoin, na które otrzymujesz płatności. Zaleca się używanie nowych adresów odbiorczych dla każdej transakcji.</translation>
</message>
<message>
<source>Copy &amp;Label</source>
@@ -87,7 +87,7 @@
</message>
<message>
<source>Comma separated file (*.csv)</source>
- <translation>Plik *.CSV (rozdzielany przecinkami)</translation>
+ <translation>CSV (rozdzielany przecinkami)</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -95,7 +95,7 @@
</message>
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
- <translation>Wystąpił błąd podczas próby zapisu listy adresów %1. Proszę spróbować ponownie</translation>
+ <translation>Wystąpił błąd podczas próby zapisu listy adresów %1. Proszę spróbować ponownie.</translation>
</message>
</context>
<context>
@@ -110,7 +110,7 @@
</message>
<message>
<source>(no label)</source>
- <translation>(bez etykiety)</translation>
+ <translation>(brak etykiety)</translation>
</message>
</context>
<context>
@@ -156,10 +156,6 @@
<translation>Zmień hasło</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Podaj stare i nowe hasło do portfela.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Potwierdź szyfrowanie portfela</translation>
</message>
@@ -177,15 +173,15 @@
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
- <translation>Uwaga: Klawisz Caps Lock jest włączony</translation>
+ <translation>Uwaga: Klawisz Caps Lock jest włączony!</translation>
</message>
<message>
<source>Wallet encrypted</source>
<translation>Portfel zaszyfrowany</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Program Bitcoin zamknie się aby dokończyć proces szyfrowania. Pamiętaj, że szyfrowanie portfela nie zabezpiecza w pełni Twoich bitcoinów przed kradzieżą przez wirusy lub trojany mogące zainfekować Twój komputer.</translation>
+ <source>Enter the new passphrase to 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>Wprowadź nowe hasło do portfela.&lt;br/&gt;Proszę używać hasła złożonego z &lt;b&gt;10 lub więcej losowych znaków&lt;/b&gt; lub &lt;b&gt;ośmiu lub więcej słów.&lt;/b&gt;</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -236,7 +232,7 @@
</message>
<message>
<source>Show general overview of wallet</source>
- <translation>Pokazuje ogólny zarys portfela</translation>
+ <translation>Pokazuje ogólny widok portfela</translation>
</message>
<message>
<source>&amp;Transactions</source>
@@ -280,11 +276,11 @@
</message>
<message>
<source>&amp;Sending addresses...</source>
- <translation>Adres wysyłania</translation>
+ <translation>Adresy wysyłania...</translation>
</message>
<message>
<source>&amp;Receiving addresses...</source>
- <translation>Adres odbiorczy</translation>
+ <translation>Adresy odbioru...</translation>
</message>
<message>
<source>Open &amp;URI...</source>
@@ -307,10 +303,6 @@
<translation>Wyślij monety na adres Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Zmienia opcje konfiguracji bitcoina</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Zapasowy portfel w innej lokalizacji</translation>
</message>
@@ -360,7 +352,7 @@
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation>Szyfruj klucze prywatne, które są powiązane z twoim portfelem</translation>
+ <translation>Szyfruj klucze prywatne, które są w Twoim portfelu</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
@@ -368,7 +360,7 @@
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation>Zweryfikuj wiadomość, aby upewnić się, że została podpisana odpowiednim adresem Bitcoin.</translation>
+ <translation>Zweryfikuj wiadomość, aby upewnić się, że została podpisana podanym adresem Bitcoin.</translation>
</message>
<message>
<source>&amp;File</source>
@@ -388,7 +380,7 @@
</message>
<message>
<source>Bitcoin Core</source>
- <translation>Rdzeń BitCoin</translation>
+ <translation>Rdzeń Bitcoin</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -400,48 +392,32 @@
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation>Pokaż listę użytych adresów wysyłających i etykiety</translation>
+ <translation>Pokaż listę adresów i etykiet użytych do wysyłania</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation>Pokaż listę użytych adresów odbiorczych i etykiety</translation>
+ <translation>Pokaż listę adresów i etykiet użytych do odbierania</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI or payment request</source>
+ <translation>Otwórz URI bitcoin: lub żądanie zapłaty</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation>&amp;Opcje konsoli</translation>
+ <translation>&amp;Opcje linii komend</translation>
</message>
<message>
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
<translation>Pokaż pomoc Rdzenia Bitcoin, aby zobaczyć listę wszystkich opcji linii poleceń</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n aktywne połączenie do sieci Bitcoin</numerusform><numerusform>%n aktywne połączenia do sieci Bitcoin</numerusform><numerusform>%n aktywnych połączeń do sieci Bitcoin</numerusform></translation>
- </message>
<message>
<source>No block source available...</source>
<translation>Brak dostępnych źródeł bloków...</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n godzina</numerusform><numerusform>%n godzin</numerusform><numerusform>%n godzin</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n dzień</numerusform><numerusform>%n dni</numerusform><numerusform>%n dni</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n tydzień</numerusform><numerusform>%n tygodni</numerusform><numerusform>%n tygodni</numerusform></translation>
- </message>
<message>
<source>%1 and %2</source>
<translation>%1 i %2</translation>
</message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation><numerusform>%n rok</numerusform><numerusform>%n lata</numerusform><numerusform>%n lat</numerusform></translation>
- </message>
<message>
<source>%1 behind</source>
<translation>%1 wstecz</translation>
@@ -472,7 +448,7 @@
</message>
<message>
<source>Catching up...</source>
- <translation>Łapanie bloków...</translation>
+ <translation>Synchronizuję się...</translation>
</message>
<message>
<source>Sent transaction</source>
@@ -483,20 +459,8 @@
<translation>Transakcja przychodząca</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Data: %1
-Kwota: %2
-Typ: %3
-Adres: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation>Portfel jest &lt;b&gt;zaszyfrowany&lt;/b&gt; i obecnie &lt;b&gt;niezablokowany&lt;/b&gt;</translation>
+ <translation>Portfel jest &lt;b&gt;zaszyfrowany&lt;/b&gt; i obecnie &lt;b&gt;odblokowany&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>
@@ -507,12 +471,16 @@ Adres: %4
<name>ClientModel</name>
<message>
<source>Network Alert</source>
- <translation>Sieć Alert</translation>
+ <translation>Komunikat Sieci</translation>
</message>
</context>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Wybór monet</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Ilość:</translation>
</message>
@@ -533,6 +501,10 @@ Adres: %4
<translation>Opłata:</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>Pył:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation>Po opłacie:</translation>
</message>
@@ -557,6 +529,14 @@ Adres: %4
<translation>Kwota</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>Otrzymano z opisem</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Otrzymano z adresem</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>Data</translation>
</message>
@@ -590,11 +570,11 @@ Adres: %4
</message>
<message>
<source>Lock unspent</source>
- <translation>Zablokuj</translation>
+ <translation>Zablokuj niewydane</translation>
</message>
<message>
<source>Unlock unspent</source>
- <translation>Odblokuj</translation>
+ <translation>Odblokuj niewydane</translation>
</message>
<message>
<source>Copy quantity</source>
@@ -617,6 +597,10 @@ Adres: %4
<translation>Skopiuj priorytet</translation>
</message>
<message>
+ <source>Copy dust</source>
+ <translation>Kopiuj kurz</translation>
+ </message>
+ <message>
<source>Copy change</source>
<translation>Skopiuj resztę</translation>
</message>
@@ -665,6 +649,10 @@ Adres: %4
<translation>żaden</translation>
</message>
<message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation>Waha się +/- %1 satoshi na wejście.</translation>
+ </message>
+ <message>
<source>yes</source>
<translation>tak</translation>
</message>
@@ -673,10 +661,6 @@ Adres: %4
<translation>nie</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Etykieta staje się czerwona kiedy transakcja jest większa niż 1000 bajtów.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Oznacza to wymaganą opłatę minimum %1 na kB.</translation>
</message>
@@ -686,19 +670,11 @@ Adres: %4
</message>
<message>
<source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Transakcje o wyższym priorytecie zostają szybciej dołączone do bloku.</translation>
- </message>
- <message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Ta etykieta jest czerwona, jeżeli priorytet jest mniejszy niż "średni"</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Etykieta staje się czerwona kiedy którykolwiek odbiorca otrzymuje kwotę mniejszą niż %1.</translation>
+ <translation>Transakcje o wyższym priorytecie zwykle szybciej zostają dołączone do bloku.</translation>
</message>
<message>
<source>(no label)</source>
- <translation>(bez etykiety)</translation>
+ <translation>(brak etykiety)</translation>
</message>
<message>
<source>change from %1 (%2)</source>
@@ -733,7 +709,7 @@ Adres: %4
</message>
<message>
<source>New receiving address</source>
- <translation>Nowy adres odbiorczy</translation>
+ <translation>Nowy adres otrzymywania</translation>
</message>
<message>
<source>New sending address</source>
@@ -768,7 +744,7 @@ Adres: %4
<name>FreespaceChecker</name>
<message>
<source>A new data directory will be created.</source>
- <translation>Utworzono nowy folder danych.</translation>
+ <translation>Będzie utworzony nowy folder danych.</translation>
</message>
<message>
<source>name</source>
@@ -780,7 +756,7 @@ Adres: %4
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation>Ścieżka już istnieje i nie wskazuje na folder.</translation>
+ <translation>Ścieżka już istnieje i nie jest katalogiem.</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -791,7 +767,7 @@ Adres: %4
<name>HelpMessageDialog</name>
<message>
<source>Bitcoin Core</source>
- <translation>Rdzeń BitCoin</translation>
+ <translation>Rdzeń Bitcoin</translation>
</message>
<message>
<source>version</source>
@@ -817,26 +793,6 @@ Adres: %4
<source>command-line options</source>
<translation>opcje konsoli</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI opcje</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Ustaw Język, na przykład "pl_PL" (domyślnie: systemowy)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Uruchom zminimalizowany</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Pokazuj okno powitalne przy starcie (domyślnie: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Wybierz folder danych przy starcie (domyślnie: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -850,11 +806,11 @@ Adres: %4
</message>
<message>
<source>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</source>
- <translation>Ponieważ jest to pierwsze uruchomienie programu, możesz wybrać gdzie będą przechowywane informacje.</translation>
+ <translation>Ponieważ jest to pierwsze uruchomienie programu, możesz wybrać gdzie Bitcoin Core będzie przechowywał swoje dane.</translation>
</message>
<message>
<source>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source>
- <translation>Program pobierze i będzie przechowywał kopię łańcucha bloków Bitcoin. W wybranym katalogu musi być przynajmniej %1GB miejsca, a z czasem wielkość danych będzie rosła. Portfel będzie przechowywany w tym samym katalogu.</translation>
+ <translation>Program pobierze i będzie przechowywał kopię łańcucha bloków Bitcoin. W wybranym katalogu musi być przynajmniej %1GB miejsca, a z czasem ilość danych będzie rosła. Portfel będzie przechowywany w tym samym katalogu.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -866,7 +822,7 @@ Adres: %4
</message>
<message>
<source>Bitcoin Core</source>
- <translation>Rdzeń BitCoin</translation>
+ <translation>Rdzeń Bitcoin</translation>
</message>
<message>
<source>Error: Specified data directory "%1" cannot be created.</source>
@@ -881,7 +837,7 @@ Adres: %4
<name>OpenURIDialog</name>
<message>
<source>Open URI</source>
- <translation>Otwórz URI:</translation>
+ <translation>Otwórz URI</translation>
</message>
<message>
<source>Open payment request from URI or file</source>
@@ -911,12 +867,8 @@ Adres: %4
<translation>Główne</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Automatycznie uruchamia Bitcoin po zalogowaniu do systemu.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>Uruchamiaj Bitcoin wraz z zalogowaniem do &amp;systemu</translation>
+ <source>Size of &amp;database cache</source>
+ <translation>Wielkość bufora bazy &amp;danych</translation>
</message>
<message>
<source>MB</source>
@@ -944,7 +896,7 @@ Adres: %4
</message>
<message>
<source>Reset all client options to default.</source>
- <translation>Przywróć domyślne wszystkie ustawienia klienta.</translation>
+ <translation>Przywróć wszystkie domyślne ustawienia klienta.</translation>
</message>
<message>
<source>&amp;Reset Options</source>
@@ -955,6 +907,10 @@ Adres: %4
<translation>&amp;Sieć</translation>
</message>
<message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation>(0 = automatycznie, &lt;0 = zostaw tyle wolnych rdzeni)</translation>
+ </message>
+ <message>
<source>W&amp;allet</source>
<translation>Portfel</translation>
</message>
@@ -963,6 +919,14 @@ Adres: %4
<translation>Ekspert</translation>
</message>
<message>
+ <source>Enable coin &amp;control features</source>
+ <translation>Włącz funk&amp;cje kontoli monet</translation>
+ </message>
+ <message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation>Wydaj niepotwierdzoną re&amp;sztę</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>Automatycznie otwiera port klienta Bitcoin na routerze. Ta opcja dzieła tylko jeśli twój router wspiera UPnP i jest ono włączone.</translation>
</message>
@@ -971,6 +935,14 @@ Adres: %4
<translation>Mapuj port używając &amp;UPnP</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Połącz się z siecią Bitcoin poprzez proxy SOCKS5.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>Połącz przez proxy SO&amp;CKS5 (domyślne proxy):</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>Proxy &amp;IP: </translation>
</message>
@@ -995,10 +967,6 @@ Adres: %4
<translation>&amp;Minimalizuj do paska przy zegarku zamiast do paska zadań</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 Quit in the menu.</source>
- <translation>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>M&amp;inimize on close</source>
<translation>M&amp;inimalizuj przy zamknięciu</translation>
</message>
@@ -1011,10 +979,6 @@ Adres: %4
<translation>Język &amp;Użytkownika:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Można tu ustawić język interfejsu uzytkownika. Żeby ustawienie przyniosło skutek trzeba uruchomić ponownie Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Jednostka pokazywana przy kwocie:</translation>
</message>
@@ -1023,6 +987,10 @@ Adres: %4
<translation>Wybierz podział jednostki pokazywany w interfejsie oraz podczas wysyłania monet</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation>Wybierz pokazywanie lub nie funkcji kontroli monet.</translation>
+ </message>
+ <message>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
@@ -1047,10 +1015,6 @@ Adres: %4
<translation>Wymagany restart programu, aby uaktywnić zmiany.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Program zostanie wyłączony. Czy chcesz kontynuować?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Ta zmiana może wymagać ponownego uruchomienia klienta.</translation>
</message>
@@ -1070,6 +1034,10 @@ Adres: %4
<translation>Wyświetlana informacja może być nieaktualna. Twój portfel synchronizuje się automatycznie z siecią bitcoin, zaraz po tym jak uzyskano połączenie, ale proces ten nie został jeszcze ukończony.</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation>Tylko podglądaj:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation>Dostępne:</translation>
</message>
@@ -1091,7 +1059,11 @@ Adres: %4
</message>
<message>
<source>Mined balance that has not yet matured</source>
- <translation>Balans wydobycia, który jeszcze nie dojrzał</translation>
+ <translation>Balans wydobytych monet, które jeszcze nie dojrzały</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation>Salda</translation>
</message>
<message>
<source>Total:</source>
@@ -1102,8 +1074,28 @@ Adres: %4
<translation>Twoje obecne saldo</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>desynchronizacja</translation>
+ <source>Your current balance in watch-only addresses</source>
+ <translation>Twoje obecne saldo na podglądanym adresie </translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation>Możliwe do wydania:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation>Ostatnie transakcje</translation>
+ </message>
+ <message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation>Niepotwierdzone transakcje na podglądanych adresach</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation>Wykopane monety na podglądanych adresach które jeszcze nie dojrzały</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation>Łączna kwota na podglądanych adresach</translation>
</message>
</context>
<context>
@@ -1117,6 +1109,18 @@ Adres: %4
<translation>błędny adres płatności %1</translation>
</message>
<message>
+ <source>Payment request rejected</source>
+ <translation>Żądanie płatności odrzucone</translation>
+ </message>
+ <message>
+ <source>Payment request network doesn't match client network.</source>
+ <translation>Sieć żądania płatności nie odpowiada sieci klienta.</translation>
+ </message>
+ <message>
+ <source>Payment request is not initialized.</source>
+ <translation>Żądanie płatności nie jest zainicjowane.</translation>
+ </message>
+ <message>
<source>Requested payment amount of %1 is too small (considered dust).</source>
<translation>Żądana kwota %1 jest za niska (uznano za kurz).</translation>
</message>
@@ -1126,7 +1130,11 @@ Adres: %4
</message>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Nie można rozpocząć bitcoin: kliknij-by-zapłacić opiekunowi</translation>
+ <translation>Nie można uruchomić protokołu bitcoin: kliknij-by-zapłacić</translation>
+ </message>
+ <message>
+ <source>Payment request fetch URL is invalid: %1</source>
+ <translation>URL pobrania żądania zapłaty jest nieprawidłowe: %1</translation>
</message>
<message>
<source>Refund from %1</source>
@@ -1151,7 +1159,11 @@ Adres: %4
</context>
<context>
<name>PeerTableModel</name>
- </context>
+ <message>
+ <source>Ping Time</source>
+ <translation>Czas odpowiedzi</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -1159,6 +1171,14 @@ Adres: %4
<translation>Kwota</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation>Wprowadź adres Bitcoin (np. %1)</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation>%1 d</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation>%1 h</translation>
</message>
@@ -1167,10 +1187,22 @@ Adres: %4
<translation>%1 m</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation>%1 s</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Żaden</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation>NIEDOSTĘPNE</translation>
</message>
- </context>
+ <message>
+ <source>%1 ms</source>
+ <translation>%1 ms</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1221,6 +1253,10 @@ Adres: %4
<translation>Używana wersja OpenSSL</translation>
</message>
<message>
+ <source>Using BerkeleyDB version</source>
+ <translation>Używana wersja BerkeleyDB </translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Czas uruchomienia</translation>
</message>
@@ -1238,13 +1274,57 @@ Adres: %4
</message>
<message>
<source>Block chain</source>
- <translation>Ciąg bloków</translation>
+ <translation>Łańcuch bloków</translation>
</message>
<message>
<source>Current number of blocks</source>
<translation>Aktualna liczba bloków</translation>
</message>
<message>
+ <source>Received</source>
+ <translation>Otrzymane</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation>Wysłane</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>Wybierz węzeł żeby zobaczyć szczegóły.</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <translation>Kierunek</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation>Wersja</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Usługi</translation>
+ </message>
+ <message>
+ <source>Starting Height</source>
+ <translation>Początkowa wysokość</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation>Czas połączenia</translation>
+ </message>
+ <message>
+ <source>Bytes Sent</source>
+ <translation>Bajtów wysłano</translation>
+ </message>
+ <message>
+ <source>Bytes Received</source>
+ <translation>Bajtów pobrano</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Czas odpowiedzi</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Czas ostatniego bloku</translation>
</message>
@@ -1285,18 +1365,10 @@ Adres: %4
<translation>Plik logowania debugowania</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Otwórz plik logowania debugowania Bitcoin z obecnego katalogu z danymi. Może to potrwać kilka sekund przy większych plikach.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Wyczyść konsolę</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Witam w konsoli Bitcoin RPC</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Użyj strzałek do przewijania historii i &lt;b&gt;Ctrl-L&lt;/b&gt; aby wyczyścić ekran</translation>
</message>
@@ -1320,7 +1392,31 @@ Adres: %4
<source>%1 GB</source>
<translation>%1 GB</translation>
</message>
- </context>
+ <message>
+ <source>via %1</source>
+ <translation>przez %1</translation>
+ </message>
+ <message>
+ <source>never</source>
+ <translation>nigdy</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <translation>Wejściowy</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <translation>Wyjściowy</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Nieznany</translation>
+ </message>
+ <message>
+ <source>Fetching...</source>
+ <translation>Pobieram...</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
@@ -1337,7 +1433,7 @@ Adres: %4
</message>
<message>
<source>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</source>
- <translation>Użyj jeden z poprzednio użytych adresów odbiorczych. Podczas ponownego używania adresów występują problemy z bezpieczeństwem i prywatnością. Nie korzystaj z tej opcji, chyba że odtwarzasz żądanie płatności wykonane już wcześniej.</translation>
+ <translation>Użyj jednego z poprzednio użytych adresów odbiorczych. Podczas ponownego używania adresów występują problemy z bezpieczeństwem i prywatnością. Nie korzystaj z tej opcji, chyba że odtwarzasz żądanie płatności wykonane już wcześniej.</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
@@ -1348,8 +1444,12 @@ Adres: %4
<translation>Użyj tego formularza do zażądania płatności. Wszystkie pola są &lt;b&gt;opcjonalne&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>Opcjonalna kwota by zażądać. Zostaw puste lub zero by nie zażądać konkretnej kwoty.</translation>
+ </message>
+ <message>
<source>Clear all fields of the form.</source>
- <translation>Wyczyść pola formularza</translation>
+ <translation>Wyczyść wszystkie pola formularza.</translation>
</message>
<message>
<source>Clear</source>
@@ -1364,6 +1464,10 @@ Adres: %4
<translation>&amp;Żądaj płatności</translation>
</message>
<message>
+ <source>Show the selected request (does the same as double clicking an entry)</source>
+ <translation>Pokaż wybrane żądanie (robi to samo co dwukrotne kliknięcie pozycji)</translation>
+ </message>
+ <message>
<source>Show</source>
<translation>Pokaż</translation>
</message>
@@ -1408,7 +1512,7 @@ Adres: %4
</message>
<message>
<source>Request payment to %1</source>
- <translation>Żądaj płatności do %1</translation>
+ <translation>Zażądaj płatności do %1</translation>
</message>
<message>
<source>Payment information</source>
@@ -1463,7 +1567,7 @@ Adres: %4
</message>
<message>
<source>(no label)</source>
- <translation>(bez etykiety)</translation>
+ <translation>(brak etykiety)</translation>
</message>
<message>
<source>(no message)</source>
@@ -1478,7 +1582,11 @@ Adres: %4
<name>SendCoinsDialog</name>
<message>
<source>Send Coins</source>
- <translation>Wyślij Monety</translation>
+ <translation>Wyślij monety</translation>
+ </message>
+ <message>
+ <source>Coin Control Features</source>
+ <translation>Funkcje kontroli monet</translation>
</message>
<message>
<source>Inputs...</source>
@@ -1490,7 +1598,7 @@ Adres: %4
</message>
<message>
<source>Insufficient funds!</source>
- <translation>Niewystarczające środki</translation>
+ <translation>Niewystarczające środki!</translation>
</message>
<message>
<source>Quantity:</source>
@@ -1522,7 +1630,59 @@ Adres: %4
</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>Kiedy ta opcja jest wybrana, ale adres reszty jest pusty lub nieprawidłowy to reszta będzie wysyłana na adres nowo-wygenerowany.</translation>
+ <translation>Kiedy ta opcja jest wybrana, to jeżeli adres reszty jest pusty lub nieprawidłowy, to reszta będzie wysyłana na nowo wygenerowany adres, </translation>
+ </message>
+ <message>
+ <source>Custom change address</source>
+ <translation>Niestandardowe zmiany adresu</translation>
+ </message>
+ <message>
+ <source>Transaction Fee:</source>
+ <translation>Opłata transakcyjna:</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>Wybierz...</translation>
+ </message>
+ <message>
+ <source>collapse fee-settings</source>
+ <translation>zwiń opcje opłaty</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>za kilobajt</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(przeczytaj podpowiedź)</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Zalecane:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(Sprytne opłaty nie są jeszcze zainicjowane. Trwa to zwykle kilka bloków...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Czas potwierdzenia:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>normalnie</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>szybko</translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Wyślij bez opłaty jeżeli to możliwe</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(potwierdzenie może potrwać dłużej)</translation>
</message>
<message>
<source>Send to multiple recipients at once</source>
@@ -1530,11 +1690,15 @@ Adres: %4
</message>
<message>
<source>Add &amp;Recipient</source>
- <translation>Dodaj Odbio&amp;rce</translation>
+ <translation>Dodaj Odbio&amp;rcę</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation>Wyczyść wszystkie pola formularza</translation>
+ <translation>Wyczyść wszystkie pola formularza.</translation>
+ </message>
+ <message>
+ <source>Dust:</source>
+ <translation>Pył:</translation>
</message>
<message>
<source>Clear &amp;All</source>
@@ -1597,10 +1761,6 @@ Adres: %4
<translation>lub</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Adres odbiorcy jest nieprawidłowy, proszę poprawić</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Kwota do zapłacenia musi być większa od 0.</translation>
</message>
@@ -1613,10 +1773,6 @@ Adres: %4
<translation>Suma przekracza twoje saldo, gdy doliczymy %1 prowizji transakcyjnej.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Znaleziono powtórzony adres, można wysłać tylko raz na każdy adres podczas operacji wysyłania.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Utworzenie transakcji nie powiodło się!</translation>
</message>
@@ -1625,16 +1781,24 @@ Adres: %4
<translation>Transakcja została odrzucona! Może się to zdarzyć jeśli część monet z portfela została już wydana używając kopii pliku wallet.dat i nie zostało to tutaj uwzględnione.</translation>
</message>
<message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Płac tylko minimalna opłatę %1</translation>
+ </message>
+ <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Ostrzeżenie: nieprawidłowy adres Bitcoin</translation>
</message>
<message>
<source>(no label)</source>
- <translation>(bez etykiety)</translation>
+ <translation>(brak etykiety)</translation>
</message>
<message>
<source>Warning: Unknown change address</source>
- <translation>Ostrzeżenie: Nieznany adres</translation>
+ <translation>Ostrzeżenie: Nieznany adres reszty</translation>
+ </message>
+ <message>
+ <source>Copy dust</source>
+ <translation>Kopiuj kurz</translation>
</message>
<message>
<source>Are you sure you want to send?</source>
@@ -1665,7 +1829,7 @@ Adres: %4
</message>
<message>
<source>Choose previously used address</source>
- <translation>Wybierz wcześniej użyty adres </translation>
+ <translation>Wybierz wcześniej użyty adres</translation>
</message>
<message>
<source>This is a normal payment.</source>
@@ -1692,18 +1856,10 @@ Adres: %4
<translation>Wiadomość:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Zweryfikowano żądanie zapłaty.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Wprowadź etykietę dla tego adresu by dodać go do listy użytych adresów</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>To żądanie zapłaty nie zostało zweryfikowane.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Wpłać do:</translation>
</message>
@@ -1734,10 +1890,6 @@ Adres: %4
<translation>Podpi&amp;sz Wiadomość</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>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>Choose previously used address</source>
<translation>Wybierz wcześniej użyty adres</translation>
</message>
@@ -1755,7 +1907,7 @@ Adres: %4
</message>
<message>
<source>Enter the message you want to sign here</source>
- <translation>Wprowadź wiadomość, którą chcesz podpisać, tutaj</translation>
+ <translation>Tutaj wprowadź wiadomość, którą chcesz podpisać</translation>
</message>
<message>
<source>Signature</source>
@@ -1786,10 +1938,6 @@ Adres: %4
<translation>&amp;Zweryfikuj wiadomość</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Wpisz adres podpisu, wiadomość (upewnij się, że dokładnie skopiujesz wszystkie zakończenia linii, spacje, tabulacje itp.) oraz podpis poniżej by sprawdzić wiadomość. Uważaj by nie dodać więcej do podpisu niż do samej podpisywanej wiadomości by uniknąć ataku man-in-the-middle (człowiek pośrodku)</translation>
- </message>
- <message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
<translation>Zweryfikuj wiadomość, aby upewnić się, że została podpisana odpowiednim adresem Bitcoin.</translation>
</message>
@@ -1823,11 +1971,11 @@ Adres: %4
</message>
<message>
<source>Private key for the entered address is not available.</source>
- <translation>Klucz prywatny dla podanego adresu nie jest dostępny</translation>
+ <translation>Klucz prywatny dla podanego adresu nie jest dostępny.</translation>
</message>
<message>
<source>Message signing failed.</source>
- <translation>Podpisanie wiadomości nie powiodło się</translation>
+ <translation>Podpisanie wiadomości nie powiodło się.</translation>
</message>
<message>
<source>Message signed.</source>
@@ -1843,7 +1991,7 @@ Adres: %4
</message>
<message>
<source>The signature did not match the message digest.</source>
- <translation>Podpis nie odpowiadał streszczeniu wiadomości</translation>
+ <translation>Podpis nie odpowiada skrótowi wiadomości.</translation>
</message>
<message>
<source>Message verification failed.</source>
@@ -1858,7 +2006,7 @@ Adres: %4
<name>SplashScreen</name>
<message>
<source>Bitcoin Core</source>
- <translation>Rdzeń BitCoin</translation>
+ <translation>Rdzeń Bitcoin</translation>
</message>
<message>
<source>The Bitcoin Core developers</source>
@@ -1883,6 +2031,10 @@ Adres: %4
<translation>Otwórz do %1</translation>
</message>
<message>
+ <source>conflicted</source>
+ <translation>konflikt</translation>
+ </message>
+ <message>
<source>%1/offline</source>
<translation>%1/offline</translation>
</message>
@@ -1898,10 +2050,6 @@ Adres: %4
<source>Status</source>
<translation>Status</translation>
</message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, emitowany przez %n węzeł</numerusform><numerusform>, emitowany przez %n węzły</numerusform><numerusform>, emitowany przez %n węzłów</numerusform></translation>
- </message>
<message>
<source>Date</source>
<translation>Data</translation>
@@ -1934,10 +2082,6 @@ Adres: %4
<source>Credit</source>
<translation>Przypisy</translation>
</message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>potwierdzona przy %n bloku więcej</numerusform><numerusform>potwierdzona przy %n blokach więcej</numerusform><numerusform>potwierdzona przy %n blokach więcej</numerusform></translation>
- </message>
<message>
<source>not accepted</source>
<translation>niezaakceptowane</translation>
@@ -1948,7 +2092,7 @@ Adres: %4
</message>
<message>
<source>Transaction fee</source>
- <translation>Prowizja transakcji</translation>
+ <translation>Opłata transakcyjna</translation>
</message>
<message>
<source>Net amount</source>
@@ -1972,7 +2116,7 @@ Adres: %4
</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>Wygenerowane monety muszą dojrzeć przez %1 bloków zanim będzie można je wysłać. Gdy wygenerowałeś ten blok został on ogłoszony w sieci i dodany do łańcucha bloków. Jeżeli nie uda mu się wejść do łańcucha jego status zostanie zmieniony na "nie zaakceptowano" i nie będzie można go wydać. To czasem zdarza się gdy inny węzeł wygeneruje blok w kilka sekund od twojego.</translation>
+ <translation>Wygenerowane monety muszą dojrzeć przez %1 bloków zanim będzie można je wydać. Gdy wygenerowałeś ten blok został on ogłoszony w sieci i dodany do łańcucha bloków. Jeżeli nie uda mu się wejść do łańcucha jego status zostanie zmieniony na "nie zaakceptowano" i nie będzie można go wydać. To czasem zdarza się gdy inny węzeł wygeneruje blok w kilka sekund od twojego.</translation>
</message>
<message>
<source>Debug information</source>
@@ -2000,11 +2144,7 @@ Adres: %4
</message>
<message>
<source>, has not been successfully broadcast yet</source>
- <translation>, nie został jeszcze pomyślnie wyemitowany</translation>
- </message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Otwórz dla %n bloku</numerusform><numerusform>Otwórz dla %n następnych bloków</numerusform><numerusform>Otwórz dla %n następnych bloków</numerusform></translation>
+ <translation>, nie został jeszcze pomyślnie rozesłany</translation>
</message>
<message>
<source>unknown</source>
@@ -2033,8 +2173,8 @@ Adres: %4
<translation>Typ</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adres</translation>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation>Niedojrzała (%1 potwierdzeń, będzie dostępna po %2)</translation>
</message>
<message>
<source>Open until %1</source>
@@ -2057,6 +2197,10 @@ Adres: %4
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etykieta</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Niepotwierdzone:</translation>
</message>
@@ -2065,6 +2209,10 @@ Adres: %4
<translation>Potwierdzanie (%1 z %2 rekomendowanych potwierdzeń)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation>Konflikt</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Otrzymane przez</translation>
</message>
@@ -2101,10 +2249,6 @@ Adres: %4
<translation>Rodzaj transakcji.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Adres docelowy transakcji.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Kwota usunięta z lub dodana do konta.</translation>
</message>
@@ -2250,7 +2394,11 @@ Adres: %4
</context>
<context>
<name>UnitDisplayStatusBarControl</name>
- </context>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Jednostka w jakiej pokazywane są kwoty. Kliknij aby wybrać inną.</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2262,7 +2410,7 @@ Adres: %4
<name>WalletModel</name>
<message>
<source>Send Coins</source>
- <translation>Wyślij płatność</translation>
+ <translation>Wyślij monety</translation>
</message>
</context>
<context>
@@ -2335,51 +2483,28 @@ Adres: %4
<translation>Akceptuj połączenia z zewnątrz (domyślnie: 1 jeśli nie ustawiono -proxy lub -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, musisz ustawić rpcpassword w pliku konfiguracyjnym:⏎
-%s⏎
-Zalecane jest użycie losowego hasła:⏎
-rpcuser=bitcoinrpc⏎
-rpcpassword=%s⏎
-(nie musisz pamiętać tego hasła)⏎
-Użytkownik i hasło nie mogą być takie same.⏎
-Jeśli plik nie istnieje, utwórz go z uprawnieniami tylko-do-odczytu dla właściciela.⏎
-Zalecane jest ustawienie alertnotify aby poinformować o problemach:⏎
-na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
- <translation>Skojarz z podanym adresem. Użyj formatu [host]:port dla IPv6 </translation>
- </message>
- <message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Błąd: transakcja została odrzucona. Może się to zdarzyć, gdy monety z Twojego portfela zostały już wydane, na przykład gdy używałeś kopii wallet.dat i bitcoiny które tam wydałeś nie zostały jeszcze odjęte z portfela z którego teraz korzystasz.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Transakcja przekracza limit. Możesz wysłać ją płacąc prowizję %s, która zostaje przekazana do węzłów, które ją prześlą i pomoże wspierać sieć Bitcoin. Czy chcesz zapłacić prowizję?</translation>
+ <translation>Skojarz z podanym adresem i nasłuchuj na nim. Użyj formatu [host]:port dla IPv6</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Wykonaj polecenie, kiedy transakcja portfela ulegnie zmianie (%s w poleceniu zostanie zastąpione przez TxID)</translation>
</message>
<message>
+ <source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
+ <translation>Ustaw liczbę wątków skryptu weryfikacyjnego (%u do %d, 0 = auto, &lt;0 = zostaw tyle rdzeni wolnych, domyślnie: %d)</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>To jest testowa wersja - używaj na własne ryzyko - nie używaj do wykopywania oraz przy aplikacjach kupieckich</translation>
</message>
<message>
+ <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
+ <translation>Nie można przywiązać z portem %s na tym komputerze. Bitcoin Core prawdopodobnie już działa.</translation>
+ </message>
+ <message>
<source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
- <translation>Ostrzeżenie: -paytxfee jest bardzo duży. To jest prowizja za transakcje, którą płacisz, gdy wysyłasz monety.</translation>
+ <translation>Ostrzeżenie: -paytxfee jest bardzo duże! Jest to prowizja za transakcje, którą płacisz, gdy wysyłasz monety.</translation>
</message>
<message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
@@ -2402,6 +2527,10 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>(domyślnie: 1)</translation>
</message>
<message>
+ <source>&lt;category&gt; can be:</source>
+ <translation>&lt;category&gt; mogą być:</translation>
+ </message>
+ <message>
<source>Attempt to recover private keys from a corrupt wallet.dat</source>
<translation>Próbuj odzyskać klucze prywatne z uszkodzonego wallet.dat</translation>
</message>
@@ -2411,7 +2540,7 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
</message>
<message>
<source>Connect only to the specified node(s)</source>
- <translation>Łącz tylko do wskazanego węzła</translation>
+ <translation>Łącz się tylko do wskazanego węzła/węzłów</translation>
</message>
<message>
<source>Connection options:</source>
@@ -2426,12 +2555,8 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>Opcje debugowania/testowania:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Odkryj własny adres IP (domyślnie: 1 kiedy w trybie nasłuchu i brak -externalip )</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
- <translation>Nie ładuj portfela i wyłącz odwołania RPC</translation>
+ <translation>Nie ładuj portfela i wyłącz wywołania RPC portfela</translation>
</message>
<message>
<source>Do you want to rebuild the block database now?</source>
@@ -2439,7 +2564,7 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
</message>
<message>
<source>Error initializing block database</source>
- <translation>Błąd inicjowania bloku bazy danych</translation>
+ <translation>Błąd inicjowania bazy danych bloków</translation>
</message>
<message>
<source>Error initializing wallet database environment %s!</source>
@@ -2451,19 +2576,19 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
</message>
<message>
<source>Error opening block database</source>
- <translation>Błąd ładowania bazy bloków</translation>
+ <translation>Błąd otwierania bazy bloków</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>Błąd: Mało miejsca na dysku!</translation>
+ <source>Error: A fatal internal error occured, see debug.log for details</source>
+ <translation>Błąd: Wystąpił krytyczny błąd wewnętrzny, sprawdź w debug.log</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Błąd: Zablokowany portfel, nie można utworzyć transakcji!</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>Błąd: Mało miejsca na dysku!</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation>Próba otwarcia jakiegokolwiek portu nie powiodła się. Użyj -listen=0 jeśli tego chcesz.</translation>
+ <translation>Próba nasłuchiwania na jakimkolwiek porcie nie powiodła się. Użyj -listen=0 jeśli tego chcesz.</translation>
</message>
<message>
<source>Importing...</source>
@@ -2482,8 +2607,8 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>Brak wystarczającej liczby deskryptorów plików. </translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Odbuduj indeks łańcucha bloków z obecnych plików blk000??.dat</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Łącz z węzłami tylko w sieci &lt;net&gt; (ipv4, piv6 lub onion)</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -2498,6 +2623,14 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>Określ plik portfela (w obrębie folderu danych)</translation>
</message>
<message>
+ <source>This is intended for regression testing tools and app development.</source>
+ <translation>Jest to przeznaczone dla narzędzi testowania regresji i rozwoju aplikacji.</translation>
+ </message>
+ <message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Użyj UPnP do przekazania portu nasłuchu (domyślnie : %u)</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Weryfikacja bloków...</translation>
</message>
@@ -2522,18 +2655,94 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>Importuj bloki z zewnętrznego pliku blk000??.dat</translation>
</message>
<message>
+ <source>Allow JSON-RPC connections from specified source. Valid for &lt;ip&gt; are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
+ <translation>Pozwól na połączenia JSON-RPC z podanego źródła. Jako &lt;ip&gt; prawidłowe jest pojedyncze IP (np. 1.2.3.4), podsieć/maska (np. 1.2.3.4/255.255.255.0) lub sieć/CIDR (np. 1.2.3.4/24). Opcja ta może być użyta wiele razy.</translation>
+ </message>
+ <message>
+ <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source>
+ <translation>Napotkano błąd podczas ustawiania adres RPC %s port %u dla nasłuchiwania: %s</translation>
+ </message>
+ <message>
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
<translation>Nie można uzyskać blokady na katalogu z danymi %s. Rdzeń Bitcoin najprawdopodobniej jest już uruchomiony.</translation>
</message>
<message>
+ <source>Error: Listening for incoming connections failed (listen returned error %s)</source>
+ <translation>Błąd: Nasłuchiwanie połączeń przychodzących nie powiodło się (nasłuch zwrócił błąd %s)</translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>Błąd: Znaleziono niewspierany argument -socks . Ustawienie wersji SOCKS nie jest już możliwe, tylko serwery proxy SOCKS5 są wspierane.</translation>
+ </message>
+ <message>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
<translation>Uruchom polecenie przy otrzymaniu odpowiedniego powiadomienia lub gdy zobaczymy naprawdę długie rozgałęzienie (%s w poleceniu jest podstawiane za komunikat)</translation>
</message>
<message>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>Maksymalny rozmiar danych w transakcji przekazującej dane które przekazujemy i wydobywamy (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
+ <translation>Wyszukaj adresy węzłów wykorzystując zapytanie DNS, jeżeli masz mało adresów (domyślnie: 1 jeśli nie użyto -connect)</translation>
+ </message>
+ <message>
+ <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
+ <translation>Ustaw maksymalny rozmiar transakcji o wysokim priorytecie/niskiej prowizji w bajtach (domyślnie: %d)</translation>
+ </message>
+ <message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>Ustaw liczbę wątków dla generowania monet (-1 = wszystkie rdzenie, domyślnie: %d)</translation>
+ </message>
+ <message>
+ <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
+ <translation>Program ten zawiera oprogramowanie stworzone przez OpenSSL Project do użycia w OpensSSL Toolkit &lt;https://www.openssl.org/&gt;, oprogramowanie kryptograficzne napisane przez Eric Young oraz oprogramowanie UPnP napisane przez Thomas Bernard.</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Ostrzeżenie: -matxfee jest ustawione bardzo wysokie! Tak wysokie opłaty mogą być zapłacone w jednej transakcji.</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Wybierz folder danych przy starcie (domyślnie: 0)</translation>
+ </message>
+ <message>
+ <source>Connect through SOCKS5 proxy</source>
+ <translation>Połącz przez SOCKS5 proxy</translation>
+ </message>
+ <message>
+ <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
+ <translation>Copyright (C) 2009-%i The Bitcoin Core Developers</translation>
+ </message>
+ <message>
+ <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
+ <translation>Błąd ładowania wallet.dat: Portfel wymaga nowszej wersji Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Błąd odczytu z bazy danych, wyłączam się.</translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -tor found, use -onion.</source>
+ <translation>Błąd: Znaleziono nieprawidłowy argument -tor, użyj -onion.</translation>
+ </message>
+ <message>
+ <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
+ <translation>Prowizja (w BTC za kB) dodawana do wysyłanej transakcji (domyślnie: %s)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Informacja</translation>
</message>
<message>
+ <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
+ <translation>Wstępna kontrola poprawności nie powiodła się. Bitcoin Core wyłącza się.</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Nieprawidłowa kwota dla -maxtxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Nieprawidłowa kwota dla -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
</message>
@@ -2542,12 +2751,12 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>Nieprawidłowa kwota dla -mintxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Node relay options:</source>
- <translation>Opcje przekaźnikowe węzła:</translation>
+ <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation>Nieprawidłowa kwota dla -paytxfee=&lt;amount&gt;: '%s' (musi być co najmniej %s)</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Wyświetlaj blok podczas uruchamiania, jeżeli znaleziono indeks bloków</translation>
+ <source>Node relay options:</source>
+ <translation>Opcje przekaźnikowe węzła:</translation>
</message>
<message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
@@ -2563,17 +2772,33 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
</message>
<message>
<source>Randomly fuzz 1 of every &lt;n&gt; network messages</source>
- <translation>Losowo ignoruje 1 z wszystkich &lt;n&gt; wiadomości sieciowych.</translation>
+ <translation>Losowo miesza 1 z wszystkich &lt;n&gt; wiadomości sieciowych.</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Wyślij informację/raport do konsoli zamiast do pliku debug.log.</translation>
</message>
<message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>Wyślij bez opłaty jeżeli to możliwe (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Ustaw certyfikaty główne SSL dla żądań płatności (domyślnie: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Ustaw Język, na przykład "pl_PL" (domyślnie: systemowy)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Pokaż wszystkie opcje odpluskwiania (użycie: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Pokazuj okno powitalne przy starcie (domyślnie: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Zmniejsz plik debug.log przy starcie programu (domyślnie: 1 jeśli nie użyto -debug)</translation>
</message>
@@ -2582,6 +2807,10 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>Podpisywanie transakcji nie powiodło się</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Uruchom zminimalizowany</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>To oprogramowanie eksperymentalne.</translation>
</message>
@@ -2594,10 +2823,18 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>Kwota transakcji musi być dodatnia</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transakcja jest zbyt duża dla tej opłaty</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Transakcja zbyt duża</translation>
</message>
<message>
+ <source>Unable to bind to %s on this computer (bind returned error %s)</source>
+ <translation>Nie można przywiązać do %s na tym komputerze (bind zwrócił błąd %s)</translation>
+ </message>
+ <message>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
<translation>Używaj UPnP do mapowania portu nasłuchu (domyślnie: 1 gdy nasłuchuje)</translation>
</message>
@@ -2607,15 +2844,23 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
</message>
<message>
<source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
- <translation>Portfel wymaga przepisania: zresetuj Bitcoina aby ukończyć</translation>
+ <translation>Portfel wymaga przepisania: zrestartuj Bitcoina aby ukończyć</translation>
</message>
<message>
<source>Warning</source>
<translation>Ostrzeżenie</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Uwaga: Ta wersja jest przestarzała, aktualizacja wymagana!</translation>
+ <source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Uwaga: Zignorowano nieprawidłowy argument -benchmark, użyj -debug=bench.</translation>
+ </message>
+ <message>
+ <source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Uwaga: Zignorowano nieprawidłowy argument -debugnet , użyj -debug=net.</translation>
+ </message>
+ <message>
+ <source>Zapping all transactions from wallet...</source>
+ <translation>Usuwam wszystkie transakcje z portfela...</translation>
</message>
<message>
<source>on startup</source>
@@ -2639,7 +2884,7 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
</message>
<message>
<source>Rescan the block chain for missing wallet transactions</source>
- <translation>Przeskanuj blok łańcuchów żeby znaleźć zaginione transakcje portfela</translation>
+ <translation>Przeskanuj łańcuch bloków w poszukiwaniu zaginionych transakcji portfela</translation>
</message>
<message>
<source>Use OpenSSL (https) for JSON-RPC connections</source>
@@ -2662,14 +2907,146 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>Błąd ładowania wallet.dat: Uszkodzony portfel</translation>
</message>
<message>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = zachowaj wysłane metadane np. właściciel konta i informacje o żądaniach płatności, 2 = porzuć wysłane metadane)</translation>
+ </message>
+ <message>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>Jak dokładna jest weryfikacja bloków przy -checkblocks (0-4, domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
+ <translation>Loguj priorytety transakcji i opłaty na kB podczas kopania bloków (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
+ <translation>Utrzymuj pełny indeks transakcji, używany przy wywołaniu RPC getrawtransaction (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
+ <translation>Czas w sekundach, przez jaki nietrzymające się zasad węzły nie będą mogły ponownie się podłączyć (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>(default: %s)</source>
+ <translation>(domyślnie: %s)</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>Błąd ładowania wallet.dat</translation>
</message>
<message>
+ <source>Force safe mode (default: %u)</source>
+ <translation>Wymuś tryb bezpieczny (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Generate coins (default: %u)</source>
+ <translation>Generuj monety (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>How many blocks to check at startup (default: %u, 0 = all)</source>
+ <translation>Ile bloków sprawdzić przy starcie (domyślnie: %u, 0 = wszystkie)</translation>
+ </message>
+ <message>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>Dołącz adresy IP do logowania (domyślnie: %u)</translation>
+ </message>
+ <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Nieprawidłowy adres -proxy: '%s'</translation>
</message>
<message>
+ <source>Limit size of signature cache to &lt;n&gt; entries (default: %u)</source>
+ <translation>Ogranicz rozmiar pamięci podręcznej sygnatur do &lt;n&gt; wpisów (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Nasłuchuj połączeń JSON-RPC na &lt;port&gt; (domyślnie: %u lub testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Nasłuchuj połączeń na &lt;port&gt; (domyślnie: %u lub testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
+ <translation>Utrzymuj maksymalnie &lt;n&gt; połączeń z węzłami (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Maksymalny bufor odbioru na połączenie, &lt;n&gt;*1000 bajtów (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>Maksymalny bufor wysyłania na połączenie, &lt;n&gt;*1000 bajtów (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Only accept block chain matching built-in checkpoints (default: %u)</source>
+ <translation>Akceptuj tylko łańcuch bloków zgodny z wbudowanymi punktami kontrolnymi (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Prepend debug output with timestamp (default: %u)</source>
+ <translation>Dołączaj znacznik czasu do logowania (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>Przekazuj i wydobywaj transakcje zawierające dane (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>Przekazuj transakcje multisig inne niż P2SH (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Run a thread to flush wallet periodically (default: %u)</source>
+ <translation>Uruchom wątek do okresowego zapisywania portfela (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Server certificate file (default: %s)</source>
+ <translation>Plik certyfikatu serwera (domyślnie: %s)</translation>
+ </message>
+ <message>
+ <source>Server private key (default: %s)</source>
+ <translation>Klucz prywatny serwera (domyślnie: %s)</translation>
+ </message>
+ <message>
+ <source>Set key pool size to &lt;n&gt; (default: %u)</source>
+ <translation>Ustaw rozmiar puli kluczy na &lt;n&gt; (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Set minimum block size in bytes (default: %u)</source>
+ <translation>Ustaw minimalny rozmiar bloku w bajtach (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Set the number of threads to service RPC calls (default: %d)</source>
+ <translation>Ustaw liczbę wątków do obsługi RPC (domyślnie: %d)</translation>
+ </message>
+ <message>
+ <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source>
+ <translation>Ustaw flagę DB_PRIVATE w środowisku wallet db (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Specify configuration file (default: %s)</source>
+ <translation>Wskaż plik konfiguracyjny (domyślnie: %s)</translation>
+ </message>
+ <message>
+ <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
+ <translation>Wskaż czas oczekiwania na połączenie w milisekundach (minimum: 1, domyślnie: %d)</translation>
+ </message>
+ <message>
+ <source>Specify pid file (default: %s)</source>
+ <translation>Wskaż plik pid (domyślnie: %s)</translation>
+ </message>
+ <message>
+ <source>Spend unconfirmed change when sending transactions (default: %u)</source>
+ <translation>Wydawaj niepotwierdzoną resztę podczas wysyłania transakcji (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Stop running after importing blocks from disk (default: %u)</source>
+ <translation>Zatrzymaj po zaimportowaniu bloków z dysku (domyślnie: %u)</translation>
+ </message>
+ <message>
+ <source>Threshold for disconnecting misbehaving peers (default: %u)</source>
+ <translation>Próg, po którym nastąpi rozłączenie węzłów nietrzymających się zasad (domyślnie: %u)</translation>
+ </message>
+ <message>
<source>Unknown network specified in -onlynet: '%s'</source>
<translation>Nieznana sieć w -onlynet: '%s'</translation>
</message>
@@ -2686,10 +3063,6 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>Nieprawidłowa kwota dla -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Nieprawidłowa kwota</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Niewystarczające środki</translation>
</message>
@@ -2699,7 +3072,7 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
</message>
<message>
<source>Add a node to connect to and attempt to keep the connection open</source>
- <translation>Dodaj węzeł do łączenia się and attempt to keep the connection open</translation>
+ <translation>Dodaj węzeł do podłączenia się i próbuj utrzymać to połączenie</translation>
</message>
<message>
<source>Loading wallet...</source>
@@ -2722,10 +3095,6 @@ na przykład: alertnotify=echo %%s | mail -s "Alarm Bitcoin" admin@foo.com⏎</t
<translation>Wczytywanie zakończone</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Aby użyć opcji %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Błąd</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pt_BR.ts b/src/qt/locale/bitcoin_pt_BR.ts
index 65f07ca59c..42a781de99 100644
--- a/src/qt/locale/bitcoin_pt_BR.ts
+++ b/src/qt/locale/bitcoin_pt_BR.ts
@@ -1,13 +1,13 @@
-<TS language="pt_BR" version="2.0">
+<TS language="pt_BR" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Duplo-clique para editar o endereço ou o rótulo</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Clique com o botão direito para editar o endereço ou rótulo </translation>
</message>
<message>
<source>Create a new address</source>
- <translation>Criar um novo endereço</translation>
+ <translation>Criar novo endereço</translation>
</message>
<message>
<source>&amp;New</source>
@@ -59,11 +59,11 @@
</message>
<message>
<source>Sending addresses</source>
- <translation>Enviando endereços</translation>
+ <translation>Endereços para envios</translation>
</message>
<message>
<source>Receiving addresses</source>
- <translation>Recebendo endereços</translation>
+ <translation>Endereços de recebimento</translation>
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
@@ -156,22 +156,22 @@
<translation>Alterar frase de segurança</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Digite a frase de segurança antiga e nova para a carteira.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirmar criptografia da carteira</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>Atenção: Se você criptografar sua carteira e perder sua senha, você vai &lt;b&gt;perder todos os seus BITCOINS!&lt;/b&gt;</translation>
+ <translation>Atenção: Se você criptografar sua carteira e perder sua frase, você vai &lt;b&gt;perder todos os seus BITCOINS!&lt;/b&gt;</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
<translation>Tem certeza de que deseja criptografar sua carteira?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>O Bitcoin irá fechar agora para terminar o processo de criptografia. Lembre-se que criptografando sua carteira não te protege totalmente de ter seus bitcoins roubados por um malware que infectar seu computador.</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>IMPORTANTE: Qualquer backup prévio que você tenha feito do seu arquivo wallet deve ser substituído pelo novo e encriptado arquivo wallet gerado. Por razões de segurança, qualquer backup do arquivo wallet não criptografado se tornará inútil assim que você começar a usar uma nova carteira criptografada.</translation>
</message>
@@ -185,11 +185,11 @@
</message>
<message>
<source>Enter the new passphrase to 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>Digite a nova senha da carteira. &lt;br/&gt;Por favor utilize uma senha com &lt;b&gt;dez ou mais caracteres aleartórios&lt;/b&gt;, ou &lt;b&gt;oito ou mais palavras&lt;/b&gt;.</translation>
+ <translation>Digite a nova frase da carteira. &lt;br/&gt;Por favor utilize uma senha com &lt;b&gt;dez ou mais caracteres aleartórios&lt;/b&gt;, ou &lt;b&gt;oito ou mais palavras&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>O Bitcoin irá fechar agora para finalizar o processo de encriptação. Lembre-se de que encriptar sua carteira não protege totalmente suas bitcoins de serem roubadas por malwares que tenham infectado o seu computador.</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Insira a frase antiga e a nova da carteira.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -224,7 +224,7 @@
<name>BitcoinGUI</name>
<message>
<source>Sign &amp;message...</source>
- <translation>&amp;Assinar Mensagem...</translation>
+ <translation>&amp;Assinar mensagem...</translation>
</message>
<message>
<source>Synchronizing with network...</source>
@@ -284,11 +284,11 @@
</message>
<message>
<source>&amp;Sending addresses...</source>
- <translation>Enviando endereço&amp;s...</translation>
+ <translation>Endereço&amp;s de envio...</translation>
</message>
<message>
<source>&amp;Receiving addresses...</source>
- <translation>&amp;Receber endereços...</translation>
+ <translation>Endereços de &amp;Recebimento...</translation>
</message>
<message>
<source>Open &amp;URI...</source>
@@ -296,7 +296,7 @@
</message>
<message>
<source>Bitcoin Core client</source>
- <translation>Cliente Bitcoin Core</translation>
+ <translation>Cliente Bitcoin</translation>
</message>
<message>
<source>Importing blocks from disk...</source>
@@ -311,10 +311,6 @@
<translation>Enviar moedas para um endereço bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modificar opções de configuração para bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Fazer cópia de segurança da carteira para uma outra localização</translation>
</message>
@@ -352,7 +348,7 @@
</message>
<message>
<source>Show information about Bitcoin Core</source>
- <translation>Mostrar informações sobre Bitcoin Core</translation>
+ <translation>Mostrar informações sobre Bitcoin</translation>
</message>
<message>
<source>&amp;Show / Hide</source>
@@ -368,7 +364,7 @@
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation>Assine mensagems com seus endereços Bitcoin para provar que você é dono deles</translation>
+ <translation>Assine mensagens com seus endereços Bitcoin para provar que você é dono delas</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
@@ -384,7 +380,7 @@
</message>
<message>
<source>&amp;Help</source>
- <translation>&amp;Ajuda</translation>
+ <translation>A&amp;juda</translation>
</message>
<message>
<source>Tabs toolbar</source>
@@ -392,7 +388,7 @@
</message>
<message>
<source>Bitcoin Core</source>
- <translation>Núcleo Bitcoin</translation>
+ <translation>Bitcoin</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -400,7 +396,11 @@
</message>
<message>
<source>&amp;About Bitcoin Core</source>
- <translation>&amp;A respeito do Bitcoin Core</translation>
+ <translation>&amp;Sobre Bitcoin</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Modificar opções de configuração do Bitcoin</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
@@ -420,7 +420,7 @@
</message>
<message>
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Mostra a mensagem de ajuda do Bitcoin Core para pegar a lista com os comandos possíveis</translation>
+ <translation>Mostra a mensagem de ajuda do Bitcoin para pegar a lista com os comandos possíveis</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
@@ -483,6 +483,36 @@
<translation>Recuperando o atraso ...</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation>Data: %1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation>Quantidade: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation>Tipo: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>Rótulo: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Endereço: %1
+</translation>
+ </message>
+ <message>
<source>Sent transaction</source>
<translation>Transação enviada</translation>
</message>
@@ -491,17 +521,6 @@
<translation>Transação recebida</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Data: %1
-Quantidade: %2
-Tipo: %3
-Endereço: %4</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Carteira está &lt;b&gt;criptografada&lt;/b&gt; e atualmente &lt;b&gt;desbloqueada&lt;/b&gt;</translation>
</message>
@@ -520,6 +539,10 @@ Endereço: %4</translation>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Selecionar Moeda</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Quantidade:</translation>
</message>
@@ -568,6 +591,14 @@ Endereço: %4</translation>
<translation>Quantidade</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>Recebido com rótulo</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Recebido com endereço </translation>
+ </message>
+ <message>
<source>Date</source>
<translation>Data</translation>
</message>
@@ -680,6 +711,18 @@ Endereço: %4</translation>
<translation>nenhum</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Este texto fica vermelho se o tamanho da transação for maior que 1000 bytes.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Este texto fica vermelho se a prioridade é menor que "medio".</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>Este texto fica vermelho se qualquer destinatário receber uma quantidade menor que %1.</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation>Pode variar +/- %1 satoshi(s) por entrada.</translation>
</message>
@@ -692,10 +735,6 @@ Endereço: %4</translation>
<translation>não</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Esse marcador fica vermelho se a transação ultrapassar 1000 bytes.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Isso significa que uma taxa de pelo menos %1 por kB é necessária.</translation>
</message>
@@ -708,14 +747,6 @@ Endereço: %4</translation>
<translation>Transações de alta prioridade são mais propensas a serem incluídas em um bloco.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Esse marcador fica vermelho se a prioridade for menor que "média".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Esse marcador fica vermelho se qualquer destinatário receber uma quantia menor que %1</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(Sem rótulo)</translation>
</message>
@@ -810,7 +841,7 @@ Endereço: %4</translation>
<name>HelpMessageDialog</name>
<message>
<source>Bitcoin Core</source>
- <translation>Núcleo Bitcoin</translation>
+ <translation>Bitcoin</translation>
</message>
<message>
<source>version</source>
@@ -822,7 +853,7 @@ Endereço: %4</translation>
</message>
<message>
<source>About Bitcoin Core</source>
- <translation>Sobre o Bitcoin Core</translation>
+ <translation>Sobre o Bitcoin</translation>
</message>
<message>
<source>Command-line options</source>
@@ -836,30 +867,6 @@ Endereço: %4</translation>
<source>command-line options</source>
<translation>opções da linha de comando</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>opções da UI</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Escolher língua, por exemplo "de_DE" (padrão: localização do sistema)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Inicializar minimizado</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Define certificados SSL root para requisição de pagamento (padrão: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Mostrar tela inicial ao ligar (padrão: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Escolha o diretório de dados na inicialização (padrão: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -869,15 +876,15 @@ Endereço: %4</translation>
</message>
<message>
<source>Welcome to Bitcoin Core.</source>
- <translation>Bem vindo ao Bitcoin Core.</translation>
+ <translation>Bem vindo ao Bitcoin.</translation>
</message>
<message>
<source>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</source>
- <translation>A primeira vez que o programa é aberto você pode escolher onde o Bitcoin Core vai guardar os dados.</translation>
+ <translation>A primeira vez que o programa é aberto você pode escolher onde o Bitcoin vai guardar os dados.</translation>
</message>
<message>
<source>Bitcoin Core will download and store a copy of the Bitcoin block chain. At least %1GB of data will be stored in this directory, and it will grow over time. The wallet will also be stored in this directory.</source>
- <translation>Bitcoin Core vai fazer download e guardar uma cópia da longa e única cadeia de blocos do Bitcoin: Blockchain. Pelo menos %1 GB de dados serão armazenados nesse diretório e isso aumentará ao longo do tempo. Sua carteira também será armazenada nesse diretório.</translation>
+ <translation>O Bitcoin vai fazer download e salvar uma cópia da cadeia de blocos do Bitcoin: Blockchain. Pelo menos %1 GB de dados serão armazenados nesse diretório e isso aumentará ao longo do tempo. Sua carteira também será armazenada nesse diretório.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -889,7 +896,7 @@ Endereço: %4</translation>
</message>
<message>
<source>Bitcoin Core</source>
- <translation>Núcleo Bitcoin</translation>
+ <translation>Bitcoin</translation>
</message>
<message>
<source>Error: Specified data directory "%1" cannot be created.</source>
@@ -942,14 +949,6 @@ Endereço: %4</translation>
<translation>Principal</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Iniciar Bitcoin automaticamente após se logar no sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>Iniciar Bitcoin no login do sistema</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Tamanho do banco de &amp;dados do cache</translation>
</message>
@@ -974,12 +973,20 @@ Endereço: %4</translation>
<translation>Endereço de IP do proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</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>Minimizar em vez de fechar o programa quando a janela for fechada. Quando essa opção estiver ativa, o programa só será fechado somente pela opção Sair no menu Arquivo.</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>A linguagem da interface do usuário pode ser alterada aqui. A mudança ocorrerá após o reinício do Bitcoin Core.</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>URLs de terceiros (exemplo: explorador de blocos) que aparecem na aba de transações como itens do menu de contexto. %s na URL é substituido pela hash da transação. Múltiplas URLs são separadas pela barra vertical |.</translation>
</message>
<message>
<source>Third party transaction URLs</source>
- <translation>URLs da transação de terceiros</translation>
+ <translation>URLs de transação de terceiros:</translation>
</message>
<message>
<source>Active command-line options that override above options:</source>
@@ -998,6 +1005,14 @@ Endereço: %4</translation>
<translation>Rede</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>Inicar automaticamente o Bitcoin ao logar no sistema.</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>&amp;Iniciar Bitcoin no login do sistema</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = automático, &lt;0 = número de cores deixados livres)</translation>
</message>
@@ -1030,6 +1045,14 @@ Endereço: %4</translation>
<translation>Mapear porta usando &amp;UPnP</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Conectar na rede Bitcoin através de um proxy SOCKS5.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>&amp;Conectar usando proxy SOCKS5 (proxy pradrão):</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>&amp;IP do proxy:</translation>
</message>
@@ -1054,10 +1077,6 @@ Endereço: %4</translation>
<translation>&amp;Minimizar para a bandeja em vez da barra de tarefas.</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 Quit in the menu.</source>
- <translation>Minimizar em vez de sair do aplicativo quando a janela for fechada. Quando esta opção é escolhida, o aplicativo só será fechado selecionando Sair no menu Arquivo.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimizar ao sair</translation>
</message>
@@ -1067,11 +1086,7 @@ Endereço: %4</translation>
</message>
<message>
<source>User Interface &amp;language:</source>
- <translation>&amp;Língua da interface com usuário:</translation>
- </message>
- <message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>A língua da interface com usuário pode ser escolhida aqui. Esta configuração só surtirá efeito após reiniciar o Bitcoin.</translation>
+ <translation>&amp;Linguagem da interface:</translation>
</message>
<message>
<source>&amp;Unit to show amounts in:</source>
@@ -1110,8 +1125,8 @@ Endereço: %4</translation>
<translation>Reinicialização do aplicativo necessária para efetivar alterações.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>O aplicativo vai desligar, deseja continuar?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>O programa será encerrado. Deseja continuar?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1134,7 +1149,7 @@ Endereço: %4</translation>
</message>
<message>
<source>Watch-only:</source>
- <translation>Apenas visualizar:</translation>
+ <translation>Monitorados:</translation>
</message>
<message>
<source>Available:</source>
@@ -1177,12 +1192,24 @@ Endereço: %4</translation>
<translation>Sua balança atual em endereços apenas visualizados</translation>
</message>
<message>
+ <source>Spendable:</source>
+ <translation>Disponível: </translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation>Transações recentes</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>fora de sincronia</translation>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation>Transações não confirmadas de um endereço monitorado</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation>Saldo minerado de endereço monitorado ainda não foi implementado</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation>Balanço total em endereços monitorados</translation>
</message>
</context>
<context>
@@ -1200,8 +1227,8 @@ Endereço: %4</translation>
<translation>Solicitação de pagamento rejeitada</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Solicitação de pagamento expirou.</translation>
+ <source>Payment request is not initialized.</source>
+ <translation>Pedido de pagamento não é inicializado.</translation>
</message>
<message>
<source>Requested payment amount of %1 is too small (considered dust).</source>
@@ -1224,18 +1251,38 @@ Endereço: %4</translation>
<translation>Manipulação de arquivo de cobrança</translation>
</message>
<message>
+ <source>Payment request expired.</source>
+ <translation>Pedido de pagamento expirado.</translation>
+ </message>
+ <message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>Cobrança não verificada para scripts de pagamento personalizados não é suportado.</translation>
</message>
<message>
+ <source>Invalid payment request.</source>
+ <translation>Pedido de pagamento inválido.</translation>
+ </message>
+ <message>
<source>Refund from %1</source>
<translation>Reembolso de %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>Pedido de pagamento %1 é muito grande (%2 bytes, permitido %3 bytes).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Pagamento requer proteção DoS</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Erro na comunicação com %1: %2</translation>
</message>
<message>
+ <source>Payment request cannot be parsed!</source>
+ <translation>Requisição de pagamento não pode ser analisado!</translation>
+ </message>
+ <message>
<source>Bad response from server %1</source>
<translation>Resposta incorreta do servidor %1</translation>
</message>
@@ -1251,8 +1298,16 @@ Endereço: %4</translation>
<context>
<name>PeerTableModel</name>
<message>
+ <source>User Agent</source>
+ <translation>User Agent</translation>
+ </message>
+ <message>
+ <source>Node/Service</source>
+ <translation>Nó/Serviço</translation>
+ </message>
+ <message>
<source>Ping Time</source>
- <translation>Tempo de Ping</translation>
+ <translation>Ping</translation>
</message>
</context>
<context>
@@ -1282,14 +1337,6 @@ Endereço: %4</translation>
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>REDE</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>DESCONHECIDO</translation>
- </message>
- <message>
<source>None</source>
<translation>Nenhum</translation>
</message>
@@ -1341,7 +1388,7 @@ Endereço: %4</translation>
</message>
<message>
<source>Debug window</source>
- <translation>Janela de debug</translation>
+ <translation>Janela de depuração</translation>
</message>
<message>
<source>General</source>
@@ -1349,7 +1396,11 @@ Endereço: %4</translation>
</message>
<message>
<source>Using OpenSSL version</source>
- <translation>Usando OpenSSL versão</translation>
+ <translation>Versão do OpenSSL</translation>
+ </message>
+ <message>
+ <source>Using BerkeleyDB version</source>
+ <translation>Versão do BerkeleyDB</translation>
</message>
<message>
<source>Startup time</source>
@@ -1376,6 +1427,10 @@ Endereço: %4</translation>
<translation>Quantidade atual de blocos</translation>
</message>
<message>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Abrir o arquivo de log de depuração do Bitcoin na pasta de dados atual. Isso pode demorar para arquivos grandes.</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Recebido</translation>
</message>
@@ -1388,6 +1443,10 @@ Endereço: %4</translation>
<translation>&amp;Pares</translation>
</message>
<message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>Selecione um cliente para ver informações detalhadas.</translation>
+ </message>
+ <message>
<source>Direction</source>
<translation>Direção</translation>
</message>
@@ -1396,14 +1455,30 @@ Endereço: %4</translation>
<translation>Versão</translation>
</message>
<message>
+ <source>User Agent</source>
+ <translation>User Agent</translation>
+ </message>
+ <message>
<source>Services</source>
<translation>Serviços</translation>
</message>
<message>
+ <source>Starting Height</source>
+ <translation>Altura inicial</translation>
+ </message>
+ <message>
+ <source>Sync Height</source>
+ <translation>Altura sincronizada</translation>
+ </message>
+ <message>
<source>Ban Score</source>
<translation>Banir pontuação</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation>Tempo de conexão </translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation>Ultimo Envio</translation>
</message>
@@ -1417,11 +1492,11 @@ Endereço: %4</translation>
</message>
<message>
<source>Bytes Received</source>
- <translation>bytes Recebidos</translation>
+ <translation>Bytes recebidos</translation>
</message>
<message>
<source>Ping Time</source>
- <translation>Tempo de Ping</translation>
+ <translation>Ping</translation>
</message>
<message>
<source>Last block time</source>
@@ -1464,16 +1539,12 @@ Endereço: %4</translation>
<translation>Arquivo de log de Depuração</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Abrir o arquivo de log de depuração do Bitcoin do diretório atual de dados. Isso pode levar alguns segundos para arquivos de log grandes.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Limpar console</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bem-vindo ao console Bitcoin RPC.</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Bem vindo ao console de RPC do Bitcoin.</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
@@ -1519,7 +1590,11 @@ Endereço: %4</translation>
<source>Unknown</source>
<translation>Desconhecido</translation>
</message>
- </context>
+ <message>
+ <source>Fetching...</source>
+ <translation>Buscando...</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
@@ -1693,11 +1768,11 @@ Endereço: %4</translation>
<name>SendCoinsDialog</name>
<message>
<source>Send Coins</source>
- <translation>Enviar dinheiro</translation>
+ <translation>Enviar moedas</translation>
</message>
<message>
<source>Coin Control Features</source>
- <translation>Opções de Controle da Moeda</translation>
+ <translation>Opções de controle de moeda</translation>
</message>
<message>
<source>Inputs...</source>
@@ -1737,7 +1812,7 @@ Endereço: %4</translation>
</message>
<message>
<source>Change:</source>
- <translation>trocar</translation>
+ <translation>troco</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>
@@ -1748,6 +1823,70 @@ Endereço: %4</translation>
<translation>Endereço específico de troco</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Taxa de transação: </translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>Escolher</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>por kilobyte</translation>
+ </message>
+ <message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>Se a taxa personalizada for definida em 1000 satoshis e a transação tiver somente 250 bytes, então "por kilobyte" somente paga 250 satoshis de taxa, enquanto "pelo menos" paga 1000 satoshis. Se a transação for maior que 1 kilobyte, ambos pagam por kilobyte.</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation>Ocultar</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>pelo menos</translation>
+ </message>
+ <message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>Pagando apenas a taxa mínima é bom, desde que haja pouco volume de transações. Mas esteja ciente de que isso pode acabar em uma transação nunca confirmanda uma vez que há mais demanda por transações do que a rede pode processar.</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(Leia o popup)</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Recomendado:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>Personalizado:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(Smart fee não iniciado. Isso requer alguns blocos...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Tempo de confirmação:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>normal</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>rápido </translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Enviar sem taxa de transação se possível </translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(confirmação pode demorar)</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Enviar para vários destinatários de uma só vez</translation>
</message>
@@ -1781,7 +1920,7 @@ Endereço: %4</translation>
</message>
<message>
<source>Confirm send coins</source>
- <translation>Confirmar envio de dinheiro</translation>
+ <translation>Confirmar envio de moedas</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -1824,10 +1963,6 @@ Endereço: %4</translation>
<translation>ou</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>O endereço do destinatário não é válido, favor verificar.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>A quantidade a ser paga precisa ser maior que 0.</translation>
</message>
@@ -1840,10 +1975,6 @@ Endereço: %4</translation>
<translation>O total excede seu saldo quando uma taxa de transação de %1 é incluída.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Endereço duplicado: pode-se enviar para cada endereço apenas uma vez por transação.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>A criação de transação falhou!</translation>
</message>
@@ -1852,6 +1983,30 @@ Endereço: %4</translation>
<translation>A transação foi rejeitada! Isso pode acontecer se alguns bitcoins na sua carteira já foram gastos em outro local, por exemplo se você tiver uma cópia do wallet.dat e os bitcoins tiverem sido gastos na cópia mas não marcados como gastos aqui ainda.</translation>
</message>
<message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation>Uma taxa maior que %1 é considerada uma taxa absurdamente alto.</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>Pedido de pagamento expirado.</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation><numerusform>Confirmação estimada em %n bloco.</numerusform><numerusform>Confirmação estimada em %n blocos.</numerusform></translation>
+ </message>
+ <message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Pagar somente a taxa mínima de %1</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>O endereço do destinatário é inválido. Favor confirmar.</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation>Endereço duplicado encontrado: Endereços devem ser usados somente uma vez cada.</translation>
+ </message>
+ <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Atenção: endereço de Bitcoin inválido</translation>
</message>
@@ -1904,7 +2059,7 @@ Endereço: %4</translation>
</message>
<message>
<source>The Bitcoin address to send the payment to</source>
- <translation>O enderesso Bitcoin que enviarár o pagamento</translation>
+ <translation>Endereço que enviará o pagamento</translation>
</message>
<message>
<source>Alt+A</source>
@@ -1923,12 +2078,12 @@ Endereço: %4</translation>
<translation>Remover esta entrada</translation>
</message>
<message>
- <source>Message:</source>
- <translation>Mensagem:</translation>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation>&amp;Retirar taxa da quantia</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Essa é cobrança verificada.</translation>
+ <source>Message:</source>
+ <translation>Mensagem:</translation>
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
@@ -1939,10 +2094,6 @@ Endereço: %4</translation>
<translation>A mensagem que foi anexada ao bitcoin: URI na qual será gravada na transação para sua referência. Nota: Essa mensagem não será gravada publicamente na rede Bitcoin.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Essa é uma cobrança não verificada.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Pague Para:</translation>
</message>
@@ -1955,11 +2106,11 @@ Endereço: %4</translation>
<name>ShutdownWindow</name>
<message>
<source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core está desligando...</translation>
+ <translation>Bitcoin está desligando...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation>Não desligue o computador até esta janela desaparece.</translation>
+ <translation>Não desligue o computador até esta janela desapareça.</translation>
</message>
</context>
<context>
@@ -1970,11 +2121,7 @@ Endereço: %4</translation>
</message>
<message>
<source>&amp;Sign Message</source>
- <translation>&amp;Assinar Mensagem</translation>
- </message>
- <message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Você pode assinar mensagens com seus endereços para provar que você é o dono deles. Seja cuidadoso para não assinar algo vago, pois ataques de pishing podem tentar te enganar para dar sua assinatura de identidade para eles. Apenas assine afirmações completamente detalhadas com as quais você concorda.</translation>
+ <translation>&amp;Assinar mensagem</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -2014,7 +2161,7 @@ Endereço: %4</translation>
</message>
<message>
<source>Sign &amp;Message</source>
- <translation>Assinar &amp;Mensagem</translation>
+ <translation>Assinar &amp;mensagem</translation>
</message>
<message>
<source>Reset all sign message fields</source>
@@ -2026,11 +2173,7 @@ Endereço: %4</translation>
</message>
<message>
<source>&amp;Verify Message</source>
- <translation>&amp;Verificar Mensagem</translation>
- </message>
- <message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Forneça o endereço da assinatura, a mensagem (se assegure que você copiou quebras de linha, espaços, tabs, etc. exatamente) e a assinatura abaixo para verificar a mensagem. Cuidado para não ler mais na assinatura do que está escrito na mensagem propriamente, para evitar ser vítima de uma ataque do tipo "man-in-the-middle".</translation>
+ <translation>&amp;Verificar mensagem</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
@@ -2042,7 +2185,7 @@ Endereço: %4</translation>
</message>
<message>
<source>Verify &amp;Message</source>
- <translation>Verificar &amp;Mensagem</translation>
+ <translation>Verificar &amp;mensagem</translation>
</message>
<message>
<source>Reset all verify message fields</source>
@@ -2050,7 +2193,7 @@ Endereço: %4</translation>
</message>
<message>
<source>Click "Sign Message" to generate signature</source>
- <translation>Clique em "Assinar Mensagem" para gerar a assinatura</translation>
+ <translation>Clique em "Assinar mensagem" para gerar a assinatura</translation>
</message>
<message>
<source>The entered address is invalid.</source>
@@ -2105,11 +2248,11 @@ Endereço: %4</translation>
<name>SplashScreen</name>
<message>
<source>Bitcoin Core</source>
- <translation>Núcleo Bitcoin</translation>
+ <translation>Bitcoin</translation>
</message>
<message>
<source>The Bitcoin Core developers</source>
- <translation>Programadores do Bitcoin Core</translation>
+ <translation>Programadores do Bitcoin</translation>
</message>
<message>
<source>[testnet]</source>
@@ -2179,7 +2322,7 @@ Endereço: %4</translation>
</message>
<message>
<source>watch-only</source>
- <translation>Vizualização apenas</translation>
+ <translation>monitorado</translation>
</message>
<message>
<source>label</source>
@@ -2235,7 +2378,7 @@ Endereço: %4</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>Bitcoins recém minerados precisam aguardar %1 blocos antes de serem gastos. Quando o bloco foi gerado, ele foi disseminado pela rede para ser adicionado à cadeia de blocos: blockchain. Se ele falhar em ser inserido na cadeia, seu estado será modificado para "não aceito" e ele não poderá ser gasto. Isso pode acontecer eventualmente quando blocos são gerados quase que simultaneamente.</translation>
+ <translation>Bitcoins recém minerados precisam aguardar %1 blocos antes de serem gastos. Quando o bloco foi gerado, ele foi disseminado pela rede para ser adicionado à blockchain. Se ele falhar em ser inserido na cadeia, seu estado será modificado para "não aceito" e ele não poderá ser gasto. Isso pode acontecer eventualmente quando blocos são gerados quase que simultaneamente.</translation>
</message>
<message>
<source>Debug information</source>
@@ -2296,10 +2439,6 @@ Endereço: %4</translation>
<translation>Tipo</translation>
</message>
<message>
- <source>Address</source>
- <translation>Endereço</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Recém-criado (%1 confirmações, disponível somente após %2)</translation>
</message>
@@ -2328,6 +2467,10 @@ Endereço: %4</translation>
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Rótulo</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Não confirmado</translation>
</message>
@@ -2341,15 +2484,15 @@ Endereço: %4</translation>
</message>
<message>
<source>Received with</source>
- <translation>Recebido por</translation>
+ <translation>Recebido</translation>
</message>
<message>
<source>Received from</source>
- <translation>Recebido de</translation>
+ <translation>Recebido</translation>
</message>
<message>
<source>Sent to</source>
- <translation>Enviado para</translation>
+ <translation>Enviado</translation>
</message>
<message>
<source>Payment to yourself</source>
@@ -2361,7 +2504,7 @@ Endereço: %4</translation>
</message>
<message>
<source>watch-only</source>
- <translation>Vizualização apenas</translation>
+ <translation>monitorado</translation>
</message>
<message>
<source>(n/a)</source>
@@ -2380,10 +2523,6 @@ Endereço: %4</translation>
<translation>Tipo de transação.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Endereço de destino da transação.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Quantidade debitada ou creditada ao saldo.</translation>
</message>
@@ -2420,11 +2559,11 @@ Endereço: %4</translation>
</message>
<message>
<source>Received with</source>
- <translation>Recebido por</translation>
+ <translation>Recebido</translation>
</message>
<message>
<source>Sent to</source>
- <translation>Enviado para</translation>
+ <translation>Enviado</translation>
</message>
<message>
<source>To yourself</source>
@@ -2476,7 +2615,7 @@ Endereço: %4</translation>
</message>
<message>
<source>Watch-only</source>
- <translation>Vizualização apenas</translation>
+ <translation>Monitorado</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -2533,7 +2672,11 @@ Endereço: %4</translation>
</context>
<context>
<name>UnitDisplayStatusBarControl</name>
- </context>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Unidade para mostrar. Clique para selecionar outra unidade.</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2618,44 +2761,20 @@ Endereço: %4</translation>
<translation>Aceitar conexões externas (padrão: 1 se opções -proxy ou -connect não estiverem presentes)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, você deve especificar uma senha rpcpassword no arquivo de configuração:⏎
-%s⏎
-É recomendado que você use a seguinte senha aleatória:⏎
-rpcuser=bitcoinrpc⏎
-rpcpassword=%s⏎
-(você não precisa lembrar esta senha)⏎
-O nome de usuário e a senha NÃO PODEM ser os mesmos.⏎
-Se o arquivo não existir, crie um com permissão de leitura apenas para o dono.⏎
-É recomendado também definir um alertnotify para que você seja notificado de problemas;⏎
-por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Vincular ao endereço fornecido e sempre escutar nele. Use a notação [host]:port para IPv6</translation>
</message>
<message>
- <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
- <translation>Entra no modo de teste de regressão, que usa uma cadeia especial onde os blocos podem ser resolvidos instantaneamente.</translation>
+ <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
+ <translation>Apaga todas as transações da carteira e somente recupera essas partes da blockchain usando o comando -rescan na inicialização</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Erro: A transação foi rejeitada. Isso pode acontecer se alguns dos bitcoins de sua carteira já haviam sido gastos, por exemplo se você usou uma cópia do arquivo wallet.dat e alguns bitcoins foram gastos na cópia mas não foram marcados como gastos aqui.</translation>
+ <source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
+ <translation>Distribuido sob a licença MIT software license. Veja os termos em &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Erro: Esta transação requer uma taxa de transação de pelo menos %s, por causa sua quantidade, complexidade ou uso de dinheiro recebido recentemente.</translation>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>Entra no modo de teste de regressão, que usa uma cadeia especial onde os blocos podem ser resolvidos instantaneamente.</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
@@ -2675,7 +2794,7 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
</message>
<message>
<source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
- <translation>Impossível ouvir em %s neste computador. Bitcoin Core já está sendo executado provavelmente.</translation>
+ <translation>Impossível ouvir em %s neste computador. Provavelmente o Bitcoin já está sendo executado.</translation>
</message>
<message>
<source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
@@ -2727,11 +2846,7 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
</message>
<message>
<source>Debugging/Testing options:</source>
- <translation>Opções de Debug/Teste:</translation>
- </message>
- <message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Descobrir os próprios endereços IP (padrão: 1 quando no modo listening e opção -externalip não estiver presente)</translation>
+ <translation>Opções de depuração/teste:</translation>
</message>
<message>
<source>Do not load the wallet and disable wallet RPC calls</source>
@@ -2766,16 +2881,12 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Erro: Espaço em disco insuficiente!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Erro: Carteira bloqueada, impossível criar transação!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Falha ao escutar em qualquer porta. Use -listen=0 se você quiser isso.</translation>
</message>
<message>
<source>If &lt;category&gt; is not supplied, output all debugging information.</source>
- <translation>Se &lt;category&gt; não for informada, logar toda informação de debug.</translation>
+ <translation>Se &lt;category&gt; não for informada, registrar toda informação de depuração.</translation>
</message>
<message>
<source>Importing...</source>
@@ -2794,8 +2905,8 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Decriptadores de arquivos disponíveis insuficientes.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Reconstruir índice de blockchain a partir dos arquivos atuais blk000??.dat</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Somente conectar a clientes na rede &lt;net&gt; (ipv4, ipv6 ou onion)</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -2814,6 +2925,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Isso é usado para testes de regressão e ferramentas de desenvolvimento.</translation>
</message>
<message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Use UPnP para mapear a porta de entrada (padrão: %u)</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>Verificando blocos...</translation>
</message>
@@ -2827,27 +2942,35 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
</message>
<message>
<source>Wallet options:</source>
- <translation>Opções da Carteira:</translation>
+ <translation>Opções da carteira:</translation>
+ </message>
+ <message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>Atenção: Essa versão está obsoleta, atualização necessária!</translation>
</message>
<message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Você precisa reconstruir o banco de dados utilizando-reindexar a mudar-txindex</translation>
+ <translation>Você precisa reconstruir o banco de dados utilizando -reindex</translation>
</message>
<message>
<source>Imports blocks from external blk000??.dat file</source>
<translation>Importar blocos de um arquivo externo blk000??.dat</translation>
</message>
<message>
+ <source>Allow JSON-RPC connections from specified source. Valid for &lt;ip&gt; are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
+ <translation>Permitir conexões JSON-RPC de uma fonte específica. Válido para um único ip (ex. 1.2.3.4), até uma rede/máscara (ex. 1.2.3.4/255.255.255.0) ou uma rede/CIDR (ex. 1.2.3.4/24). Esta opção pode ser usada múltiplas vezes</translation>
+ </message>
+ <message>
<source>An error occurred while setting up the RPC address %s port %u for listening: %s</source>
<translation>Um erro ocorreu enquanto configurando o endereço RPC %s porta %u para escuta: %s</translation>
</message>
<message>
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
- <translation>Não foi possível obter proteção exclusiva ao diretório de dados %s. Bitcoin Core já está sendo executado provavelmente.</translation>
+ <translation>Não foi possível obter acesso exclusivo ao diretório de dados %s. Provavelmente Bitcoin já está sendo executado.</translation>
</message>
<message>
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
- <translation>Erro: Escutar por conexões de entrada falhou (escutar retornou erro %s)</translation>
+ <translation>Erro: Aceitar conexões de entrada falhou (retornou erro %s)</translation>
</message>
<message>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
@@ -2866,10 +2989,42 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Define o tamanho máximo de alta-prioridade por taxa baixa nas transações em bytes (padrão: %d)</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>Para usar o bitcoind, ou a opção -server do bitcoin-qt, você deve definir rpcpassword no arquivo de configuração:
+%s
+É recomendado que use a seguinte senha randômica:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(você não precisa lembrar esta senha)
+O usuário e senha NÃO DEVEM ser os mesmos.
+Se o arquivo não existir, crie com permissão de proprietário criador somente.
+É também recomendado definir a opção alertnotify se deseja ser notificado de problemas;
+por exemplo: alertnotify=echo %%s | mail -s "Alerta do Bitcoin" admin@foo.com.br
+</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(padrão: %u)</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>Impossível resolver endereço -whitebind: '%s'</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Escolha o diretório de dados na inicialização (padrão: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Connecte-se através de um proxy SOCKS5</translation>
</message>
@@ -2882,6 +3037,18 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Impossível interpretar o valor -rpcbind %s como um endereço da rede</translation>
</message>
<message>
+ <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
+ <translation>Erro ao carregar wallet.dat: A carteira requer a nova versão do Bitcoin</translation>
+ </message>
+ <message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Erro ao ler o banco de dados. Finalizando.</translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -tor found, use -onion.</source>
+ <translation>Erro: Argumento não suportado -tor, use -onion.</translation>
+ </message>
+ <message>
<source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
<translation>Taxa (em BTC/kB) a adicionar nas transações que você envia (padrão: %s)</translation>
</message>
@@ -2890,6 +3057,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Informação</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Quantidade inválida para -maxtxfee=&lt;quantidade&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Quantidade inválida para -minrelaytxfee=&lt;amount&gt;: '%s'</translation>
</message>
@@ -2906,18 +3077,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Máscara de rede especificada em -whitelist: '%s' é inválida</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Manter no máximo &lt;n&gt; blocos pendentes em memória (padrão: %u)</translation>
- </message>
- <message>
<source>Need to specify a port with -whitebind: '%s'</source>
<translation>Necessário informar uma porta com -whitebind: '%s'</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Imprime bloco ao iniciar, se encontrado no índice de blocos</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Opções RPC SSL: (veja o Bitcoin Wiki para instruções de configuração SSL)</translation>
</message>
@@ -2938,8 +3101,24 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Mandar informação de trace/debug para o console em vez de para o arquivo debug.log</translation>
</message>
<message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>Enviar transação sem taxa, se possível (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Define certificados SSL root para requisição de pagamento (padrão: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Escolher língua, por exemplo "de_DE" (padrão: localização do sistema)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
- <translation>Exibir todas opções de debug (uso: --help -help-debug)</translation>
+ <translation>Exibir todas opções de depuração (uso: --help -help-debug)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Mostrar tela inicial ao ligar (padrão: 1)</translation>
</message>
<message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
@@ -2950,6 +3129,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Assinatura de transação falhou</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Inicializar minimizado</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Este é um software experimental.</translation>
</message>
@@ -2962,10 +3145,18 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>As quantidades das transações devem ser positivas.</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transação muito grande para enviar sem taxa</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Transação muito larga</translation>
</message>
<message>
+ <source>UI Options:</source>
+ <translation>Opções da interface:</translation>
+ </message>
+ <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation>Impossível se ligar a %s neste computador (bind retornou erro %s)</translation>
</message>
@@ -2986,10 +3177,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Atenção</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Atenção: Esta versão está obsoleta, atualização exigida!</translation>
- </message>
- <message>
<source>Zapping all transactions from wallet...</source>
<translation>Aniquilando todas as transações da carteira...</translation>
</message>
@@ -3038,14 +3225,46 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Erro ao carregar wallet.dat: Carteira corrompida</translation>
</message>
<message>
+ <source>(default: %s)</source>
+ <translation>(padrão: %s)</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>Erro ao carregar wallet.dat</translation>
</message>
<message>
+ <source>Force safe mode (default: %u)</source>
+ <translation>Forçar modo seguro (default: %u)</translation>
+ </message>
+ <message>
+ <source>Generate coins (default: %u)</source>
+ <translation>Gerar moedas (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>Incluir endereço IP na saída de depuração (padrão: %u)</translation>
+ </message>
+ <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Endereço -proxy inválido: '%s'</translation>
</message>
<message>
+ <source>Limit size of signature cache to &lt;n&gt; entries (default: %u)</source>
+ <translation>Tamanho limite do cache de assinaturas de &lt;n&gt; entradas (padrão: %u)</translation>
+ </message>
+ <message>
+ <source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>Aguardar por conexões na porta &lt;port&gt; (padrão: %u ou testnet: %u)</translation>
+ </message>
+ <message>
+ <source>Server certificate file (default: %s)</source>
+ <translation>Arquivo de certificado do servidor (padrão: %s)</translation>
+ </message>
+ <message>
+ <source>Server private key (default: %s)</source>
+ <translation>Chave privada do servidor (padrão: %s)</translation>
+ </message>
+ <message>
<source>Specify pid file (default: %s)</source>
<translation>Especificar aqrquivo pid (default: %s)</translation>
</message>
@@ -3066,10 +3285,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Quantidade inválida para -paytxfee=&lt;quantidade&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Quantidade inválida</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Saldo insuficiente</translation>
</message>
@@ -3102,10 +3317,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com⏎
<translation>Carregamento terminado</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Para usar a opção %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Erro</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pt_PT.ts b/src/qt/locale/bitcoin_pt_PT.ts
index dc016623e4..5012ff8d83 100644
--- a/src/qt/locale/bitcoin_pt_PT.ts
+++ b/src/qt/locale/bitcoin_pt_PT.ts
@@ -1,9 +1,9 @@
-<TS language="pt_PT" version="2.0">
+<TS language="pt_PT" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Clique duas vezes para editar o endereço ou o rótulo</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Clique á direita para editar endereço ou rótulo</translation>
</message>
<message>
<source>Create a new address</source>
@@ -43,7 +43,7 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation>E&amp;liminar\</translation>
+ <translation>&amp;Eliminar\</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
@@ -93,7 +93,11 @@
<source>Exporting Failed</source>
<translation>A Exportação Falhou</translation>
</message>
- </context>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <translation>Houve um erro ao tentar a guardar a lista de endereços em %1. Por favor tente novamente.</translation>
+ </message>
+</context>
<context>
<name>AddressTableModel</name>
<message>
@@ -152,10 +156,6 @@
<translation>Alterar frase de segurança</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Escreva a antiga frase de segurança da carteira, seguida da nova.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Confirmar encriptação da carteira</translation>
</message>
@@ -184,10 +184,6 @@
<translation>Escreva a nova frase de seguraça da sua carteira. &lt;br/&gt; Por favor, use uma frase de &lt;b&gt;10 ou mais caracteres aleatórios,&lt;/b&gt; ou &lt;b&gt;oito ou mais palavras&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>O cliente Bitcoin irá agora ser fechado para terminar o processo de encriptação. Recorde que a encriptação da sua carteira não protegerá totalmente os seus bitcoins de serem roubados por programas maliciosos que infectem o seu computador.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>A encriptação da carteira falhou</translation>
</message>
@@ -291,6 +287,10 @@
<translation>Abrir &amp;URI...</translation>
</message>
<message>
+ <source>Bitcoin Core client</source>
+ <translation>Cliente Bitcoin Core</translation>
+ </message>
+ <message>
<source>Importing blocks from disk...</source>
<translation>A importar blocos do disco...</translation>
</message>
@@ -303,10 +303,6 @@
<translation>Enviar moedas para um endereço bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modificar opções de configuração para bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Faça uma cópia de segurança da carteira para outra localização</translation>
</message>
@@ -343,6 +339,10 @@
<translation>&amp;Receber</translation>
</message>
<message>
+ <source>Show information about Bitcoin Core</source>
+ <translation>Mostrar informação sobre Bitcoin Core</translation>
+ </message>
+ <message>
<source>&amp;Show / Hide</source>
<translation>Mo&amp;strar / Ocultar</translation>
</message>
@@ -368,11 +368,11 @@
</message>
<message>
<source>&amp;Settings</source>
- <translation>Con&amp;figurações</translation>
+ <translation>&amp;Configurações</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation>A&amp;juda</translation>
+ <translation>&amp;Ajuda</translation>
</message>
<message>
<source>Tabs toolbar</source>
@@ -404,7 +404,7 @@
</message>
<message>
<source>&amp;Command-line options</source>
- <translation>Opções da linha de &amp;comandos</translation>
+ <translation>&amp;Opções da linha de &amp;comandos</translation>
</message>
<message>
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
@@ -479,17 +479,6 @@
<translation>Transação recebida</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Data: %1
-Quantia: %2
-Tipo: %3
-Endereço: %4</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>A carteira está &lt;b&gt;encriptada&lt;/b&gt; e atualmente &lt;b&gt;desbloqueada&lt;/b&gt;</translation>
</message>
@@ -508,6 +497,10 @@ Endereço: %4</translation>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Seleção de moeda</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Quantidade:</translation>
</message>
@@ -528,6 +521,10 @@ Endereço: %4</translation>
<translation>Taxa:</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>Lixo:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation>Depois da Taxa:</translation>
</message>
@@ -552,6 +549,14 @@ Endereço: %4</translation>
<translation>Quantia</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>Recebido com rótulo</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Recebido com endereço</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>Data</translation>
</message>
@@ -612,6 +617,10 @@ Endereço: %4</translation>
<translation>Copiar prioridade</translation>
</message>
<message>
+ <source>Copy dust</source>
+ <translation>Copiar lixo</translation>
+ </message>
+ <message>
<source>Copy change</source>
<translation>Copiar alteração</translation>
</message>
@@ -660,6 +669,10 @@ Endereço: %4</translation>
<translation>nenhum</translation>
</message>
<message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation>Pode variar +/- %1 satoshi(s) por entrada</translation>
+ </message>
+ <message>
<source>yes</source>
<translation>sim</translation>
</message>
@@ -668,10 +681,6 @@ Endereço: %4</translation>
<translation>não</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Este rótulo fica vermelha se o tamanho da transacção exceder os 1000 bytes.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Isto significa que uma taxa de pelo menos %1 por kB é necessária.</translation>
</message>
@@ -684,14 +693,6 @@ Endereço: %4</translation>
<translation>Transacções com uma prioridade mais alta têm uma maior probabilidade de serem incluídas num bloco.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Esta legenda fica vermelha, se a prioridade for menor que "média".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Este rótulo fica vermelho se algum recipiente receber uma quantia menor que %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(sem rótulo)</translation>
</message>
@@ -793,6 +794,10 @@ Endereço: %4</translation>
<translation>versão</translation>
</message>
<message>
+ <source>(%1-bit)</source>
+ <translation>(%1-bit)</translation>
+ </message>
+ <message>
<source>About Bitcoin Core</source>
<translation>Sobre o Bitcoin Core</translation>
</message>
@@ -808,26 +813,6 @@ Endereço: %4</translation>
<source>command-line options</source>
<translation>opções da linha de comandos</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Opções de Interface</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Definir linguagem, por exemplo "pt_PT" (por defeito: linguagem do sistema)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Iniciar minimizado</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Mostrar imagem ao iniciar (por defeito: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Escolha a pasta de dados ao iniciar (por defeito: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -860,10 +845,22 @@ Endereço: %4</translation>
<translation>Bitcoin Core</translation>
</message>
<message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation>Erro: Pasta de dados especificada como "%1, não pode ser criada.</translation>
+ </message>
+ <message>
<source>Error</source>
<translation>Erro</translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>%n GB de espaço livre disponível </numerusform><numerusform>%n GB de espaço livre disponível </numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(de %n GB necessários)</numerusform><numerusform>(de %n GB necessário)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -898,14 +895,6 @@ Endereço: %4</translation>
<translation>&amp;Principal</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Começar o Bitcoin automaticamente ao iniciar sessão no sistema.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Começar o Bitcoin ao iniciar o sistema</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Tamanho da cache da base de &amp;dados</translation>
</message>
@@ -918,10 +907,27 @@ Endereço: %4</translation>
<translation>Número de processos de &amp;verificação de scripts</translation>
</message>
<message>
+ <source>Accept connections from outside</source>
+ <translation>Aceitar conceções externas</translation>
+ </message>
+ <message>
+ <source>Allow incoming connections</source>
+ <translation>Permitir conexão</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation>Endereço IP do proxy (p.ex. IPv4: 127.0.0.1 / IPv6: ::1)</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>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 por hash de transação. Vários URLs são separados por barra vertical |.</translation>
+ </message>
+ <message>
+ <source>Third party transaction URLs</source>
+ <translation>URLs de transação de outrem</translation>
+ </message>
+ <message>
<source>Active command-line options that override above options:</source>
<translation>Opções de linha de comandos ativas que se sobrepõem ás opções anteriores:</translation>
</message>
@@ -938,6 +944,10 @@ Endereço: %4</translation>
<translation>&amp;Rede</translation>
</message>
<message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation>(0 = auto, &lt;0 = Deixar essa quantidade de núcleos livre)</translation>
+ </message>
+ <message>
<source>W&amp;allet</source>
<translation>C&amp;arteira</translation>
</message>
@@ -966,16 +976,24 @@ Endereço: %4</translation>
<translation>Mapear porta usando &amp;UPnP</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Conectar à rede da Bitcoin através dum proxy SOCLS5.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>&amp;Ligar através dum proxy SOCKS5 (proxy por defeito):</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>&amp;IP do proxy:</translation>
</message>
<message>
<source>&amp;Port:</source>
- <translation>&amp;Porta:</translation>
+ <translation>&amp;Porto:</translation>
</message>
<message>
<source>Port of the proxy (e.g. 9050)</source>
- <translation>Porta do proxy (p.ex. 9050)</translation>
+ <translation>Porto do proxy (p.ex. 9050)</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -990,26 +1008,18 @@ Endereço: %4</translation>
<translation>&amp;Minimizar para a bandeja de sistema e não para a barra de ferramentas</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 Quit in the menu.</source>
- <translation>Minimize ao invés de sair da aplicação quando a janela é fechada. Com esta opção selecionada, a aplicação apenas será encerrada só quando escolher Sair da aplicação no menu.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimizar ao fechar</translation>
</message>
<message>
<source>&amp;Display</source>
- <translation>Vis&amp;ualização</translation>
+ <translation>&amp;Visualização</translation>
</message>
<message>
<source>User Interface &amp;language:</source>
<translation>&amp;Linguagem da interface de utilizador:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>A linguagem da interface do utilizador pode ser definida aqui. Esta definição entrará em efeito após reiniciar o Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Unidade para mostrar quantias:</translation>
</message>
@@ -1046,10 +1056,6 @@ Endereço: %4</translation>
<translation>É necessário reiniciar o cliente para ativar as alterações.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>O cliente será desligado, deseja continuar?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Esta alteração requer um reinício do cliente.</translation>
</message>
@@ -1069,6 +1075,10 @@ Endereço: %4</translation>
<translation>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>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation>Modo-verificação:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation>Disponível:</translation>
</message>
@@ -1093,6 +1103,10 @@ Endereço: %4</translation>
<translation>O saldo minado ainda não amadureceu</translation>
</message>
<message>
+ <source>Balances</source>
+ <translation>Balanços</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation>Total:</translation>
</message>
@@ -1101,8 +1115,28 @@ Endereço: %4</translation>
<translation>O seu saldo total actual</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>fora de sincronia</translation>
+ <source>Your current balance in watch-only addresses</source>
+ <translation>O seu balanço atual em endereços de apenas observação</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation>Dispensável:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation>transações recentes</translation>
+ </message>
+ <message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation>Transações não confirmadas para endereços modo-verificação</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation>Saldo minado ainda não disponivél de endereços modo-verificação</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation>Saldo disponivél em enderços modo-verificação</translation>
</message>
</context>
<context>
@@ -1120,6 +1154,14 @@ Endereço: %4</translation>
<translation>Pedido de pagamento rejeitado</translation>
</message>
<message>
+ <source>Payment request network doesn't match client network.</source>
+ <translation>Rede de requisição de pagamento não corresponde com a rede do cliente.</translation>
+ </message>
+ <message>
+ <source>Payment request is not initialized.</source>
+ <translation>Requisição de pagamento não iniciou.</translation>
+ </message>
+ <message>
<source>Requested payment amount of %1 is too small (considered dust).</source>
<translation>Quantia solicitada para pagamento de %1 é muito pequena (considerada "pó").</translation>
</message>
@@ -1136,10 +1178,18 @@ Endereço: %4</translation>
<translation>O URL de pedido de pagamento é inválido: %1</translation>
</message>
<message>
+ <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation>URI não foi lido correctamente! 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>Controlo de pedidos de pagamento.</translation>
</message>
<message>
+ <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
+ <translation>O ficheiro de pedido de pagamento não pôde ser lido! Isto pode ter sido causado por um ficheiro de pedido de pagamento inválido.</translation>
+ </message>
+ <message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>Pedidos de pagamento não-verificados para scripts de pagamento personalizados não são suportados.</translation>
</message>
@@ -1148,10 +1198,22 @@ Endereço: %4</translation>
<translation>Reembolsar de %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>Pedido de pagamento %1 excede o tamanho (%2 bytes, permitido %3 bytes).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Pedido de pagamento proteção DdS</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Erro ao comunicar com %1: %2</translation>
</message>
<message>
+ <source>Payment request cannot be parsed!</source>
+ <translation>O pedido de pagamento não pode ser lido ou processado!</translation>
+ </message>
+ <message>
<source>Bad response from server %1</source>
<translation>Má resposta do servidor %1</translation>
</message>
@@ -1166,7 +1228,15 @@ Endereço: %4</translation>
</context>
<context>
<name>PeerTableModel</name>
- </context>
+ <message>
+ <source>User Agent</source>
+ <translation>Agente Usuário</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Tempo de Latência</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -1174,6 +1244,14 @@ Endereço: %4</translation>
<translation>Quantia</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation>Entre um endereço Bitcoin (ex. %1)</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation>%1 d</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation>%1 h</translation>
</message>
@@ -1182,10 +1260,22 @@ Endereço: %4</translation>
<translation>%1 m</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation>%1 s</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Nenhum</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation>N/D</translation>
</message>
- </context>
+ <message>
+ <source>%1 ms</source>
+ <translation>%1 ms</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1236,6 +1326,10 @@ Endereço: %4</translation>
<translation>Usando versão OpenSSL</translation>
</message>
<message>
+ <source>Using BerkeleyDB version</source>
+ <translation>Versão BerkeleyDB em uso</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Hora de inicialização</translation>
</message>
@@ -1260,6 +1354,74 @@ Endereço: %4</translation>
<translation>Número actual de blocos</translation>
</message>
<message>
+ <source>Received</source>
+ <translation>Recebido</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation>Enviado</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation>&amp;Conexção</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>Selecione uma conexação para ver informação em detalhe.</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <translation>Direcção</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation>Versão</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation>Agente Usuário</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Serviços</translation>
+ </message>
+ <message>
+ <source>Starting Height</source>
+ <translation>Iniciando Altura</translation>
+ </message>
+ <message>
+ <source>Sync Height</source>
+ <translation>Sincronização da Altura</translation>
+ </message>
+ <message>
+ <source>Ban Score</source>
+ <translation>Resultado da Suspensão</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation>Tempo de Conexção</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation>Ultimo Envio</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation>Ultimo Recebimento</translation>
+ </message>
+ <message>
+ <source>Bytes Sent</source>
+ <translation>Bytes Enviados</translation>
+ </message>
+ <message>
+ <source>Bytes Received</source>
+ <translation>Bytes Recebidos</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Tempo de Latência</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Data do último bloco</translation>
</message>
@@ -1300,18 +1462,10 @@ Endereço: %4</translation>
<translation>Ficheiro de registo de depuração</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Abrir o ficheiro de registo de depuração da pasta de dados actual. Isto pode demorar alguns segundos para ficheiros de registo maiores.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Limpar consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bem-vindo à consola RPC Bitcoin.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Use as setas para cima e para baixo para navegar no histórico e &lt;b&gt;Ctrl-L&lt;/b&gt; para limpar o ecrã.</translation>
</message>
@@ -1335,7 +1489,31 @@ Endereço: %4</translation>
<source>%1 GB</source>
<translation>%1 GB</translation>
</message>
- </context>
+ <message>
+ <source>via %1</source>
+ <translation>via %1</translation>
+ </message>
+ <message>
+ <source>never</source>
+ <translation>nunca</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <translation>Entrada</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <translation>Saída</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Desconhecido</translation>
+ </message>
+ <message>
+ <source>Fetching...</source>
+ <translation>Em busca...</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
@@ -1344,7 +1522,7 @@ Endereço: %4</translation>
</message>
<message>
<source>&amp;Label:</source>
- <translation>Rótu&amp;lo:</translation>
+ <translation>&amp;Rótulo:</translation>
</message>
<message>
<source>&amp;Message:</source>
@@ -1564,6 +1742,70 @@ Endereço: %4</translation>
<translation>Endereço de troco personalizado</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Custo da Transação:</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>Escolha...</translation>
+ </message>
+ <message>
+ <source>collapse fee-settings</source>
+ <translation>fechar definições-de custos</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>por kilobyte</translation>
+ </message>
+ <message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>Se a taxa fixa for 1000 satoshis e a transação for somente 250 bytes, pagará somente 250 satoshis "por kilobyte" em custos se trasacionar "pelo menos" 1000 satoshis. Transações superiores a um kilobyte são cobradas por kilobyte.</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>total minimo</translation>
+ </message>
+ <message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>Pode pagar somente a taxa minima desde que haja um volume de transações inferior ao espaço nos blocos. No entanto tenha em atenção que esta opção poderá acabar em uma transação nunca confirmada assim que os pedidos de transações excedam a capacidade de processamento da rede.</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(leia a dica)</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Recomendado:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>Uso:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(Taxa inteligente ainda não foi acionada. Normalmente demora alguns blocos...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Tempo de confirmação:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>normal</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>rapido</translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Enviar como uma transação a custo zero se possivél</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(confirmação poderá demorar mais)</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Enviar para múltiplos destinatários de uma vez</translation>
</message>
@@ -1576,8 +1818,12 @@ Endereço: %4</translation>
<translation>Limpar todos os campos do formulário.</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>Lixo:</translation>
+ </message>
+ <message>
<source>Clear &amp;All</source>
- <translation>&amp;Limpar Tudo</translation>
+ <translation>Limpar &amp;Tudo</translation>
</message>
<message>
<source>Balance:</source>
@@ -1589,7 +1835,7 @@ Endereço: %4</translation>
</message>
<message>
<source>S&amp;end</source>
- <translation>&amp;Enviar</translation>
+ <translation>E&amp;nviar</translation>
</message>
<message>
<source>Confirm send coins</source>
@@ -1636,10 +1882,6 @@ Endereço: %4</translation>
<translation>ou</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>O endereço de destino não é válido, por favor verifique.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>A quantia a pagar deverá ser maior que 0.</translation>
</message>
@@ -1652,10 +1894,6 @@ Endereço: %4</translation>
<translation>O total excede o seu saldo quando a taxa de transação de %1 for incluída.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Endereço duplicado encontrado, apenas poderá enviar uma vez para cada endereço por cada operação de envio.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Erro: A criação da transação falhou! </translation>
</message>
@@ -1664,6 +1902,10 @@ Endereço: %4</translation>
<translation>A transação foi rejeitada! Isto poderá acontecer se algumas das moedas na sua carteira já tiverem sido gastas, se por exemplo tiver usado uma cópia do ficheiro wallet.dat e as moedas tiverem sido gastas na cópia mas não tiverem sido marcadas como gastas aqui.</translation>
</message>
<message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Pagar somente a taxa minima de %1</translation>
+ </message>
+ <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Aviso: Endereço Bitcoin inválido</translation>
</message>
@@ -1676,6 +1918,10 @@ Endereço: %4</translation>
<translation>Aviso: Endereço de troco desconhecido</translation>
</message>
<message>
+ <source>Copy dust</source>
+ <translation>Copiar lixo</translation>
+ </message>
+ <message>
<source>Are you sure you want to send?</source>
<translation>Tem a certeza que deseja enviar?</translation>
</message>
@@ -1711,6 +1957,10 @@ Endereço: %4</translation>
<translation>Este é um pagamento normal.</translation>
</message>
<message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation>O endereço Bitcoin para enviar o pagamento</translation>
+ </message>
+ <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1731,10 +1981,6 @@ Endereço: %4</translation>
<translation>Mensagem:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Este é um pedido de pagamento verificado.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Introduza um rótulo para este endereço para o adicionar à sua lista de endereços usados</translation>
</message>
@@ -1743,12 +1989,8 @@ Endereço: %4</translation>
<translation>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>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Este é um pedido de pagamento não-verificado.</translation>
- </message>
- <message>
<source>Pay To:</source>
- <translation>Pagar A:</translation>
+ <translation>Pagar a:</translation>
</message>
<message>
<source>Memo:</source>
@@ -1774,11 +2016,11 @@ Endereço: %4</translation>
</message>
<message>
<source>&amp;Sign Message</source>
- <translation>A&amp;ssinar Mensagem</translation>
+ <translation>&amp;Assinar Mensagem</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>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>The Bitcoin address to sign the message with</source>
+ <translation>O endereço Bitcoin para designar a mensagem</translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -1829,8 +2071,8 @@ Endereço: %4</translation>
<translation>&amp;Verificar Mensagem</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Introduza o endereço de assinatura, mensagem (assegure-se que copia quebras de linha, espaços, tabulações, etc. exactamente) 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>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation>O endereço Bitcoin com que a mensagem foi designada</translation>
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
@@ -1974,6 +2216,10 @@ Endereço: %4</translation>
<translation>endereço próprio</translation>
</message>
<message>
+ <source>watch-only</source>
+ <translation>modo-verificação</translation>
+ </message>
+ <message>
<source>label</source>
<translation>rótulo</translation>
</message>
@@ -1994,6 +2240,14 @@ Endereço: %4</translation>
<translation>Débito</translation>
</message>
<message>
+ <source>Total debit</source>
+ <translation>Total a debitar</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation>Total a creditar</translation>
+ </message>
+ <message>
<source>Transaction fee</source>
<translation>Taxa de transação</translation>
</message>
@@ -2080,10 +2334,6 @@ Endereço: %4</translation>
<translation>Tipo</translation>
</message>
<message>
- <source>Address</source>
- <translation>Endereço</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Imaturo (%1 confirmações, estará disponível após %2)</translation>
</message>
@@ -2112,6 +2362,10 @@ Endereço: %4</translation>
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Rótulo</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Não confirmado:</translation>
</message>
@@ -2144,6 +2398,10 @@ Endereço: %4</translation>
<translation>Minadas</translation>
</message>
<message>
+ <source>watch-only</source>
+ <translation>modo-verificação</translation>
+ </message>
+ <message>
<source>(n/a)</source>
<translation>(n/d)</translation>
</message>
@@ -2160,8 +2418,8 @@ Endereço: %4</translation>
<translation>Tipo de transação.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Endereço de destino da transação.</translation>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation>Desde que um endereço de modo-verificação faça parte ou não desta transação</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2255,6 +2513,10 @@ Endereço: %4</translation>
<translation>Exportar Histórico de Transacções</translation>
</message>
<message>
+ <source>Watch-only</source>
+ <translation>Modo-verificação</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation>A Exportação Falhou</translation>
</message>
@@ -2309,7 +2571,11 @@ Endereço: %4</translation>
</context>
<context>
<name>UnitDisplayStatusBarControl</name>
- </context>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Unidade de valores recebidos. Clique para selecionar outra unidade.</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2394,49 +2660,34 @@ Endereço: %4</translation>
<translation>Aceitar ligações externas (padrão: 1 sem -proxy ou -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, deverá definir uma rpcpassword no ficheiro de configuração:
-%s
-É recomendado que use a seguinte palavra-passe aleatória:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(não é necessário lembrar esta palavra-passe)
-O nome de utilizador e palavra-passe NÃO PODEM ser iguais.
-Se o ficheiro não existir, crie-o com permissões de leitura apenas para o dono.
-Também é recomendado definir um alertnotify para que seja alertado sobre problemas;
-por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Associar a endereço específico e escutar sempre nele. Use a notação [anfitrião]:porta para IPv6</translation>
</message>
<message>
- <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
- <translation>Entre no modo de teste de regressão, que usa uma cadeia especial cujos blocos podem ser resolvidos instantaneamente.</translation>
+ <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
+ <translation>Apague todas as transações da carteira e somente restore aquelas que façam parte do blockchain através de re-scan ao reiniciar o programa</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Erro: A transação foi rejeitada! Isso poderá acontecer se algumas das moedas na sua carteira já tiverem sido gastas, se por exemplo tiver usado uma cópia do ficheiro wallet.dat e as moedas tiverem sido gastas na cópia mas não tiverem sido marcadas como gastas aqui.</translation>
+ <source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
+ <translation>Distribuido através da licença de software MIT, verifique o ficheiro anexado COPYING ou &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Erro: Esta transação requer uma taxa de transação mínima de %s devido á sua quantia, complexidade, ou uso de fundos recebidos recentemente!</translation>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>Entre no modo de teste de regressão, que usa uma cadeia especial cujos blocos podem ser resolvidos instantaneamente.</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Executar comando quando uma das transações na carteira mudar (no comando, %s é substituído pelo ID da Transação)</translation>
</message>
<message>
+ <source>In this mode -genproclimit controls how many blocks are generated immediately.</source>
+ <translation>O modo -genproclimit controla quantos blocos são generados imediatamente.</translation>
+ </message>
+ <message>
+ <source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
+ <translation>Defina o número de processos de verificação (%u até %d, 0 = automático, &lt;0 = ldisponibiliza esse número de núcleos livres, por defeito: %d)</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>Esta é uma versão de testes pré-lançamento - use à sua responsabilidade - não usar para minar ou aplicações comerciais</translation>
</message>
@@ -2465,6 +2716,14 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Atenção: wallet.dat corrompido, dados recuperados! wallet.dat original salvo como wallet.{timestamp}.bak em %s; se o seu saldo ou transações estiverem incorrectos deverá recuperar uma cópia de segurança.</translation>
</message>
<message>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>Ligações na lista branca conectam desde a seguinte netmask ou endereço IP. Posse ser especificado varias vezes.</translation>
+ </message>
+ <message>
+ <source>(default: 1)</source>
+ <translation>(padrão: 1)</translation>
+ </message>
+ <message>
<source>&lt;category&gt; can be:</source>
<translation>&lt;categoria&gt; pode ser:</translation>
</message>
@@ -2481,12 +2740,16 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Apenas ligar ao(s) nó(s) especificado(s)</translation>
</message>
<message>
+ <source>Connection options:</source>
+ <translation>Opcões de conexção:</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation>Cadeia de blocos corrompida detectada</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Descobrir endereço IP próprio (padrão: 1 ao escutar sem -externalip)</translation>
+ <source>Debugging/Testing options:</source>
+ <translation>Depuração/Opções teste:</translation>
</message>
<message>
<source>Do not load the wallet and disable wallet RPC calls</source>
@@ -2513,12 +2776,12 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Erro ao abrir a base de dados de blocos</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>Erro: Pouco espaço em disco!</translation>
+ <source>Error: A fatal internal error occured, see debug.log for details</source>
+ <translation>Erro: Um erro fatal interno ocorreu, verificar debug.log para mais informação</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Erro: Carteira bloqueada, incapaz de criar transação! </translation>
+ <source>Error: Disk space is low!</source>
+ <translation>Erro: Pouco espaço em disco!</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
@@ -2529,6 +2792,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Se uma &lt;categoria&gt; não é fornecida, imprimir toda a informação de depuração.</translation>
</message>
<message>
+ <source>Importing...</source>
+ <translation>A importar...</translation>
+ </message>
+ <message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
<translation>Bloco génese incorreto ou nenhum bloco génese encontrado. Pasta de dados errada para a rede?</translation>
</message>
@@ -2541,8 +2808,8 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Os descritores de ficheiros disponíveis são insuficientes.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Reconstruir a cadeia de blocos a partir dos ficheiros blk000??.dat atuais</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Somente conectar aos nodes na rede &lt;net&gt; (ipv4, ipv6 ou onion)</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -2561,6 +2828,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Isto têm como fim a realização de testes de regressão para pools e desenvolvimento de aplicações.</translation>
</message>
<message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Use UPnP para mapear a porto de escuta (default: %u)</translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>A verificar blocos...</translation>
</message>
@@ -2585,6 +2856,18 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Importar blocos de um ficheiro blk000??.dat externo</translation>
</message>
<message>
+ <source>Allow JSON-RPC connections from specified source. Valid for &lt;ip&gt; are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
+ <translation>Permitir conexções JSON-RPC de fontes especificas. Valido para &lt;ip&gt; um unico IP (ex. 1.2.3.4), uma rede/netmask (ex. 1.2.3.4/255.255.255.0) ou uma rede/CIDR (ex. 1.2.3.4/24). Esta opção pode ser especificada varias vezes</translation>
+ </message>
+ <message>
+ <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source>
+ <translation>Um erro ocorreu durante a definição do endereço RPC %s porto %u para escutar: %s</translation>
+ </message>
+ <message>
+ <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source>
+ <translation>Vincualar o endereço dado e listar as ligações conectadas ao mesmo na lista branca. Use a notação [anfitrião]:porta para IPv6</translation>
+ </message>
+ <message>
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
<translation>Impossível trancar a pasta de dados %s. Provavelmente o Bitcoin Core já está a ser executado.</translation>
</message>
@@ -2597,6 +2880,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Definir tamanho máximo de transações com alta-prioridade/baixa-taxa em bytes (por defeito: %d)</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Escolha a pasta de dados ao iniciar (por defeito: 0)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Informação</translation>
</message>
@@ -2613,6 +2900,18 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Enviar informação de rastreio/depuração para a consola e não para o ficheiro debug.log</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Configurar certificados SSL root para pedido de pagamento (default: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Definir linguagem, por exemplo "pt_PT" (por defeito: linguagem do sistema)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Mostrar imagem ao iniciar (por defeito: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Encolher ficheiro debug.log ao iniciar o cliente (por defeito: 1 sem -debug definido)</translation>
</message>
@@ -2621,6 +2920,10 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Falhou assinatura da transação</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Iniciar minimizado</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Quantia da transação é muito baixa</translation>
</message>
@@ -2645,10 +2948,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Aviso</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Atenção: Esta versão está obsoleta, é necessário actualizar!</translation>
- </message>
- <message>
<source>Zapping all transactions from wallet...</source>
<translation>A limpar todas as transações da carteira...</translation>
</message>
@@ -2717,10 +3016,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Quantia inválida para -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Quantia inválida</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fundos insuficientes</translation>
</message>
@@ -2753,10 +3048,6 @@ por exemplo: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com</tran
<translation>Carregamento completo</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Para usar a opção %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Erro</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ro_RO.ts b/src/qt/locale/bitcoin_ro_RO.ts
index 81342c5dbc..11a29e86c9 100644
--- a/src/qt/locale/bitcoin_ro_RO.ts
+++ b/src/qt/locale/bitcoin_ro_RO.ts
@@ -1,9 +1,9 @@
-<TS language="ro_RO" version="2.0">
+<TS language="ro_RO" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dublu-click pentru a edita adresa sau eticheta</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Click-dreapta pentru a edita adresa sau eticheta</translation>
</message>
<message>
<source>Create a new address</source>
@@ -19,11 +19,11 @@
</message>
<message>
<source>&amp;Copy</source>
- <translation>&amp;Copiere</translation>
+ <translation>&amp;Copiază</translation>
</message>
<message>
<source>C&amp;lose</source>
- <translation>&amp;Inchidere</translation>
+ <translation>Închide</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -31,11 +31,11 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation>Sterge adresele curent selectate din lista</translation>
+ <translation>Şterge adresele curent selectate din listă</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation>Exporta datele din tab-ul curent într-un fișier</translation>
+ <translation>Exportă datele din tab-ul curent într-un fişier</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -43,35 +43,35 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation>Ște&amp;rge</translation>
+ <translation>Şterge</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation>Alegeti adresa unde vreti sa trimiteti monezile</translation>
+ <translation>Alegeţi adresa unde vreţi să trimiteţi monezile</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation>Alegeti adresa unde vreti sa primiti monezile</translation>
+ <translation>Alegeţi adresa unde vreţi să primiţi monezile</translation>
</message>
<message>
<source>C&amp;hoose</source>
- <translation>&amp;Alege</translation>
+ <translation>&amp;Alegeţi</translation>
</message>
<message>
<source>Sending addresses</source>
- <translation>Adresa Destinatarului</translation>
+ <translation>Adresa destinatarului</translation>
</message>
<message>
<source>Receiving addresses</source>
- <translation>Adresa pe care primiti</translation>
+ <translation>Adresa de primire</translation>
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation>Acestea sunt adresele dumneavoastra Bitcoin care pot fi folosite la trimiterea platilor. Verificati totdeauna cantitatea si adresa de primire inainte de a trimite monezi.</translation>
+ <translation>Acestea sînt adresele dumneavoastră Bitcoin pentru efectuarea plăţilor. Verificaţi întotdeauna cantitatea şi adresa de primire înainte de a trimite monezi.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. It is recommended to use a new receiving address for each transaction.</source>
- <translation>Acestea sunt adresele dumneavoastra Bitcoin folosite pentru a primi plati. Este recomandat sa folositi cate o adresa noua de primire pentru fiecare tranzactie in parte.</translation>
+ <translation>Acestea sînt adresele dumneavoastră Bitcoin folosite pentru a primi plati. Este recomandat să folosiţi o adresă nouă de primire pentru fiecare tranzacţie în parte.</translation>
</message>
<message>
<source>Copy &amp;Label</source>
@@ -79,21 +79,25 @@
</message>
<message>
<source>&amp;Edit</source>
- <translation>&amp;Editează</translation>
+ <translation>&amp;Editare</translation>
</message>
<message>
<source>Export Address List</source>
- <translation>Exportati Agenda</translation>
+ <translation>Exportă listă de adrese</translation>
</message>
<message>
<source>Comma separated file (*.csv)</source>
- <translation>Valori separate prin virgulă (*.csv)</translation>
+ <translation>Fişier text cu valori separate prin virgulă (*.csv)</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation>Exportare esuata</translation>
+ <translation>Export nereuşit</translation>
</message>
- </context>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <translation>A apărut o eroare la salvarea listei de adrese la %1. Vă rugăm să încercaţi din nou.</translation>
+ </message>
+</context>
<context>
<name>AddressTableModel</name>
<message>
@@ -117,7 +121,7 @@
</message>
<message>
<source>Enter passphrase</source>
- <translation>Introdu fraza de acces</translation>
+ <translation>Introduceţi fraza de acces</translation>
</message>
<message>
<source>New passphrase</source>
@@ -125,71 +129,75 @@
</message>
<message>
<source>Repeat new passphrase</source>
- <translation>Repetă noua frază de acces</translation>
+ <translation>Repetaţi noua frază de acces</translation>
</message>
<message>
<source>Encrypt wallet</source>
- <translation>Criptează portofelul</translation>
+ <translation>Criptare portofel</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation>Această acțiune necesită fraza ta de acces pentru deblocarea portofelului.</translation>
+ <translation>Această acţiune necesită fraza dvs. de acces pentru deblocarea portofelului.</translation>
</message>
<message>
<source>Unlock wallet</source>
- <translation>Deblochează portofelul</translation>
+ <translation>Deblocare portofel</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to decrypt the wallet.</source>
- <translation>Această acțiune necesită fraza ta de acces pentru decriptarea portofelului.</translation>
+ <translation>Această acţiune necesită fraza dvs. de acces pentru decriptarea portofelului.</translation>
</message>
<message>
<source>Decrypt wallet</source>
- <translation>Decriptează portofelul.</translation>
+ <translation>Decriptare portofel</translation>
</message>
<message>
<source>Change passphrase</source>
- <translation>Schimbă fraza de acces</translation>
- </message>
- <message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Introdu vechea și noua parolă pentru portofel.</translation>
+ <translation>Schimbare frază de acces</translation>
</message>
<message>
<source>Confirm wallet encryption</source>
- <translation>Confirmă criptarea portofelului</translation>
+ <translation>Confirmaţi criptarea portofelului</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>Atenție: Dacă pierdeţi parola portofelului electronic dupa criptare, &lt;b&gt;VEŢI PIERDE ÎNTREAGA SUMĂ DE BITCOIN ACUMULATĂ&lt;/b&gt;!</translation>
+ <translation>Atenţie: Dacă pierdeţi parola portofelului electronic după criptare, &lt;b&gt;VEŢI PIERDE ÎNTREAGA SUMĂ DE BITCOIN ACUMULATĂ&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
- <translation>Sunteţi sigur că doriţi să criptaţi portofelul electronic?</translation>
+ <translation>Sigur doriţi să criptaţi portofelul dvs.?</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Bitcoin se va închide acum pentru a termina procesul de criptare. Ţineţi minte că criptarea portofelului nu vă poate proteja în totalitate de furtul monedelor de către programe dăunătoare care vă infectează calculatorul.</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>IMPORTANT: Orice copie de siguranta facuta in prealabil portofelului dumneavoastra ar trebui inlocuita cu cea generata cel mai recent fisier criptat al portofelului. Pentru siguranta, copiile de siguranta vechi ale portofelului ne-criptat vor deveni inutile de indata ce veti incepe folosirea noului fisier criptat al portofelului.</translation>
+ <translation>IMPORTANT: Orice copie de siguranţă făcută anterior portofelului dumneavoastră ar trebui înlocuită cu cea generată cel mai recent, fişier criptat al portofelului. Pentru siguranţă, copiile de siguranţă vechi ale portofelului ne-criptat vor deveni inutile imediat ce veţi începe folosirea noului fişier criptat al portofelului.</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
- <translation>Atentie! Caps Lock este pornit</translation>
+ <translation>Atenţie! Caps Lock este pornit!</translation>
</message>
<message>
<source>Wallet encrypted</source>
<translation>Portofel criptat</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin se va închide acum pentru a termina procesul de criptare. Ține minte că criptarea portofelului nu te poate proteja în totalitate de furtul monedelor de către programe dăunătoare care îți infectează calculatorul.</translation>
+ <source>Enter the new passphrase to 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>Introduceţi noua parolă a portofelului electronic.&lt;br/&gt;Vă rugăm să folosiţi o parolă de&lt;b&gt;minimum 10 caractere aleatoare&lt;/b&gt;, sau &lt;b&gt;minimum 8 cuvinte&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Introduceţi vechea şi noua parolă pentru portofel.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
- <translation>Criptarea portofelului a eșuat</translation>
+ <translation>Criptarea portofelului nu a reuşit</translation>
</message>
<message>
<source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation>Criptarea portofelului a eșuat din cauza unei erori interne. Portofelul tău nu a fost criptat.</translation>
+ <translation>Criptarea portofelului nu a reuşit din cauza unei erori interne. Portofelul dvs. nu a fost criptat.</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
@@ -197,7 +205,7 @@
</message>
<message>
<source>Wallet unlock failed</source>
- <translation>Deblocarea portofelului a eșuat</translation>
+ <translation>Deblocarea portofelului nu a reuşit</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
@@ -205,7 +213,7 @@
</message>
<message>
<source>Wallet decryption failed</source>
- <translation>Decriptarea portofelului a eșuat</translation>
+ <translation>Decriptarea portofelului nu a reuşit</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
@@ -220,7 +228,7 @@
</message>
<message>
<source>Synchronizing with network...</source>
- <translation>Se sincronizează cu rețeaua...</translation>
+ <translation>Se sincronizează cu reţeaua...</translation>
</message>
<message>
<source>&amp;Overview</source>
@@ -236,19 +244,19 @@
</message>
<message>
<source>&amp;Transactions</source>
- <translation>&amp;Tranzacții</translation>
+ <translation>&amp;Tranzacţii</translation>
</message>
<message>
<source>Browse transaction history</source>
- <translation>Răsfoiește istoricul tranzacțiilor</translation>
+ <translation>Răsfoire istoric tranzacţii</translation>
</message>
<message>
<source>E&amp;xit</source>
- <translation>&amp;Ieșire</translation>
+ <translation>Ieşire</translation>
</message>
<message>
<source>Quit application</source>
- <translation>Închide aplicația</translation>
+ <translation>Închide aplicaţia</translation>
</message>
<message>
<source>About &amp;Qt</source>
@@ -256,19 +264,19 @@
</message>
<message>
<source>Show information about Qt</source>
- <translation>Arată informații despre Qt</translation>
+ <translation>Arată informaţii despre Qt</translation>
</message>
<message>
<source>&amp;Options...</source>
- <translation>&amp;Setări...</translation>
+ <translation>&amp;Opţiuni...</translation>
</message>
<message>
<source>&amp;Encrypt Wallet...</source>
- <translation>Criptează portofelul electronic...</translation>
+ <translation>Cript&amp;ează portofelul...</translation>
</message>
<message>
<source>&amp;Backup Wallet...</source>
- <translation>&amp;Fă o copie de siguranță a portofelului...</translation>
+ <translation>Face o copie de siguranţă a portofelului...</translation>
</message>
<message>
<source>&amp;Change Passphrase...</source>
@@ -276,19 +284,23 @@
</message>
<message>
<source>&amp;Sending addresses...</source>
- <translation>&amp;Trimitere adrese...</translation>
+ <translation>Adrese de trimitere...</translation>
</message>
<message>
<source>&amp;Receiving addresses...</source>
- <translation>&amp;Primire adrese...</translation>
+ <translation>Adrese de p&amp;rimire...</translation>
</message>
<message>
<source>Open &amp;URI...</source>
- <translation>Vizitaţi &amp;URI...</translation>
+ <translation>Deschide &amp;URI...</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core client</source>
+ <translation>Clientul Bitcoin Core</translation>
</message>
<message>
<source>Importing blocks from disk...</source>
- <translation>Importare blocks de pe disk...</translation>
+ <translation>Import blocuri de pe disk...</translation>
</message>
<message>
<source>Reindexing blocks on disk...</source>
@@ -299,12 +311,8 @@
<translation>Trimite monede către o adresă Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Modifică opțiunile de configurare pentru Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
- <translation>Creează o copie de rezervă a portofelului într-o locație diferită</translation>
+ <translation>Creează o copie de rezervă a portofelului într-o locaţie diferită</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
@@ -312,15 +320,15 @@
</message>
<message>
<source>&amp;Debug window</source>
- <translation>Fereastră &amp;debug</translation>
+ <translation>Fereastra de &amp;depanare</translation>
</message>
<message>
<source>Open debugging and diagnostic console</source>
- <translation>Deschide consola de debug și diagnosticare</translation>
+ <translation>Deschide consola de depanare şi diagnosticare</translation>
</message>
<message>
<source>&amp;Verify message...</source>
- <translation>&amp;Verifică mesajul...</translation>
+ <translation>&amp;Verifică mesaj...</translation>
</message>
<message>
<source>Bitcoin</source>
@@ -328,19 +336,23 @@
</message>
<message>
<source>Wallet</source>
- <translation>Portofelul</translation>
+ <translation>Portofel</translation>
</message>
<message>
<source>&amp;Send</source>
- <translation>&amp;Trimite</translation>
+ <translation>Trimite</translation>
</message>
<message>
<source>&amp;Receive</source>
- <translation>&amp;Primește</translation>
+ <translation>P&amp;rimeşte</translation>
+ </message>
+ <message>
+ <source>Show information about Bitcoin Core</source>
+ <translation>Arată informaţii despre Bitcoin Core</translation>
</message>
<message>
<source>&amp;Show / Hide</source>
- <translation>Arata/Ascunde</translation>
+ <translation>Arată/Ascunde</translation>
</message>
<message>
<source>Show or hide the main Window</source>
@@ -348,19 +360,19 @@
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation>Criptează cheile private ale portofelului tău</translation>
+ <translation>Criptează cheile private ale portofelului dvs.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation>Semnează mesaje cu adresa ta Bitcoin pentru a dovedi că îți aparțin</translation>
+ <translation>Semnaţi mesaje cu adresa dvs. Bitcoin pentru a dovedi că vă aparţin</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation>Verifică mesaje pentru a te asigura că au fost semnate cu adresa Bitcoin specificată</translation>
+ <translation>Verificaţi mesaje pentru a vă asigura că au fost semnate cu adresa Bitcoin specificată</translation>
</message>
<message>
<source>&amp;File</source>
- <translation>&amp;Fișier</translation>
+ <translation>&amp;Fişier</translation>
</message>
<message>
<source>&amp;Settings</source>
@@ -372,47 +384,55 @@
</message>
<message>
<source>Tabs toolbar</source>
- <translation>Bara de file</translation>
+ <translation>Bara de unelte</translation>
</message>
<message>
<source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
+ <translation>Nucleul Bitcoin</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation>Cereti plati (genereaza coduri QR si bitcoin-uri: URls)</translation>
+ <translation>Cereţi plăţi (generează coduri QR şi bitcoin-uri: URls)</translation>
</message>
<message>
<source>&amp;About Bitcoin Core</source>
<translation>&amp;Despre Nucleul Bitcoin</translation>
</message>
<message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Modifică opţiunile de configurare pentru Bitcoin</translation>
+ </message>
+ <message>
<source>Show the list of used sending addresses and labels</source>
- <translation>Aratati lista de adrese trimise si etichete folosite.</translation>
+ <translation>Arată lista de adrese trimise şi etichetele folosite.</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation>Aratati lista de adrese pentru primire si etichete </translation>
+ <translation>Arată lista de adrese pentru primire şi etichetele</translation>
</message>
<message>
<source>Open a bitcoin: URI or payment request</source>
- <translation>Deschideti un bitcoin: o adresa URI sau o cerere de plata</translation>
+ <translation>Deschidere bitcoin: o adresa URI sau o cerere de plată</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation>Command-line setări</translation>
+ <translation>Opţiuni linie de &amp;comandă</translation>
</message>
<message>
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
- <translation>Arată mesajul de ajutor Bitcoin Core pentru a obține o listă cu opțiunile posibile de linii de comandă Bitcoin</translation>
+ <translation>Arată mesajul de ajutor Bitcoin Core pentru a obţine o listă cu opţiunile posibile de linii de comandă Bitcoin</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n conexiune activă către rețeaua Bitcoin</numerusform><numerusform>%n conexiuni active către rețeaua Bitcoin</numerusform><numerusform>%n de conexiuni active către rețeaua Bitcoin</numerusform></translation>
+ <translation><numerusform>%n conexiune activă către reţeaua Bitcoin</numerusform><numerusform>%n conexiuni active către reţeaua Bitcoin</numerusform><numerusform>%n de conexiuni active către reţeaua Bitcoin</numerusform></translation>
</message>
<message>
<source>No block source available...</source>
- <translation>Nici o sursă de bloc disponibil ...</translation>
+ <translation>Nici o sursă de bloc disponibilă...</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>S-a procesat %n bloc din istoricul tranzacţiilor.</numerusform><numerusform>S-au procesat %n blocuri din istoricul tranzacţiilor.</numerusform><numerusform>S-au procesat %n de blocuri din istoricul tranzacţiilor.</numerusform></translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
@@ -420,7 +440,7 @@
</message>
<message numerus="yes">
<source>%n day(s)</source>
- <translation><numerusform>%n zi</numerusform><numerusform>%n zile</numerusform><numerusform>%n zile</numerusform></translation>
+ <translation><numerusform>%n zi</numerusform><numerusform>%n zile</numerusform><numerusform>%n de zile</numerusform></translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
@@ -428,7 +448,11 @@
</message>
<message>
<source>%1 and %2</source>
- <translation>%1 si %2</translation>
+ <translation>%1 şi %2</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation><numerusform>%n an</numerusform><numerusform>%n ani</numerusform><numerusform>%n de ani</numerusform></translation>
</message>
<message>
<source>%1 behind</source>
@@ -436,11 +460,11 @@
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation>Ultimul bloc recepționat a fost generat acum %1.</translation>
+ <translation>Ultimul bloc recepţionat a fost generat acum %1.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation>Tranzacții după aceasta nu va fi încă disponibile.</translation>
+ <translation>Tranzacţiile după aceasta nu vor fi vizibile încă.</translation>
</message>
<message>
<source>Error</source>
@@ -448,11 +472,11 @@
</message>
<message>
<source>Warning</source>
- <translation>Avertizare</translation>
+ <translation>Avertisment</translation>
</message>
<message>
<source>Information</source>
- <translation>Informație</translation>
+ <translation>Informaţie</translation>
</message>
<message>
<source>Up to date</source>
@@ -463,44 +487,66 @@
<translation>Se actualizează...</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>Tranzacție expediată</translation>
+ <source>Date: %1
+</source>
+ <translation>Data: %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>Tranzacție recepționată</translation>
+ <source>Amount: %1
+</source>
+ <translation>Sumă: %1
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Type: %1
</source>
- <translation>Data: %1
-Suma: %2
-Tipul: %3
-Adresa: %4
+ <translation>Tip: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>Etichetă: %1
</translation>
</message>
<message>
+ <source>Address: %1
+</source>
+ <translation>Adresă: %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation>Tranzacţie expediată</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Tranzacţie recepţionată</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation>Portofelul este &lt;b&gt;criptat&lt;/b&gt; iar în momentul de față este &lt;b&gt;deblocat&lt;/b&gt;</translation>
+ <translation>Portofelul este &lt;b&gt;criptat&lt;/b&gt; iar în momentul de faţă este &lt;b&gt;deblocat&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>Portofelul este &lt;b&gt;criptat&lt;/b&gt; iar în momentul de față este &lt;b&gt;blocat&lt;/b&gt;</translation>
+ <translation>Portofelul este &lt;b&gt;criptat&lt;/b&gt; iar în momentul de faţă este &lt;b&gt;blocat&lt;/b&gt;</translation>
</message>
</context>
<context>
<name>ClientModel</name>
<message>
<source>Network Alert</source>
- <translation>Alertă rețea</translation>
+ <translation>Alertă reţea</translation>
</message>
</context>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Selectarea monezii</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Cantitate:</translation>
</message>
@@ -518,11 +564,15 @@ Adresa: %4
</message>
<message>
<source>Fee:</source>
- <translation>Taxa:</translation>
+ <translation>Taxă:</translation>
+ </message>
+ <message>
+ <source>Dust:</source>
+ <translation>Praf:</translation>
</message>
<message>
<source>After Fee:</source>
- <translation>După taxe:</translation>
+ <translation>După taxă:</translation>
</message>
<message>
<source>Change:</source>
@@ -530,21 +580,29 @@ Adresa: %4
</message>
<message>
<source>(un)select all</source>
- <translation>(de)selectaţi tot</translation>
+ <translation>(de)selectare tot</translation>
</message>
<message>
<source>Tree mode</source>
- <translation>Modul arborescent</translation>
+ <translation>Mod arbore</translation>
</message>
<message>
<source>List mode</source>
- <translation>Modul lista</translation>
+ <translation>Mod listă</translation>
</message>
<message>
<source>Amount</source>
<translation>Sumă</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>Primite cu eticheta</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Primite cu adresa</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>Data</translation>
</message>
@@ -574,43 +632,47 @@ Adresa: %4
</message>
<message>
<source>Copy transaction ID</source>
- <translation>Copiază ID tranzacție</translation>
+ <translation>Copiază ID tranzacţie</translation>
</message>
<message>
<source>Lock unspent</source>
- <translation>Blocaţi necheltuite</translation>
+ <translation>Blocare necheltuiţi</translation>
</message>
<message>
<source>Unlock unspent</source>
- <translation>Deblocaţi necheltuite</translation>
+ <translation>Deblocare necheltuiţi</translation>
</message>
<message>
<source>Copy quantity</source>
- <translation>Copiaţi quantitea</translation>
+ <translation>Copiază cantitea</translation>
</message>
<message>
<source>Copy fee</source>
- <translation>Copiaţi taxele</translation>
+ <translation>Copiază taxa</translation>
</message>
<message>
<source>Copy after fee</source>
- <translation>Copiaţi după taxe</translation>
+ <translation>Copiază după taxă</translation>
</message>
<message>
<source>Copy bytes</source>
- <translation>Copiaţi octeţi</translation>
+ <translation>Copiază octeţi</translation>
</message>
<message>
<source>Copy priority</source>
- <translation>Copiaţi prioritatea</translation>
+ <translation>Copiază prioritatea</translation>
+ </message>
+ <message>
+ <source>Copy dust</source>
+ <translation>Copiază praf</translation>
</message>
<message>
<source>Copy change</source>
- <translation>Copiaţi schimb</translation>
+ <translation>Copiază rest</translation>
</message>
<message>
<source>highest</source>
- <translation>cel mai mare</translation>
+ <translation>cea mai mare</translation>
</message>
<message>
<source>higher</source>
@@ -622,33 +684,49 @@ Adresa: %4
</message>
<message>
<source>medium-high</source>
- <translation>marime medie</translation>
+ <translation>medie-mare</translation>
</message>
<message>
<source>medium</source>
- <translation>mediu</translation>
+ <translation>medie</translation>
</message>
<message>
<source>low-medium</source>
- <translation>mediu-scazut</translation>
+ <translation>medie-scăzută</translation>
</message>
<message>
<source>low</source>
- <translation>scazut</translation>
+ <translation>scazută</translation>
</message>
<message>
<source>lower</source>
- <translation>mai scazut</translation>
+ <translation>mai scăzută</translation>
</message>
<message>
<source>lowest</source>
- <translation>cel mai scazut</translation>
+ <translation>cea mai scăzută</translation>
</message>
<message>
<source>none</source>
<translation>nimic</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Această etichetă devine roşie în cazul în care dimensiunea tranzacţiei este mai mare de 1000 de octeţi.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Această etichetă devine roşie dacă prioritatea e mai mică decît "medie".</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>Această etichetă devine roşie, dacă orice beneficiar primeşte o sumă mai mică decât %1.</translation>
+ </message>
+ <message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation>Poate varia +/- %1 satoshi pentru fiecare intrare.</translation>
+ </message>
+ <message>
<source>yes</source>
<translation>da</translation>
</message>
@@ -657,20 +735,12 @@ Adresa: %4
<translation>nu</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Această etichetă devine roşie, în cazul în care dimensiunea tranzacţiei este mai mare de 1000 de octeţi. </translation>
- </message>
- <message>
<source>Can vary +/- 1 byte per input.</source>
- <translation>Poate varia +/- 1 octet pentru fiecare intrare. </translation>
+ <translation>Poate varia +/- 1 octet pentru fiecare intrare.</translation>
</message>
<message>
<source>Transactions with higher priority are more likely to get included into a block.</source>
- <translation>Tranzacţiile cu prioritate mai mare sunt mai susceptibile de fi incluse într-un bloc. </translation>
- </message>
- <message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Aceasta eticheta se face rosie daca prioritatea e mai mica decat media</translation>
+ <translation>Tranzacţiile cu prioritate mai mare sînt mai susceptibile de fi incluse într-un bloc.</translation>
</message>
<message>
<source>(no label)</source>
@@ -682,7 +752,7 @@ Adresa: %4
</message>
<message>
<source>(change)</source>
- <translation>(schimb)</translation>
+ <translation>(rest)</translation>
</message>
</context>
<context>
@@ -697,11 +767,11 @@ Adresa: %4
</message>
<message>
<source>The label associated with this address list entry</source>
- <translation>Etichetele asociate cu aceasta intrare din lista.</translation>
+ <translation>Eticheta asociată cu această intrare din listă.</translation>
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation>Adresa asociata cu aceasta adresa din lista. Aceasta poate fi modificata doar pentru Destinatari.</translation>
+ <translation>Adresa asociată cu această adresă din listă. Aceasta poate fi modificată doar pentru adresele de trimitere.</translation>
</message>
<message>
<source>&amp;Address</source>
@@ -737,7 +807,7 @@ Adresa: %4
</message>
<message>
<source>New key generation failed.</source>
- <translation>Generarea noii chei a eșuat.</translation>
+ <translation>Generarea noii chei nu a reuşit.</translation>
</message>
</context>
<context>
@@ -752,11 +822,11 @@ Adresa: %4
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <translation>Dosarul deja există. Adaugă %1 dacă intenționezi să creezi un nou dosar aici.</translation>
+ <translation>Dosarul deja există. Adaugă %1 dacă intenţionaţi să creaţi un nou dosar aici.</translation>
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation>Calea deja există și nu este un dosar.</translation>
+ <translation>Calea deja există şi nu este un dosar.</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
@@ -767,7 +837,7 @@ Adresa: %4
<name>HelpMessageDialog</name>
<message>
<source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
+ <translation>Nucleul Bitcoin</translation>
</message>
<message>
<source>version</source>
@@ -783,7 +853,7 @@ Adresa: %4
</message>
<message>
<source>Command-line options</source>
- <translation>Command-line setări</translation>
+ <translation>Opţiuni linie de comandă</translation>
</message>
<message>
<source>Usage:</source>
@@ -791,27 +861,7 @@ Adresa: %4
</message>
<message>
<source>command-line options</source>
- <translation>command-line setări</translation>
- </message>
- <message>
- <source>UI options</source>
- <translation>UI setări</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Seteaza limba, de exemplu: "de_DE" (initialt: system locale)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Incepe miniaturizare</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Afișează pe ecran splash la pornire (implicit: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Alege dosarul de date la pornire (implicit: 0)</translation>
+ <translation>Opţiuni linie de comandă</translation>
</message>
</context>
<context>
@@ -822,34 +872,46 @@ Adresa: %4
</message>
<message>
<source>Welcome to Bitcoin Core.</source>
- <translation>Bine Aţi Venit la Nucleul Bitcoin.</translation>
+ <translation>Bine aţi venit la Nucleul Bitcoin.</translation>
</message>
<message>
<source>As this is the first time the program is launched, you can choose where Bitcoin Core will store its data.</source>
- <translation>Dacă aceasta este prima dată când programul este lansat, puteţi alege unde Nucleul Bitcoin va stoca datele. </translation>
+ <translation>Dacă aceasta este prima dată cînd programul este lansat, puteţi alege unde Nucleul Bitcoin va stoca datele.</translation>
</message>
<message>
<source>Use the default data directory</source>
- <translation>Folosește dosarul de date implicit</translation>
+ <translation>Foloseşte dosarul de date implicit</translation>
</message>
<message>
<source>Use a custom data directory:</source>
- <translation>Folosește un dosar de date personalizat:</translation>
+ <translation>Foloseşte un dosar de date personalizat:</translation>
</message>
<message>
<source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
+ <translation>Nucleul Bitcoin</translation>
+ </message>
+ <message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation>Eroare: Directorul datelor specificate "%1" nu poate fi creat.</translation>
</message>
<message>
<source>Error</source>
<translation>Eroare</translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>%n GB de spaţiu liber disponibil</numerusform><numerusform>%n GB de spaţiu liber disponibil</numerusform><numerusform>%n GB de spaţiu liber disponibil</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(din %n GB necesar)</numerusform><numerusform>(din %n GB necesari)</numerusform><numerusform>(din %n GB necesari)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
<source>Open URI</source>
- <translation>Deschideti adresa URI</translation>
+ <translation>Deschide URI</translation>
</message>
<message>
<source>Open payment request from URI or file</source>
@@ -857,62 +919,126 @@ Adresa: %4
</message>
<message>
<source>URI:</source>
- <translation>adresa URI:</translation>
+ <translation>URI:</translation>
</message>
<message>
<source>Select payment request file</source>
- <translation>Selectaţi fişierul de cerere de plată</translation>
+ <translation>Selectaţi fişierul cerere de plată</translation>
</message>
<message>
<source>Select payment request file to open</source>
- <translation>Selectaţi fişierul de cerere de plată de deschis</translation>
+ <translation>Selectaţi fişierul cerere de plată pentru deschidere</translation>
</message>
</context>
<context>
<name>OptionsDialog</name>
<message>
<source>Options</source>
- <translation>Setări</translation>
+ <translation>Opţiuni</translation>
</message>
<message>
<source>&amp;Main</source>
- <translation>&amp;Principal</translation>
+ <translation>Principal</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Porneşte automat programul Bitcoin la pornirea computerului.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;S Porneşte Bitcoin la pornirea sistemului</translation>
+ <source>Size of &amp;database cache</source>
+ <translation>Mărimea bazei de &amp;date cache</translation>
</message>
<message>
<source>MB</source>
<translation>MB</translation>
</message>
<message>
+ <source>Number of script &amp;verification threads</source>
+ <translation>Numărul de thread-uri de &amp;verificare</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside</source>
+ <translation>Acceptă conexiuni din exterior</translation>
+ </message>
+ <message>
+ <source>Allow incoming connections</source>
+ <translation>Permite conexiuni de intrare</translation>
+ </message>
+ <message>
+ <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
+ <translation>Adresa IP a serverului proxy (de exemplu: IPv4: 127.0.0.1 / IPv6: ::1)</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>Minimizează fereastra în locul părăsirii programului în momentul închiderii ferestrei. Cînd acestă opţiune e activă, aplicaţia se va opri doar în momentul selectării comenzii 'Închide aplicaţia' din menu.</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>Limba interfeţei utilizatorului poate fi setată aici. Această setare va avea efect după repornirea Nucleului Bitcoin.</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>URL-uri terţe părţi (de exemplu, un explorator de bloc), care apar în tab-ul tranzacţiilor ca elemente de meniu contextual. %s în URL este înlocuit cu hash de tranzacţie. URL-urile multiple sînt separate prin bară verticală |.</translation>
+ </message>
+ <message>
+ <source>Third party transaction URLs</source>
+ <translation>URL-uri tranzacţii terţe părţi</translation>
+ </message>
+ <message>
+ <source>Active command-line options that override above options:</source>
+ <translation>Opţiuni linie de comandă active care oprimă opţiunile de mai sus:</translation>
+ </message>
+ <message>
<source>Reset all client options to default.</source>
<translation>Resetează toate setările clientului la valorile implicite.</translation>
</message>
<message>
<source>&amp;Reset Options</source>
- <translation>&amp;Resetează opțiunile</translation>
+ <translation>&amp;Resetează opţiunile</translation>
</message>
<message>
<source>&amp;Network</source>
- <translation>&amp;Retea</translation>
+ <translation>Reţea</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>Porneşte Nucleul Bitcoin la pornirea sistemului</translation>
+ </message>
+ <message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation>(0 = automat, &lt;0 = lasă atîtea nuclee libere)</translation>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation>Portofel</translation>
</message>
<message>
<source>Expert</source>
- <translation>expert</translation>
+ <translation>Expert</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation>Activare caracteristici de control ale monedei</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>Dacă dezactivaţi cheltuirea restului neconfirmat, restul dintr-o tranzacţie nu poate fi folosit pînă cînd tranzacţia are cel puţin o confirmare. Aceasta afectează de asemenea calcularea soldului.</translation>
+ </message>
+ <message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation>Cheltuire rest neconfirmat</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>Deschide automat în router portul aferent clientului Bitcoin. Funcţionează doar în cazul în care routerul e compatibil UPnP şi opţiunea e activată.</translation>
+ <translation>Deschide automat în router portul aferent clientului Bitcoin. Funcţionează doar dacă routerul duportă UPnP şi e activat.</translation>
</message>
<message>
<source>Map port using &amp;UPnP</source>
- <translation>Mapeaza portul folosind &amp;UPnP</translation>
+ <translation>Mapare port folosind &amp;UPnP</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Conectare la reţeaua Bitcoin printr-un proxy SOCKS.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>&amp;Conectare printr-un proxy SOCKS (implicit proxy):</translation>
</message>
<message>
<source>Proxy &amp;IP:</source>
@@ -924,27 +1050,23 @@ Adresa: %4
</message>
<message>
<source>Port of the proxy (e.g. 9050)</source>
- <translation>Portul pe care se concetează proxy serverul (de exemplu: 9050)</translation>
+ <translation>Portul proxy (de exemplu: 9050)</translation>
</message>
<message>
<source>&amp;Window</source>
- <translation>&amp;Fereastra</translation>
+ <translation>&amp;Fereastră</translation>
</message>
<message>
<source>Show only a tray icon after minimizing the window.</source>
- <translation>Afişează doar un icon in tray la ascunderea ferestrei</translation>
+ <translation>Arată doar un icon în tray la ascunderea ferestrei</translation>
</message>
<message>
<source>&amp;Minimize to the tray instead of the taskbar</source>
- <translation>&amp;M Ascunde în tray în loc de taskbar</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 Quit in the menu.</source>
- <translation>Ascunde fereastra în locul părăsirii programului în momentul închiderii ferestrei. Când acestă opţiune e activă, aplicaţia se va opri doar în momentul selectării comenzii Quit din menu.</translation>
+ <translation>&amp;Minimizare în tray în loc de taskbar</translation>
</message>
<message>
<source>M&amp;inimize on close</source>
- <translation>&amp;i Ascunde fereastra în locul închiderii programului</translation>
+ <translation>M&amp;inimizare fereastră în locul închiderii programului</translation>
</message>
<message>
<source>&amp;Display</source>
@@ -952,11 +1074,7 @@ Adresa: %4
</message>
<message>
<source>User Interface &amp;language:</source>
- <translation>Interfata &amp; limba userului</translation>
- </message>
- <message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Limba interfeței utilizatorului poate fi setat aici. Această setare va avea efect după repornirea Bitcoin.</translation>
+ <translation>&amp;Limbă interfaţă utilizator</translation>
</message>
<message>
<source>&amp;Unit to show amounts in:</source>
@@ -964,23 +1082,23 @@ Adresa: %4
</message>
<message>
<source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
- <translation>Alege subdiviziunea folosită la afişarea interfeţei şi la trimiterea de bitcoin.</translation>
+ <translation>Alegeţi subdiviziunea folosită la afişarea interfeţei şi la trimiterea de bitcoin.</translation>
</message>
<message>
<source>Whether to show coin control features or not.</source>
- <translation>Dacă să se afişeze controlul caracteristicilor monedei sau nu.</translation>
+ <translation>Arată controlul caracteristicilor monedei sau nu.</translation>
</message>
<message>
<source>&amp;OK</source>
- <translation>&amp; OK</translation>
+ <translation>&amp;OK</translation>
</message>
<message>
<source>&amp;Cancel</source>
- <translation>&amp; Renunta</translation>
+ <translation>Renunţă</translation>
</message>
<message>
<source>default</source>
- <translation>Initial</translation>
+ <translation>iniţial</translation>
</message>
<message>
<source>none</source>
@@ -988,23 +1106,23 @@ Adresa: %4
</message>
<message>
<source>Confirm options reset</source>
- <translation>Confirmă resetarea opțiunilor</translation>
+ <translation>Confirmă resetarea opţiunilor</translation>
</message>
<message>
<source>Client restart required to activate changes.</source>
- <translation>Este necesar un restart al clientului pentru a activa schimbările.</translation>
+ <translation>Este necesară repornirea clientului pentru a activa schimbările.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Clientul va fi închis, doriţi să continuaţi?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>Clientul va fi închis. Doriţi să continuaţi?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
- <translation>Această schimbare va necesita un restart al clientului.</translation>
+ <translation>Această schimbare necesită o repornire a clientului.</translation>
</message>
<message>
<source>The supplied proxy address is invalid.</source>
- <translation>Adresa bitcoin pe care a-ti specificat-o este invalida</translation>
+ <translation>Adresa bitcoin pe care aţi specificat-o nu este validă.</translation>
</message>
</context>
<context>
@@ -1015,7 +1133,11 @@ Adresa: %4
</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>Informațiile afișate pot neactualizate. Portofelul tău se sincronizează automat cu rețeaua Bitcoin după ce o conexiune este stabilită, dar acest proces nu a fost finalizat încă.</translation>
+ <translation>Informaţiile afişate pot fi neactualizate. Portofelul dvs. se sincronizează automat cu reţeaua Bitcoin după ce o conexiune este stabilită, dar acest proces nu a fost finalizat încă.</translation>
+ </message>
+ <message>
+ <source>Watch-only:</source>
+ <translation>Doar-supraveghere:</translation>
</message>
<message>
<source>Available:</source>
@@ -1023,7 +1145,7 @@ Adresa: %4
</message>
<message>
<source>Your current spendable balance</source>
- <translation>Balanța ta curentă de cheltuieli</translation>
+ <translation>Balanţa dvs. curentă de cheltuieli</translation>
</message>
<message>
<source>Pending:</source>
@@ -1031,7 +1153,7 @@ Adresa: %4
</message>
<message>
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
- <translation>Totalul tranzacțiilor care nu sunt confirmate încă și care nu sunt încă adunate la balanța de cheltuieli</translation>
+ <translation>Totalul tranzacţiilor care nu sunt confirmate încă şi care nu sunt încă adunate la balanţa de cheltuieli</translation>
</message>
<message>
<source>Immature:</source>
@@ -1039,7 +1161,11 @@ Adresa: %4
</message>
<message>
<source>Mined balance that has not yet matured</source>
- <translation>Balanta minata care nu s-a maturizat inca</translation>
+ <translation>Balanţa minertită care nu s-a maturizat încă</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation>Balanţă</translation>
</message>
<message>
<source>Total:</source>
@@ -1047,11 +1173,31 @@ Adresa: %4
</message>
<message>
<source>Your current total balance</source>
- <translation>Balanța totală curentă</translation>
+ <translation>Balanţa totală curentă</translation>
+ </message>
+ <message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation>Soldul dvs. curent în adresele doar-supraveghere</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation>Cheltuibil:</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>Nu este sincronizat</translation>
+ <source>Recent transactions</source>
+ <translation>Tranzacţii recente</translation>
+ </message>
+ <message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation>Tranzacţii neconfirmate la adresele doar-supraveghere</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation>Balanţă minată în adresele doar-supraveghere care nu s-a maturizat încă</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation>Soldul dvs. total în adresele doar-supraveghere</translation>
</message>
</context>
<context>
@@ -1065,8 +1211,20 @@ Adresa: %4
<translation>Adresă pentru plată nevalidă %1</translation>
</message>
<message>
+ <source>Payment request rejected</source>
+ <translation>Cerere de plată refuzată</translation>
+ </message>
+ <message>
+ <source>Payment request network doesn't match client network.</source>
+ <translation>Cererea de plată din reţea nu se potriveşte cu clientul din reţea</translation>
+ </message>
+ <message>
+ <source>Payment request is not initialized.</source>
+ <translation>Cererea de plată nu este iniţializată.</translation>
+ </message>
+ <message>
<source>Requested payment amount of %1 is too small (considered dust).</source>
- <translation>Cereti plata cu suma de %1 este prea mica (considerata praf)</translation>
+ <translation>Suma cerută de plată de %1 este prea mică (considerată praf).</translation>
</message>
<message>
<source>Payment request error</source>
@@ -1074,23 +1232,59 @@ Adresa: %4
</message>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
- <translation>Nu poate porni bitcoin: regula clic-pentru-plata</translation>
+ <translation>Nu poate porni bitcoin: manipulator clic-pentru-plată</translation>
+ </message>
+ <message>
+ <source>Payment request fetch URL is invalid: %1</source>
+ <translation>URL-ul cererii de plată preluat nu este valid: %1</translation>
+ </message>
+ <message>
+ <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation>URI nu poate fi analizat! Acest lucru poate fi cauzat de o adresă Bitcoin nevalidă sau parametri URI deformaţi.</translation>
+ </message>
+ <message>
+ <source>Payment request file handling</source>
+ <translation>Manipulare fişier cerere de plată</translation>
+ </message>
+ <message>
+ <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
+ <translation>Fişierul cerere de plată nu poate fi citit! Cauza poate fi un fişier cerere de plată nevalid.</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>Cererea de plată a expirat.</translation>
</message>
<message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
- <translation>Cereri de plată neverificate prin script-uri personalizate de plată nu sunt suportate.</translation>
+ <translation>Cererile de plată neverificate prin script-uri personalizate de plată nu sînt suportate.</translation>
+ </message>
+ <message>
+ <source>Invalid payment request.</source>
+ <translation>Cerere de plată nevalidă.</translation>
</message>
<message>
<source>Refund from %1</source>
- <translation>rambursare de la %1</translation>
+ <translation>Rambursare de la %1</translation>
+ </message>
+ <message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>Cererea de plată %1 este prea mare (%2 octeţi, permis %3 octeţi).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Protecţie DoS cerere de plată</translation>
</message>
<message>
<source>Error communicating with %1: %2</source>
<translation>Eroare la comunicarea cu %1: %2</translation>
</message>
<message>
+ <source>Payment request cannot be parsed!</source>
+ <translation>Cererea de plată nu poate fi analizată!</translation>
+ </message>
+ <message>
<source>Bad response from server %1</source>
- <translation>Răspuns greșit de la server %1</translation>
+ <translation>Răspuns greşit de la server %1</translation>
</message>
<message>
<source>Payment acknowledged</source>
@@ -1098,17 +1292,33 @@ Adresa: %4
</message>
<message>
<source>Network request error</source>
- <translation>Eroare în cererea de rețea</translation>
+ <translation>Eroare în cererea de reţea</translation>
</message>
</context>
<context>
<name>PeerTableModel</name>
- </context>
+ <message>
+ <source>User Agent</source>
+ <translation>Agent utilizator</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Timp ping</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
<source>Amount</source>
- <translation>Sumă</translation>
+ <translation>Cantitate</translation>
+ </message>
+ <message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation>Introduceţi o adresă Bitcoin (de exemplu %1)</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation>%1 z</translation>
</message>
<message>
<source>%1 h</source>
@@ -1119,19 +1329,31 @@ Adresa: %4
<translation>%1 m</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation>%1 s</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation>Niciuna</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation>N/A</translation>
</message>
- </context>
+ <message>
+ <source>%1 ms</source>
+ <translation>%1 ms</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
<source>&amp;Save Image...</source>
- <translation>Salvarea imaginii ...</translation>
+ <translation>&amp;Salvează imagine...</translation>
</message>
<message>
<source>&amp;Copy Image</source>
- <translation>Copierea imaginii</translation>
+ <translation>&amp;Copiază imaginea</translation>
</message>
<message>
<source>Save QR Code</source>
@@ -1150,7 +1372,7 @@ Adresa: %4
</message>
<message>
<source>N/A</source>
- <translation>N/A</translation>
+ <translation>indisponibil</translation>
</message>
<message>
<source>Client version</source>
@@ -1158,7 +1380,7 @@ Adresa: %4
</message>
<message>
<source>&amp;Information</source>
- <translation>&amp;Informație</translation>
+ <translation>&amp;Informaţii</translation>
</message>
<message>
<source>Debug window</source>
@@ -1170,7 +1392,11 @@ Adresa: %4
</message>
<message>
<source>Using OpenSSL version</source>
- <translation>Foloseste versiunea OpenSSL</translation>
+ <translation>Foloseşte OpenSSL versiunea</translation>
+ </message>
+ <message>
+ <source>Using BerkeleyDB version</source>
+ <translation>Foloseşte BerkeleyDB versiunea</translation>
</message>
<message>
<source>Startup time</source>
@@ -1178,11 +1404,11 @@ Adresa: %4
</message>
<message>
<source>Network</source>
- <translation>Rețea</translation>
+ <translation>Reţea</translation>
</message>
<message>
<source>Name</source>
- <translation>Numele</translation>
+ <translation>Nume</translation>
</message>
<message>
<source>Number of connections</source>
@@ -1190,13 +1416,69 @@ Adresa: %4
</message>
<message>
<source>Block chain</source>
- <translation>Lanț de blocuri</translation>
+ <translation>Lanţ de blocuri</translation>
</message>
<message>
<source>Current number of blocks</source>
<translation>Numărul curent de blocuri</translation>
</message>
<message>
+ <source>Received</source>
+ <translation>Recepţionat</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation>Trimis</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation>&amp;Parteneri</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>Selectaţi un partener pentru a vedea informaţiile detaliate.</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <translation>Direcţie</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation>Versiune</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation>Agent utilizator</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Servicii</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation>Timp conexiune</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation>Ultima trimitere</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation>Ultima primire</translation>
+ </message>
+ <message>
+ <source>Bytes Sent</source>
+ <translation>Octeţi trimişi</translation>
+ </message>
+ <message>
+ <source>Bytes Received</source>
+ <translation>Octeţi primiţi</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Timp ping</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Data ultimului bloc</translation>
</message>
@@ -1210,11 +1492,11 @@ Adresa: %4
</message>
<message>
<source>&amp;Network Traffic</source>
- <translation>Traficul in rețea</translation>
+ <translation>Trafic reţea</translation>
</message>
<message>
<source>&amp;Clear</source>
- <translation>&amp;Ştergeţi</translation>
+ <translation>&amp;Curăţă</translation>
</message>
<message>
<source>Totals</source>
@@ -1222,11 +1504,11 @@ Adresa: %4
</message>
<message>
<source>In:</source>
- <translation>în:</translation>
+ <translation>Intrare:</translation>
</message>
<message>
<source>Out:</source>
- <translation>Ieșire.</translation>
+ <translation>Ieşire:</translation>
</message>
<message>
<source>Build date</source>
@@ -1234,27 +1516,23 @@ Adresa: %4
</message>
<message>
<source>Debug log file</source>
- <translation>Loguri debug</translation>
- </message>
- <message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Deschide logurile debug din directorul curent. Aceasta poate dura cateva secunde pentru fisierele mai mari</translation>
+ <translation>Fişier jurnal depanare</translation>
</message>
<message>
<source>Clear console</source>
- <translation>Curăță consola</translation>
+ <translation>Curăţă consola</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bun venit la consola bitcoin RPC</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Bun venit la consola Nucleului Bitcoin RPC.</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
- <translation>Foloseste sagetile sus si jos pentru a naviga in istoric si &lt;b&gt;Ctrl-L&lt;/b&gt; pentru a curata.</translation>
+ <translation>Folosiţi săgetile sus şi jos pentru a naviga în istoric şi &lt;b&gt;Ctrl-L&lt;/b&gt; pentru a curăţa.</translation>
</message>
<message>
<source>Type &lt;b&gt;help&lt;/b&gt; for an overview of available commands.</source>
- <translation>Scrie &lt;b&gt;help&lt;/b&gt; pentru a vedea comenzile disponibile</translation>
+ <translation>Scrieţi &lt;b&gt;help&lt;/b&gt; pentru a vedea comenzile disponibile.</translation>
</message>
<message>
<source>%1 B</source>
@@ -1272,12 +1550,36 @@ Adresa: %4
<source>%1 GB</source>
<translation>%1 GB</translation>
</message>
- </context>
+ <message>
+ <source>via %1</source>
+ <translation>via %1</translation>
+ </message>
+ <message>
+ <source>never</source>
+ <translation>niciodată</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <translation>Intrare</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <translation>Ieşire</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>Necunoscut</translation>
+ </message>
+ <message>
+ <source>Fetching...</source>
+ <translation>Preluare...</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
<source>&amp;Amount:</source>
- <translation>&amp; suma:</translation>
+ <translation>Sum&amp;a:</translation>
</message>
<message>
<source>&amp;Label:</source>
@@ -1285,47 +1587,63 @@ Adresa: %4
</message>
<message>
<source>&amp;Message:</source>
- <translation>&amp; mesaj:</translation>
+ <translation>&amp;Mesaj:</translation>
</message>
<message>
<source>Reuse one of the previously used receiving addresses. Reusing addresses has security and privacy issues. Do not use this unless re-generating a payment request made before.</source>
- <translation>Refolositi una din adresele de primire folosite in prealabil. Refolosirea adreselor poate crea probleme de securitate si confidentialitate. Nu folositi aceasta optiune decat daca o cerere de regenerare a platii a fost facuta in prealabil.</translation>
+ <translation>Refoloseşte una din adresele de primire folosite anterior. Refolosirea adreselor poate crea probleme de securitate şi confidenţialitate. Nu folosiţi această opţiune decît dacă o cerere de regenerare a plăţii a fost făcută anterior.</translation>
</message>
<message>
<source>R&amp;euse an existing receiving address (not recommended)</source>
- <translation>&amp;Refolosirea unei adrese de primire (nu este recomandat)</translation>
+ <translation>R&amp;efoloseşte o adresă de primire (nu este recomandat)</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>Un mesaj opţional de ataşat la cererea de plată, care va fi afişat cînd cererea este deschisă. Notă: Acest mesaj nu va fi trimis cu plata către reţeaua Bitcoin.</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation>O etichetă opţională de asociat cu adresa de primire.</translation>
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation>Folosește acest formular pentru a solicita plăți. Toate câmpurile sunt &lt;b&gt;opționale&lt;/b&gt;.</translation>
+ <translation>Foloseşte acest formular pentru a solicita plăţi. Toate cîmpurile sînt &lt;b&gt;opţionale&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>O sumă opţională de cerut. Lăsaţi gol sau zero pentru a nu cere o sumă anume.</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation>Stergeti toate campurile formularului</translation>
+ <translation>Curăţă toate cîmpurile formularului.</translation>
</message>
<message>
<source>Clear</source>
- <translation>Stergeti</translation>
+ <translation>Curăţă</translation>
</message>
<message>
<source>Requested payments history</source>
- <translation>Istoricul platilor a fost cerut</translation>
+ <translation>Istoricul plăţilor cerute</translation>
</message>
<message>
<source>&amp;Request payment</source>
- <translation>&amp;Cereti plata</translation>
+ <translation>&amp;Cerere plată</translation>
</message>
<message>
<source>Show the selected request (does the same as double clicking an entry)</source>
- <translation>Arata cererea selectata (acelas lucru ca si dublu-click pe o inregistrare)</translation>
+ <translation>Arată cererea selectată (acelaşi lucru ca şi dublu-clic pe o înregistrare)</translation>
</message>
<message>
<source>Show</source>
<translation>Arată</translation>
</message>
<message>
+ <source>Remove the selected entries from the list</source>
+ <translation>Înlătură intrările selectate din listă</translation>
+ </message>
+ <message>
<source>Remove</source>
- <translation>Elimină</translation>
+ <translation>Înlătură</translation>
</message>
<message>
<source>Copy label</source>
@@ -1333,7 +1651,7 @@ Adresa: %4
</message>
<message>
<source>Copy message</source>
- <translation>Copiaţi mesajul</translation>
+ <translation>Copiază mesajul</translation>
</message>
<message>
<source>Copy amount</source>
@@ -1348,27 +1666,27 @@ Adresa: %4
</message>
<message>
<source>Copy &amp;URI</source>
- <translation>Copiati &amp;URl</translation>
+ <translation>Copiază &amp;URl</translation>
</message>
<message>
<source>Copy &amp;Address</source>
- <translation>Copiati &amp;Adresa</translation>
+ <translation>Copiază &amp;adresa</translation>
</message>
<message>
<source>&amp;Save Image...</source>
- <translation>Salvarea imaginii ...</translation>
+ <translation>&amp;Salvează imaginea...</translation>
</message>
<message>
<source>Request payment to %1</source>
- <translation>Cereti plata pentru %1</translation>
+ <translation>Cere plata pentru %1</translation>
</message>
<message>
<source>Payment information</source>
- <translation>Informatiile platii</translation>
+ <translation>Informaţiile plăţii</translation>
</message>
<message>
<source>URI</source>
- <translation>Identificator uniform de resurse</translation>
+ <translation>URI</translation>
</message>
<message>
<source>Address</source>
@@ -1388,7 +1706,7 @@ Adresa: %4
</message>
<message>
<source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation>URI rezultat este prea lung, încearcă să reduci textul pentru etichetă / mesaj.</translation>
+ <translation>URI rezultat este prea lung, încearcaţi să reduceţi textul pentru etichetă / mesaj.</translation>
</message>
<message>
<source>Error encoding URI into QR Code.</source>
@@ -1423,7 +1741,7 @@ Adresa: %4
</message>
<message>
<source>(no amount)</source>
- <translation>(suma nulă)</translation>
+ <translation>(sumă nulă)</translation>
</message>
</context>
<context>
@@ -1433,12 +1751,16 @@ Adresa: %4
<translation>Trimite monede</translation>
</message>
<message>
+ <source>Coin Control Features</source>
+ <translation>Caracteristici de control ale monedei</translation>
+ </message>
+ <message>
<source>Inputs...</source>
- <translation>Intrări</translation>
+ <translation>Intrări...</translation>
</message>
<message>
<source>automatically selected</source>
- <translation>Selectie automatică</translation>
+ <translation>selecţie automată</translation>
</message>
<message>
<source>Insufficient funds!</source>
@@ -1462,43 +1784,103 @@ Adresa: %4
</message>
<message>
<source>Fee:</source>
- <translation>Taxa:</translation>
+ <translation>Taxă:</translation>
</message>
<message>
<source>After Fee:</source>
- <translation>După taxe:</translation>
+ <translation>După taxă:</translation>
</message>
<message>
<source>Change:</source>
- <translation>Schimbaţi:</translation>
+ <translation>Rest:</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>Dacă este activat, dar adresa de rest este goală sau nevalidă, restul va fi trimis la o adresă nou generată.</translation>
+ </message>
+ <message>
+ <source>Custom change address</source>
+ <translation>Adresă personalizată de rest</translation>
+ </message>
+ <message>
+ <source>Transaction Fee:</source>
+ <translation>Taxă tranzacţie:</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>Alegeţi...</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>per kilooctet</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation>Ascunde</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>total cel puţin</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Recomandat:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>Personalizat:</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Timp confirmare:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>normal</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>rapid</translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Trimite ca taxă zero dacă este posibil</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(confirmarea poate dura mai mult)</translation>
</message>
<message>
<source>Send to multiple recipients at once</source>
- <translation>Trimite simultan către mai mulți destinatari</translation>
+ <translation>Trimite simultan către mai mulţi destinatari</translation>
</message>
<message>
<source>Add &amp;Recipient</source>
- <translation>&amp;Adaugă destinatar</translation>
+ <translation>Adaugă destinata&amp;r</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation>Stergeti toate campurile formularului</translation>
+ <translation>Şterge toate cîmpurile formularului.</translation>
+ </message>
+ <message>
+ <source>Dust:</source>
+ <translation>Praf:</translation>
</message>
<message>
<source>Clear &amp;All</source>
- <translation>Șterge &amp;tot</translation>
+ <translation>Curăţă to&amp;ate</translation>
</message>
<message>
<source>Balance:</source>
- <translation>Balanță:</translation>
+ <translation>Balanţă:</translation>
</message>
<message>
<source>Confirm the send action</source>
- <translation>Confirmă operațiunea de trimitere</translation>
+ <translation>Confirmă operaţiunea de trimitere</translation>
</message>
<message>
<source>S&amp;end</source>
- <translation>&amp;S Trimite</translation>
+ <translation>Trimit&amp;e</translation>
</message>
<message>
<source>Confirm send coins</source>
@@ -1510,7 +1892,7 @@ Adresa: %4
</message>
<message>
<source>Copy quantity</source>
- <translation>Copiaţi quantitea</translation>
+ <translation>Copiază cantitea</translation>
</message>
<message>
<source>Copy amount</source>
@@ -1518,23 +1900,23 @@ Adresa: %4
</message>
<message>
<source>Copy fee</source>
- <translation>Copiaţi taxele</translation>
+ <translation>Copiază taxa</translation>
</message>
<message>
<source>Copy after fee</source>
- <translation>Copiaţi după taxe</translation>
+ <translation>Copiază după taxă</translation>
</message>
<message>
<source>Copy bytes</source>
- <translation>Copiaţi octeţi</translation>
+ <translation>Copiază octeţi</translation>
</message>
<message>
<source>Copy priority</source>
- <translation>Copiaţi prioritatea</translation>
+ <translation>Copiază prioritatea</translation>
</message>
<message>
<source>Copy change</source>
- <translation>Copiaţi schimb</translation>
+ <translation>Copiază rest</translation>
</message>
<message>
<source>Total Amount %1 (= %2)</source>
@@ -1545,36 +1927,40 @@ Adresa: %4
<translation>sau</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Adresa destinatarului nu este validă, vă rugăm să o verificaţi.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
- <translation>Suma de plată trebuie să fie mai mare decât 0.</translation>
+ <translation>Suma de plată trebuie să fie mai mare decît 0.</translation>
</message>
<message>
<source>The amount exceeds your balance.</source>
- <translation>Suma depășește soldul contului.</translation>
+ <translation>Suma depăşeşte soldul contului.</translation>
</message>
<message>
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation>Totalul depășește soldul contului dacă se include și plata comisionului de %1.</translation>
- </message>
- <message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>S-a descoperit o adresă care figurează de două ori. Expedierea se poate realiza către fiecare adresă doar o singură dată pe operațiune.</translation>
+ <translation>Totalul depăşeşte soldul contului dacă se include şi plata taxei de %1.</translation>
</message>
<message>
<source>Transaction creation failed!</source>
- <translation>Creare de tranzactie nereusita!</translation>
+ <translation>Creare tranzacţie nereuşită!</translation>
</message>
<message>
<source>The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Tranzactia a fost respinsa! Acest lucru se poate intampla daca o parte din monedele tale din portofel au fost deja cheltuite, la fel ca si cum ai fi folosit o copie a wallet.dat si monedele au fost cheltuite in copie, dar nu au fost marcate si si cheltuite si aici.</translation>
+ <translation>Tranzacţia a fost respinsă! Acest lucru se poate întîmpla dacă o parte din monedele tale din portofel au fost deja cheltuite, la fel ca şi cum aţi fi folosit o copie a wallet.dat şi monedele au fost cheltuite în copie, dar nu au fost marcate ca şi cheltuite şi aici.</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>Cererea de plată a expirat.</translation>
+ </message>
+ <message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Plăteşte doar taxa minimă de %1</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>Adresa destinatarului nu este validă, vă rugăm să o verificaţi.</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
- <translation>Atentie: Adresa Bitcoin invalida!</translation>
+ <translation>Atenţie: Adresa bitcoin nevalidă!</translation>
</message>
<message>
<source>(no label)</source>
@@ -1582,15 +1968,19 @@ Adresa: %4
</message>
<message>
<source>Warning: Unknown change address</source>
- <translation>Atentie: Schimbare de adresa necunoscuta</translation>
+ <translation>Atenţie: Adresă de rest necunoscută</translation>
+ </message>
+ <message>
+ <source>Copy dust</source>
+ <translation>Copiază praf</translation>
</message>
<message>
<source>Are you sure you want to send?</source>
- <translation>Ești sigur că vrei să trimiți?</translation>
+ <translation>Sigur doriţi să trimiteţi?</translation>
</message>
<message>
<source>added as transaction fee</source>
- <translation>adăugat ca taxă de tranzacție</translation>
+ <translation>adăugat ca taxă de tranzacţie</translation>
</message>
</context>
<context>
@@ -1601,11 +1991,11 @@ Adresa: %4
</message>
<message>
<source>Pay &amp;To:</source>
- <translation>Plătește că&amp;tre:</translation>
+ <translation>Plăteşte că&amp;tre:</translation>
</message>
<message>
<source>Enter a label for this address to add it to your address book</source>
- <translation>Introdu o etichetă pentru această adresă pentru a fi adăugată în lista ta de adrese</translation>
+ <translation>Introduceţi o etichetă pentru această adresă pentru a fi adăugată în lista dvs. de adrese</translation>
</message>
<message>
<source>&amp;Label:</source>
@@ -1613,19 +2003,23 @@ Adresa: %4
</message>
<message>
<source>Choose previously used address</source>
- <translation>Alegeti adrese folosite in prealabil.</translation>
+ <translation>Alegeţi adrese folosite anterior</translation>
</message>
<message>
<source>This is a normal payment.</source>
<translation>Aceasta este o tranzacţie normală.</translation>
</message>
<message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation>Adresa bitcoin către care se face plata</translation>
+ </message>
+ <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
<message>
<source>Paste address from clipboard</source>
- <translation>Lipește adresa din clipboard</translation>
+ <translation>Lipeşte adresa din clipboard</translation>
</message>
<message>
<source>Alt+P</source>
@@ -1633,27 +2027,23 @@ Adresa: %4
</message>
<message>
<source>Remove this entry</source>
- <translation>Scoate aceasta introducere</translation>
+ <translation>Înlătură această intrare</translation>
</message>
<message>
<source>Message:</source>
<translation>Mesaj:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Aceasta este o cerere de plata verificata</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
- <translation>Introduceti eticheta pentru ca aceasta adresa sa fie introdusa in lista de adrese folosite</translation>
+ <translation>Introduceţi eticheta pentru ca această adresa să fie introdusă în lista de adrese folosite</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Aceasta este o cerere de plata neverificata</translation>
+ <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>un mesaj a fost ataşat la bitcoin: URI care va fi stocat cu tranzacţia pentru referinţa dvs. Notă: Acest mesaj nu va fi trimis către reţeaua bitcoin.</translation>
</message>
<message>
<source>Pay To:</source>
- <translation>Plateste catre:</translation>
+ <translation>Plăteşte către:</translation>
</message>
<message>
<source>Memo:</source>
@@ -1664,30 +2054,30 @@ Adresa: %4
<name>ShutdownWindow</name>
<message>
<source>Bitcoin Core is shutting down...</source>
- <translation>Bitcoin Core se închide...</translation>
+ <translation>Nucleul Bitcoin se închide...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation>Nu închide calculatorul până ce această fereastră nu dispare.</translation>
+ <translation>Nu închide calculatorul pînă ce această fereastră nu dispare.</translation>
</message>
</context>
<context>
<name>SignVerifyMessageDialog</name>
<message>
<source>Signatures - Sign / Verify a Message</source>
- <translation>Semnatura- Semneaza/verifica un mesaj</translation>
+ <translation>Semnaturi - Semnează/verifică un mesaj</translation>
</message>
<message>
<source>&amp;Sign Message</source>
- <translation>Semneaza Mesajul</translation>
+ <translation>&amp;Semnează mesaj</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Puteti semna mesaje cu adresa dumneavoastra pentru a demostra ca sunteti proprietarul lor. Aveti grija sa nu semnati nimic vag, deoarece atacurile de tip phishing va pot pacali sa le transferati identitatea. Semnati numai declaratiile detaliate cu care sunteti deacord.</translation>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation>Adresa cu care semnaţi mesajul</translation>
</message>
<message>
<source>Choose previously used address</source>
- <translation>Alegeti adrese folosite in prealabil</translation>
+ <translation>Alegeţi adrese folosite anterior</translation>
</message>
<message>
<source>Alt+A</source>
@@ -1695,7 +2085,7 @@ Adresa: %4
</message>
<message>
<source>Paste address from clipboard</source>
- <translation>Lipiţi adresa copiată in clipboard.</translation>
+ <translation>Lipeşte adresa copiată din clipboard</translation>
</message>
<message>
<source>Alt+P</source>
@@ -1703,7 +2093,7 @@ Adresa: %4
</message>
<message>
<source>Enter the message you want to sign here</source>
- <translation>Introduce mesajul pe care vrei sa il semnezi, aici.</translation>
+ <translation>Introduceţi mesajul pe care vreţi să-l semnaţi, aici</translation>
</message>
<message>
<source>Signature</source>
@@ -1711,106 +2101,106 @@ Adresa: %4
</message>
<message>
<source>Copy the current signature to the system clipboard</source>
- <translation>Copiaza semnatura curenta in clipboard-ul sistemului</translation>
+ <translation>Copiază semnatura curentă în clipboard-ul sistemului</translation>
</message>
<message>
<source>Sign the message to prove you own this Bitcoin address</source>
- <translation>Semneaza mesajul pentru a dovedi ca detii acesta adresa Bitcoin</translation>
+ <translation>Semnează mesajul pentru a dovedi ca deţineţi acestă adresă Bitcoin</translation>
</message>
<message>
<source>Sign &amp;Message</source>
- <translation>Semnează &amp;Message</translation>
+ <translation>Semnează &amp;mesaj</translation>
</message>
<message>
<source>Reset all sign message fields</source>
- <translation>Reseteaza toate spatiile mesajelor semnate.</translation>
+ <translation>Resetează toate cîmpurile mesajelor semnate</translation>
</message>
<message>
<source>Clear &amp;All</source>
- <translation>Şterge &amp;tot</translation>
+ <translation>Curăţă to&amp;ate</translation>
</message>
<message>
<source>&amp;Verify Message</source>
- <translation>Verifica mesajul</translation>
+ <translation>&amp;Verifică mesaj</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Introduceti adresa de semnatura, mesajul (asigurati-va ca ati copiat spatiile, taburile etc. exact) si semnatura dedesubt pentru a verifica mesajul. Aveti grija sa nu cititi mai mult in semnatura decat mesajul in sine, pentru a evita sa fiti pacaliti de un atac de tip man-in-the-middle.</translation>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation>Introduceţi o adresă Bitcoin</translation>
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation>Verifica mesajul pentru a fi sigur ca a fost semnat cu adresa Bitcoin specifica</translation>
+ <translation>Verificaţi mesajul pentru a vă asigura că a fost semnat cu adresa Bitcoin specificată</translation>
</message>
<message>
<source>Verify &amp;Message</source>
- <translation>Verifică &amp;Message</translation>
+ <translation>Verifică &amp;mesaj</translation>
</message>
<message>
<source>Reset all verify message fields</source>
- <translation>Reseteaza toate spatiile mesajelor semnate.</translation>
+ <translation>Resetează toate cîmpurile mesajelor semnate</translation>
</message>
<message>
<source>Click "Sign Message" to generate signature</source>
- <translation>Click "Semneaza msajul" pentru a genera semnatura</translation>
+ <translation>Faceţi clic pe "Semneaza msaj" pentru a genera semnătura</translation>
</message>
<message>
<source>The entered address is invalid.</source>
- <translation>Adresa introdusa nu este valida</translation>
+ <translation>Adresa introdusă nu este validă</translation>
</message>
<message>
<source>Please check the address and try again.</source>
- <translation>Te rugam verifica adresa si introduce-o din nou</translation>
+ <translation>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>Adresa introdusa nu se refera la o cheie.</translation>
+ <translation>Adresa introdusă nu se referă la o cheie.</translation>
</message>
<message>
<source>Wallet unlock was cancelled.</source>
- <translation>Blocarea portofelului a fost intrerupta</translation>
+ <translation>Blocarea portofelului a fost întreruptă.</translation>
</message>
<message>
<source>Private key for the entered address is not available.</source>
- <translation>Cheia privata pentru adresa introdusa nu este valida.</translation>
+ <translation>Cheia privată pentru adresa introdusă nu este validă.</translation>
</message>
<message>
<source>Message signing failed.</source>
- <translation>Semnarea mesajului a esuat</translation>
+ <translation>Semnarea mesajului nu a reuşit.</translation>
</message>
<message>
<source>Message signed.</source>
- <translation>Mesaj Semnat!</translation>
+ <translation>Mesaj semnat.</translation>
</message>
<message>
<source>The signature could not be decoded.</source>
- <translation>Aceasta semnatura nu a putut fi decodata</translation>
+ <translation>Această semnatură nu a putut fi decodată.</translation>
</message>
<message>
<source>Please check the signature and try again.</source>
- <translation>Verifica semnatura si incearca din nou</translation>
+ <translation>Vă rugăm verificaţi semnătura şi încercaţi din nou.</translation>
</message>
<message>
<source>The signature did not match the message digest.</source>
- <translation>Semnatura nu seamana!</translation>
+ <translation>Semnatura nu se potriveşte cu mesajul.</translation>
</message>
<message>
<source>Message verification failed.</source>
- <translation>Verificarea mesajului a esuat</translation>
+ <translation>Verificarea mesajului nu a reuşit.</translation>
</message>
<message>
<source>Message verified.</source>
- <translation>Mesaj verificat</translation>
+ <translation>Mesaj verificat.</translation>
</message>
</context>
<context>
<name>SplashScreen</name>
<message>
<source>Bitcoin Core</source>
- <translation>Bitcoin Core</translation>
+ <translation>Nucleul Bitcoin</translation>
</message>
<message>
<source>The Bitcoin Core developers</source>
- <translation>Dezvoltatorii Bitcoin Core</translation>
+ <translation>Dezvoltatorii Nucleului Bitcoin</translation>
</message>
<message>
<source>[testnet]</source>
@@ -1828,7 +2218,11 @@ Adresa: %4
<name>TransactionDesc</name>
<message>
<source>Open until %1</source>
- <translation>Deschis până la %1</translation>
+ <translation>Deschis pînă la %1</translation>
+ </message>
+ <message>
+ <source>conflicted</source>
+ <translation>în conflict</translation>
</message>
<message>
<source>%1/offline</source>
@@ -1872,7 +2266,11 @@ Adresa: %4
</message>
<message>
<source>own address</source>
- <translation>Adresa posedata</translation>
+ <translation>adresa proprie</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation>doar-supraveghere</translation>
</message>
<message>
<source>label</source>
@@ -1888,15 +2286,23 @@ Adresa: %4
</message>
<message>
<source>not accepted</source>
- <translation>nu este acceptat</translation>
+ <translation>neacceptat</translation>
</message>
<message>
<source>Debit</source>
<translation>Debit</translation>
</message>
<message>
+ <source>Total debit</source>
+ <translation>Total debit</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation>Total credit</translation>
+ </message>
+ <message>
<source>Transaction fee</source>
- <translation>Comisionul tranzacţiei</translation>
+ <translation>Taxă tranzacţie</translation>
</message>
<message>
<source>Net amount</source>
@@ -1908,11 +2314,11 @@ Adresa: %4
</message>
<message>
<source>Comment</source>
- <translation>Comentarii</translation>
+ <translation>Comentariu</translation>
</message>
<message>
<source>Transaction ID</source>
- <translation>ID-ul tranzactiei</translation>
+ <translation>ID-ul tranzacţie</translation>
</message>
<message>
<source>Merchant</source>
@@ -1920,11 +2326,11 @@ Adresa: %4
</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>Monezile generate trebuie sa creasca %1 block-uri inainte sa poata fi cheltuite. Cand ati generat acest block, a fost transmis retelei pentru a fi adaugat la lantul de block-uri. Aceasta se poate intampla ocazional daca alt nod genereaza un block la numai cateva secunde de al tau.</translation>
+ <translation>Monezile generate trebuie să crească %1 blocuri înainte să poată fi cheltuite. Cînd aţi generat acest bloc, a fost transmis reţelei pentru a fi adaugat la lanţul de blocuri. Aceasta se poate întîmpla ocazional dacă alt nod generează un bloc la numai cîteva secunde de al dvs.</translation>
</message>
<message>
<source>Debug information</source>
- <translation>Informatii pentru debug</translation>
+ <translation>Informaţii pentru depanare</translation>
</message>
<message>
<source>Transaction</source>
@@ -1932,7 +2338,7 @@ Adresa: %4
</message>
<message>
<source>Inputs</source>
- <translation>Intrari</translation>
+ <translation>Intrări</translation>
</message>
<message>
<source>Amount</source>
@@ -1940,11 +2346,11 @@ Adresa: %4
</message>
<message>
<source>true</source>
- <translation>Adevarat!</translation>
+ <translation>adevărat</translation>
</message>
<message>
<source>false</source>
- <translation>Fals!</translation>
+ <translation>fals</translation>
</message>
<message>
<source>, has not been successfully broadcast yet</source>
@@ -1959,11 +2365,11 @@ Adresa: %4
<name>TransactionDescDialog</name>
<message>
<source>Transaction details</source>
- <translation>Detaliile tranzacției</translation>
+ <translation>Detaliile tranzacţiei</translation>
</message>
<message>
<source>This pane shows a detailed description of the transaction</source>
- <translation>Acest panou afișează o descriere detaliată a tranzacției</translation>
+ <translation>Acest panou arată o descriere detaliată a tranzacţiei</translation>
</message>
</context>
<context>
@@ -1974,11 +2380,11 @@ Adresa: %4
</message>
<message>
<source>Type</source>
- <translation>Tipul</translation>
+ <translation>Tip</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresa</translation>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation>Imatur (%1 confirmări, va fi disponibil după %2)</translation>
</message>
<message>
<source>Open until %1</source>
@@ -1990,7 +2396,7 @@ Adresa: %4
</message>
<message>
<source>This block was not received by any other nodes and will probably not be accepted!</source>
- <translation>Acest bloc nu a fost recepționat de niciun alt nod și probabil nu va fi acceptat!</translation>
+ <translation>Acest bloc nu a fost recepţionat de nici un alt nod şi probabil nu va fi acceptat!</translation>
</message>
<message>
<source>Generated but not accepted</source>
@@ -2001,16 +2407,24 @@ Adresa: %4
<translation>Deconectat</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etichetă</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Neconfirmat</translation>
</message>
<message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
- <translation>Confirmare (%1 dintre %2 confirmări recomandate)</translation>
+ <translation>Confirmare (%1 din %2 confirmări recomandate)</translation>
+ </message>
+ <message>
+ <source>Conflicted</source>
+ <translation>În conflict</translation>
</message>
<message>
<source>Received with</source>
- <translation>Recepționat cu</translation>
+ <translation>Recepţionat cu</translation>
</message>
<message>
<source>Received from</source>
@@ -2022,31 +2436,35 @@ Adresa: %4
</message>
<message>
<source>Payment to yourself</source>
- <translation>Plată către tine</translation>
+ <translation>Plată către dvs.</translation>
</message>
<message>
<source>Mined</source>
- <translation>Produs</translation>
+ <translation>Minerit</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation>doar-supraveghere</translation>
</message>
<message>
<source>(n/a)</source>
- <translation>(n/a)</translation>
+ <translation>indisponibil</translation>
</message>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation>Starea tranzacției. Treci cu mausul peste acest câmp pentru afișarea numărului de confirmări.</translation>
+ <translation>Starea tranzacţiei. Treceţi cu mouse-ul peste acest cîmp pentru afişarea numărului de confirmări.</translation>
</message>
<message>
<source>Date and time that the transaction was received.</source>
- <translation>Data și ora la care a fost recepționată tranzacția.</translation>
+ <translation>Data şi ora la care a fost recepţionată tranzacţia.</translation>
</message>
<message>
<source>Type of transaction.</source>
- <translation>Tipul tranzacției.</translation>
+ <translation>Tipul tranzacţiei.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Adresa de destinație a tranzacției.</translation>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation>Indiferent dacă sau nu o adresă doar-suăpraveghere este implicată în această tranzacţie.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2065,7 +2483,7 @@ Adresa: %4
</message>
<message>
<source>This week</source>
- <translation>Săptămâna aceasta</translation>
+ <translation>Săptămîna aceasta</translation>
</message>
<message>
<source>This month</source>
@@ -2081,11 +2499,11 @@ Adresa: %4
</message>
<message>
<source>Range...</source>
- <translation>Între...</translation>
+ <translation>Interval...</translation>
</message>
<message>
<source>Received with</source>
- <translation>Recepționat cu</translation>
+ <translation>Recepţionat cu</translation>
</message>
<message>
<source>Sent to</source>
@@ -2093,11 +2511,11 @@ Adresa: %4
</message>
<message>
<source>To yourself</source>
- <translation>Către tine</translation>
+ <translation>Către dvs.</translation>
</message>
<message>
<source>Mined</source>
- <translation>Produs</translation>
+ <translation>Minerit</translation>
</message>
<message>
<source>Other</source>
@@ -2105,11 +2523,11 @@ Adresa: %4
</message>
<message>
<source>Enter address or label to search</source>
- <translation>Introdu adresa sau eticheta pentru căutare</translation>
+ <translation>Introduceţi adresa sau eticheta pentru căutare</translation>
</message>
<message>
<source>Min amount</source>
- <translation>Cantitatea minimă</translation>
+ <translation>Suma minimă</translation>
</message>
<message>
<source>Copy address</source>
@@ -2125,7 +2543,7 @@ Adresa: %4
</message>
<message>
<source>Copy transaction ID</source>
- <translation>Copiază ID tranzacție</translation>
+ <translation>Copiază ID tranzacţie</translation>
</message>
<message>
<source>Edit label</source>
@@ -2133,23 +2551,27 @@ Adresa: %4
</message>
<message>
<source>Show transaction details</source>
- <translation>Arată detaliile tranzacției</translation>
+ <translation>Arată detaliile tranzacţiei</translation>
</message>
<message>
<source>Export Transaction History</source>
- <translation>Exportare Istoric Tranzacţii</translation>
+ <translation>Export istoric tranzacţii</translation>
+ </message>
+ <message>
+ <source>Watch-only</source>
+ <translation>Doar-supraveghere</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation>Exportare Eşuată</translation>
+ <translation>Export nereuşit</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
- <translation>S-a produs o eroare încercând să se salveze istoricul tranzacţiilor la %1.</translation>
+ <translation>S-a produs o eroare la salvarea istoricului tranzacţiilor la %1.</translation>
</message>
<message>
<source>Exporting Successful</source>
- <translation>Exportare Reuşită</translation>
+ <translation>Export reuşit</translation>
</message>
<message>
<source>The transaction history was successfully saved to %1.</source>
@@ -2157,7 +2579,7 @@ Adresa: %4
</message>
<message>
<source>Comma separated file (*.csv)</source>
- <translation>Fișier text cu valori separate prin virgulă (*.csv)</translation>
+ <translation>Fişier text cu valori separate prin virgulă (*.csv)</translation>
</message>
<message>
<source>Confirmed</source>
@@ -2169,7 +2591,7 @@ Adresa: %4
</message>
<message>
<source>Type</source>
- <translation>Tipul</translation>
+ <translation>Tip</translation>
</message>
<message>
<source>Label</source>
@@ -2194,34 +2616,38 @@ Adresa: %4
</context>
<context>
<name>UnitDisplayStatusBarControl</name>
- </context>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>Unitatea în care sînt arătate sumele. Faceţi clic pentru a selecta o altă unitate.</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
<source>No wallet has been loaded.</source>
- <translation>Nu a fost încărcat niciun portofel.</translation>
+ <translation>Nu a fost încărcat nici un portofel.</translation>
</message>
</context>
<context>
<name>WalletModel</name>
<message>
<source>Send Coins</source>
- <translation>Trimite Bitcoin</translation>
+ <translation>Trimitere bitcoin</translation>
</message>
</context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation>&amp;Exportă</translation>
+ <translation>&amp;Export</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation>Exporta datele din tab-ul curent într-un fișier</translation>
+ <translation>Exportă datele din tab-ul curent într-un fişier</translation>
</message>
<message>
<source>Backup Wallet</source>
- <translation>Fă o copie de siguranță a portofelului</translation>
+ <translation>Copie de siguranţă portofel</translation>
</message>
<message>
<source>Wallet Data (*.dat)</source>
@@ -2229,11 +2655,11 @@ Adresa: %4
</message>
<message>
<source>Backup Failed</source>
- <translation>Copia de rezerva a esuat</translation>
+ <translation>Copierea de siguranţă nu a reuşit</translation>
</message>
<message>
<source>There was an error trying to save the wallet data to %1.</source>
- <translation>S-a produs o eroare încercând să se salveze datele portofelului la %1.</translation>
+ <translation>S-a produs o eroare la salvarea datelor portofelului la %1.</translation>
</message>
<message>
<source>The wallet data was successfully saved to %1.</source>
@@ -2241,107 +2667,98 @@ Adresa: %4
</message>
<message>
<source>Backup Successful</source>
- <translation>Copia de siguranță efectuată cu succes</translation>
+ <translation>Copie de siguranţă efectuată cu succes</translation>
</message>
</context>
<context>
<name>bitcoin-core</name>
<message>
<source>Options:</source>
- <translation>Setări:</translation>
+ <translation>Opţiuni:</translation>
</message>
<message>
<source>Specify data directory</source>
- <translation>Specifică dosarul de date</translation>
+ <translation>Specificaţi dosarul de date</translation>
</message>
<message>
<source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Conectează-te la nod pentru a obține adresele partenerilor, și apoi deconectează-te</translation>
+ <translation>Se conectează la un nod pentru a obţine adresele partenerilor, şi apoi se deconectează</translation>
</message>
<message>
<source>Specify your own public address</source>
- <translation>Specifică adresa ta publică</translation>
+ <translation>Specificaţi adresa dvs. publică</translation>
</message>
<message>
<source>Accept command line and JSON-RPC commands</source>
- <translation>Se acceptă comenzi din linia de comandă și comenzi JSON-RPC</translation>
+ <translation>Acceptă comenzi din linia de comandă şi comenzi JSON-RPC</translation>
</message>
<message>
<source>Run in the background as a daemon and accept commands</source>
- <translation>Rulează în fundal ca un demon și acceptă comenzi</translation>
+ <translation>Rulează în fundal ca un demon şi acceptă comenzi</translation>
</message>
<message>
<source>Use the test network</source>
- <translation>Utilizează rețeaua de test</translation>
+ <translation>Utilizează reţeaua de test</translation>
</message>
<message>
<source>Accept connections from outside (default: 1 if no -proxy or -connect)</source>
- <translation>Acceptă conexiuni din afară (implicit: 1 dacă nu se folosește -proxy sau -connect)</translation>
- </message>
- <message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s trebuie sa setezi o parola rpc in fisierul de configurare
-%s
-Este recomandat sa folosesti aceasta parola aleatorie:
-rpcuser=bitcoinrpc
-parola rpc=%s
-(nu este necesar ca sa iti amintesti aceasta parola)
-Numele de utilizator si parola NU trebuie sa fie la fel.
-Daca fisierul nu exista, creaza-l cu fisier de citit permis doar proprietarului.
-Este de asemenea recomandat sa setezi alerta de notificare ca sa primesti notificari ale problemelor;
-spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com
-
-</translation>
+ <translation>Acceptă conexiuni din afară (implicit: 1 dacă nu se foloseşte -proxy sau -connect)</translation>
</message>
<message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
- <translation>Atasati adresei date si ascultati totdeauna pe ea. Folositi [host]:port notatia pentru IPv6</translation>
+ <translation>Ataşaţi adresei date şi ascultaţi totdeauna pe ea. Folosiţi notaţia [host]:port pentru IPv6</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Eroare: Tranzactia a fost respinsa! Acest lucru se poate intampla daca anumite monezi din portofelul dumneavoastra au fost deja cheltuite, deasemenea daca ati folosit o copie a fisierului wallet.dat si monezile au fost folosite in acea copie dar nu au fost marcate ca fiind folosite acolo.</translation>
+ <source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
+ <translation>Distribuit sub licenţa de programe MIT/X11, vezi fişierul însoţitor COPYING sau &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
</message>
<message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Eroare: Aceasta tranzactie necesita o taxa de cel putin %s din cauza sumei, complexitatii sau folosirii fondurilor recent primite!</translation>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>Iniţiază modul de test regresie, care foloseşte un lanţ special în care blocurile pot fi rezolvate instantaneu.</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
- <translation>Executati comanda cand o tranzactie a portofelului se schimba (%s in cmd este inlocuit de TxID)</translation>
+ <translation>Execută comanda cînd o tranzacţie a portofelului se schimbă (%s în cmd este înlocuit de TxID)</translation>
+ </message>
+ <message>
+ <source>In this mode -genproclimit controls how many blocks are generated immediately.</source>
+ <translation>În acest mod -genproclimit controlează cîte blocuri sînt generate imediat.</translation>
+ </message>
+ <message>
+ <source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
+ <translation>Setează numărul de thread-uri de verificare a script-urilor (%u la %d, 0 = auto, &lt;0 = lasă atîtea nuclee libere, implicit: %d)</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>Aceasta este o versiune de test preliminara - va asumati riscul folosind-o - nu folositi pentru minerit sau aplicatiile comerciantilor.</translation>
+ <translation>Aceasta este o versiune de test preliminară - vă asumaţi riscul folosind-o - nu folosiţi pentru minerit sau aplicaţiile comercianţilor</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. Bitcoin Core is probably already running.</source>
+ <translation>Nu se poate lega la %s pe acest calculator. Nucleul Bitcoin probabil deja rulează.</translation>
</message>
<message>
<source>Warning: -paytxfee is set very high! This is the transaction fee you will pay if you send a transaction.</source>
- <translation>Atentie: setarea -paytxfee este foarte ridicata! Aceasta este taxa tranzactiei pe care o vei plati daca trimiti o tranzactie.</translation>
+ <translation>Atenţie: setarea -paytxfee este foarte mare! Aceasta este taxa tranzacţiei pe care o veţi plăti dacă trimiteţi o tranzacţie.</translation>
</message>
<message>
<source>Warning: The network does not appear to fully agree! Some miners appear to be experiencing issues.</source>
- <translation>Atentie: Reteaua nu pare sa fie deacord in totalitate! Aparent niste mineri au probleme. </translation>
+ <translation>Atenţie: Reţeaua nu pare să fie de acord în totalitate! Aparent nişte mineri au probleme.</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>Atentie: Aparent, nu suntem deacord cu toti membrii nostri! Va trebui sa faci un upgrade, sau alte noduri ar necesita upgrade. </translation>
+ <translation>Atenţie: Aparent, nu sîntem de acord cu toţi partenerii noştri! Va trebui să faceţi o actualizare, sau alte noduri necesită actualizare.</translation>
</message>
<message>
<source>Warning: error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation>Atentie: eroare la citirea fisierului wallet.dat! Toate cheile sunt citite corect, dar datele tranzactiei sau anumite intrari din agenda sunt incorecte sau lipsesc.</translation>
+ <translation>Atenţie: eroare la citirea fişierului wallet.dat! Toate cheile sînt citite corect, dar datele tranzactiei sau anumite intrări din agenda sînt incorecte sau lipsesc.</translation>
</message>
<message>
<source>Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect you should restore from a backup.</source>
- <translation>Atentie: fisierul wallet.dat este corupt, date salvate! Fisierul original wallet.dat a fost salvat ca wallet.{timestamp}.bak in %s; daca balansul sau tranzactiile sunt incorecte ar trebui sa restaurati dintr-o copie de siguranta. </translation>
+ <translation>Atenţie: fişierul wallet.dat este corupt, date salvate! Fişierul original wallet.dat a fost salvat ca wallet.{timestamp}.bak in %s; dacă balansul sau tranzactiile sînt incorecte ar trebui să restauraţi dintr-o copie de siguranţă.</translation>
+ </message>
+ <message>
+ <source>(default: 1)</source>
+ <translation>(iniţial: 1)</translation>
</message>
<message>
<source>&lt;category&gt; can be:</source>
@@ -2349,35 +2766,43 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com
</message>
<message>
<source>Attempt to recover private keys from a corrupt wallet.dat</source>
- <translation>Încearcă recuperarea cheilor private dintr-un wallet.dat corupt</translation>
+ <translation>Încercare de recuperare a cheilor private dintr-un wallet.dat corupt</translation>
</message>
<message>
<source>Block creation options:</source>
- <translation>Optiuni creare block</translation>
+ <translation>Opţiuni creare bloc:</translation>
</message>
<message>
<source>Connect only to the specified node(s)</source>
- <translation>Conecteaza-te doar la nod(urile) specifice</translation>
+ <translation>Conectare doar la nod(urile) specificate</translation>
+ </message>
+ <message>
+ <source>Connection options:</source>
+ <translation>Opţiuni conexiune:</translation>
</message>
<message>
<source>Corrupted block database detected</source>
- <translation>Baza de date 'bloc' defectată a fost detectată</translation>
+ <translation>Bloc defect din baza de date detectat</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Descopera propria ta adresa IP (intial: 1)</translation>
+ <source>Debugging/Testing options:</source>
+ <translation>Opţiuni Depanare/Test:</translation>
+ </message>
+ <message>
+ <source>Do not load the wallet and disable wallet RPC calls</source>
+ <translation>Nu încarcă portofelul şi dezactivează solicitările portofel RPC</translation>
</message>
<message>
<source>Do you want to rebuild the block database now?</source>
- <translation>Doriți să reconstruiți baza de date 'bloc' acum?</translation>
+ <translation>Doriţi să reconstruiţi baza de date blocuri acum?</translation>
</message>
<message>
<source>Error initializing block database</source>
- <translation>Eroare la inițializarea bazei de date de blocuri</translation>
+ <translation>Eroare la iniţializarea bazei de date de blocuri</translation>
</message>
<message>
<source>Error initializing wallet database environment %s!</source>
- <translation>Eroare la initializarea mediului de baza de date a portofelului %s!</translation>
+ <translation>Eroare la iniţializarea mediului de bază de date a portofelului %s!</translation>
</message>
<message>
<source>Error loading block database</source>
@@ -2389,43 +2814,55 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com
</message>
<message>
<source>Error: Disk space is low!</source>
- <translation>Eroare: Spațiu pe disc redus!</translation>
+ <translation>Eroare: Spaţiu pe disc redus!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Eroare: Portofel blocat, nu se poate crea o tranzacție!</translation>
+ <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <translation>Nu s-a reuşit ascultarea pe orice port. Folosiţi -listen=0 dacă vreţi asta.</translation>
</message>
<message>
- <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation>Am esuat ascultarea pe orice port. Folositi -listen=0 daca vreti asta.</translation>
+ <source>If &lt;category&gt; is not supplied, output all debugging information.</source>
+ <translation>Dacă &lt;category&gt; nu este furnizat, produce toate informaţiile de depanare.</translation>
+ </message>
+ <message>
+ <source>Importing...</source>
+ <translation>Import...</translation>
</message>
<message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation>Incorect sau nici un bloc de Geneza găsite. Directorul de retea greşit?</translation>
+ <translation>Incorect sau nici un bloc de geneza găsit. Directorul de retea greşit?</translation>
</message>
<message>
<source>Invalid -onion address: '%s'</source>
- <translation>Adresa -onion invalidă: '%s'</translation>
+ <translation>Adresa -onion nevalidă: '%s'</translation>
</message>
<message>
<source>Not enough file descriptors available.</source>
- <translation>Nu sunt destule descriptoare disponibile.</translation>
+ <translation>Nu sînt destule descriptoare disponibile.</translation>
+ </message>
+ <message>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>Se conectează doar la noduri în reţeaua &lt;net&gt; (ipv4, ipv6 sau onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Reconstruirea indexului lantului de block-uri din fisierele actuale blk000???.dat</translation>
+ <source>Set database cache size in megabytes (%d to %d, default: %d)</source>
+ <translation>Setează mărimea bazei de date cache în megaocteţi (%d la %d, implicit: %d)</translation>
</message>
<message>
<source>Set maximum block size in bytes (default: %d)</source>
- <translation>Setaţi dimensiunea maximă a unui block în bytes (implicit: %d)</translation>
+ <translation>Setaţi dimensiunea maximă a unui bloc în bytes (implicit: %d)</translation>
</message>
<message>
<source>Specify wallet file (within data directory)</source>
- <translation>Specifică fișierul wallet (în dosarul de date)</translation>
+ <translation>Specifică fişierul portofel (în dosarul de date)</translation>
</message>
<message>
<source>This is intended for regression testing tools and app development.</source>
- <translation>Este folosita pentru programe de testare a regresiei in algoritmi si dezvoltare de alte aplicatii. </translation>
+ <translation>Este folosită pentru programe de testare a regresiei în algoritmi şi dezvoltare de alte aplicaţii.</translation>
+ </message>
+ <message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>Foloseşte mapare UPnP pentru asculatere port (implicit: %u)</translation>
</message>
<message>
<source>Verifying blocks...</source>
@@ -2441,83 +2878,215 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com
</message>
<message>
<source>Wallet options:</source>
- <translation>Optiuni de portofel</translation>
+ <translation>Opţiuni portofel:</translation>
</message>
<message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
- <translation>Trebuie să reconstruiești baza de date folosind -reindex pentru a schimba -txindex</translation>
+ <translation>Trebuie să reconstruiţi baza de date folosind -reindex pentru a schimba -txindex</translation>
</message>
<message>
<source>Imports blocks from external blk000??.dat file</source>
- <translation>Importă blocuri dintr-un fișier extern blk000??.dat</translation>
+ <translation>Importă blocuri dintr-un fişier extern blk000??.dat</translation>
+ </message>
+ <message>
+ <source>Allow JSON-RPC connections from specified source. Valid for &lt;ip&gt; are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
+ <translation>Permite conexiunile JSON-RPC din sursa specificată. Valid pentru &lt;ip&gt; sînt IP singulare (ex. 1.2.3.4), o reţea/mască-reţea (ex. 1.2.3.4/255.255.255.0) sau o reţea/CIDR (ex. 1.2.3.4/24). Această opţiune poate fi specificată de mai multe ori</translation>
+ </message>
+ <message>
+ <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source>
+ <translation>A apărut o eroare la setarea adresei RPC %s portul %u pentru ascultare: %s</translation>
+ </message>
+ <message>
+ <source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
+ <translation>Nu se poate obţine blocarea folderului cu date %s. Nucleul Bitcoin probabil deja rulează.</translation>
</message>
<message>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
- <translation>Executati comanda cand o alerta relevanta este primita sau vedem o bifurcatie foarte lunga (%s in cmd este inlocuti de mesaj)</translation>
+ <translation>Execută comanda cînd o alertă relevantă este primită sau vedem o bifurcaţie foarte lungă (%s în cmd este înlocuit de mesaj)</translation>
+ </message>
+ <message>
+ <source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
+ <translation>Setează mărimea pentru tranzacţiile prioritare/taxe mici în octeţi (implicit: %d)</translation>
+ </message>
+ <message>
+ <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
+ <translation>Acest produs include programe dezvoltate de către Proiectul OpenSSL pentru a fi folosite în OpenSSL Toolkit &lt;https://www.openssl.org/&gt; şi programe criptografice scrise de către Eric Young şi programe UPnP scrise de către Thomas Bernard.</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Acceptă cererile publice REST (implicit: %u)</translation>
+ </message>
+ <message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Alege dosarul de date la pornire (implicit: 0)</translation>
+ </message>
+ <message>
+ <source>Connect through SOCKS5 proxy</source>
+ <translation>Conectare prin proxy SOCKS5</translation>
+ </message>
+ <message>
+ <source>Copyright (C) 2009-%i The Bitcoin Core Developers</source>
+ <translation>Copyright (C) 2009-%i Dezvoltatorii Bitcoin</translation>
+ </message>
+ <message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Eroare la citirea bazei de date. Oprire.</translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -tor found, use -onion.</source>
+ <translation>Eroare: Argument nesuportat -tor găsit, folosiţi -onion.</translation>
+ </message>
+ <message>
+ <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
+ <translation>Taxa (în BTC/kB) de adăugat la tranzacţiile pe care le trimiteţi(implicit: %s)</translation>
</message>
<message>
<source>Information</source>
- <translation>Informație</translation>
+ <translation>Informaţie</translation>
+ </message>
+ <message>
+ <source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
+ <translation>Nu s-a reuşit iniţierea verificării sănătăţii. Nucleul Bitcoin se opreşte.</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Sumă nevalidă pentru -maxtxfee=&lt;suma&gt;: '%s'</translation>
</message>
<message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
- <translation>Suma invalida pentru -minrelaytxfee=&lt;suma&gt;:'%s'</translation>
+ <translation>Sumă nevalidă pentru -minrelaytxfee=&lt;suma&gt;:'%s'</translation>
</message>
<message>
<source>Invalid amount for -mintxfee=&lt;amount&gt;: '%s'</source>
- <translation>Suma invalida pentru -mintxfee=&lt;suma&gt;: '%s'</translation>
+ <translation>Sumă nevalidă pentru -mintxfee=&lt;suma&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -paytxfee=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation>Sumă nevalidă pentru -paytxfee=&lt;suma&gt;: '%s' (trebuie să fie cel puţin %s)</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Publica bloc la pornire daca exista in index-ul de blocuri. </translation>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation>Mască reţea nevalidă specificată în -whitelist: '%s'</translation>
+ </message>
+ <message>
+ <source>Need to specify a port with -whitebind: '%s'</source>
+ <translation>Trebuie să specificaţi un port cu -whitebind: '%s'</translation>
+ </message>
+ <message>
+ <source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
+ <translation>Opţiuni RPC SSL: (vedeţi Wiki Bitcoin pentru intrucţiunile de setare SSL)</translation>
+ </message>
+ <message>
+ <source>RPC server options:</source>
+ <translation>Opţiuni server RPC:</translation>
+ </message>
+ <message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>RPC suportă pentru HTTP conexiuni persistente (implicit: %d)</translation>
+ </message>
+ <message>
+ <source>Randomly drop 1 of every &lt;n&gt; network messages</source>
+ <translation>Aleator sccapă 1 din fiecare &lt;n&gt; mesaje ale reţelei</translation>
+ </message>
+ <message>
+ <source>Randomly fuzz 1 of every &lt;n&gt; network messages</source>
+ <translation>Aleator aproximează 1 din fiecare &lt;n&gt; mesaje ale reţelei</translation>
</message>
<message>
<source>Send trace/debug info to console instead of debug.log file</source>
- <translation>Trimite informațiile trace/debug la consolă în locul fișierului debug.log</translation>
+ <translation>Trimite informaţiile trace/debug la consolă în locul fişierului debug.log</translation>
+ </message>
+ <message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>Trimitere tranzacţii ca tranzacţii taxă-zero dacă este posibil (implicit: %u)</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Setare rădăcină certificat SSL pentru cerere de plată (implicit: -sistem- )</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Setează limba, de exemplu: "de_DE" (implicit: sistem local)</translation>
+ </message>
+ <message>
+ <source>Show all debugging options (usage: --help -help-debug)</source>
+ <translation>Arată toate opţiunile de depanare (uz: --help -help-debug)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Afişează pe ecran splash la pornire (implicit: 1)</translation>
</message>
<message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
- <translation>Micsorati fisierul debug.log la inceperea clientului (implicit: 1 cand nu -debug)</translation>
+ <translation>Micşorează fişierul debug.log la pornirea clientului (implicit: 1 cînd nu se foloseşte -debug)</translation>
</message>
<message>
<source>Signing transaction failed</source>
- <translation>Semnarea tranzacției a eșuat</translation>
+ <translation>Nu s-a reuşit semnarea tranzacţiei</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Începe minimizat</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation>Acesta este un program experimental.</translation>
</message>
<message>
<source>Transaction amount too small</source>
- <translation>Suma tranzacționată este prea mică</translation>
+ <translation>Suma tranzacţionată este prea mică</translation>
</message>
<message>
<source>Transaction amounts must be positive</source>
- <translation>Sumele tranzacționate trebuie să fie pozitive</translation>
+ <translation>Sumele tranzacţionate trebuie să fie pozitive</translation>
+ </message>
+ <message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Tranzacţie prea mare pentru politică gratis</translation>
</message>
<message>
<source>Transaction too large</source>
- <translation>Tranzacția este prea mare</translation>
+ <translation>Tranzacţie prea mare</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer (bind returned error %s)</source>
+ <translation>Nu se poate lega la %s pe acest calculator. (Legarea a întors eroarea %s)</translation>
</message>
<message>
<source>Use UPnP to map the listening port (default: 1 when listening)</source>
- <translation>Foloseste UPnP pentru a vedea porturile (initial: 1 cand listezi)</translation>
+ <translation>Foloseşte UPnP pentru a vedea porturile (implicit: 1 cînd ascultă)</translation>
</message>
<message>
<source>Username for JSON-RPC connections</source>
<translation>Utilizator pentru conexiunile JSON-RPC</translation>
</message>
<message>
+ <source>Wallet needed to be rewritten: restart Bitcoin Core to complete</source>
+ <translation>Portofelul necesită rescrierea: reporniţi Nucleul Bitcoin pentru completare</translation>
+ </message>
+ <message>
<source>Warning</source>
- <translation>Avertizare</translation>
+ <translation>Avertisment</translation>
+ </message>
+ <message>
+ <source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
+ <translation>Avertisment: Argument nesuportat -benchmark ignorat, folosiţi -debug=bench.</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Atenție: această versiune este depășită, este necesară actualizarea!</translation>
+ <source>Warning: Unsupported argument -debugnet ignored, use -debug=net.</source>
+ <translation>Avertisment: Argument nesuportat -debugnet ignorat, folosiţi -debug=net.</translation>
+ </message>
+ <message>
+ <source>Zapping all transactions from wallet...</source>
+ <translation>Şterge toate tranzacţiile din portofel...</translation>
</message>
<message>
<source>on startup</source>
- <translation>in timpul pornirii</translation>
+ <translation>la pornire</translation>
</message>
<message>
<source>wallet.dat corrupt, salvage failed</source>
- <translation>wallet.dat corupt, recuperare eșuată</translation>
+ <translation>wallet.dat corupt, salvare nereuşită</translation>
</message>
<message>
<source>Password for JSON-RPC connections</source>
@@ -2525,7 +3094,7 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com
</message>
<message>
<source>Execute command when the best block changes (%s in cmd is replaced by block hash)</source>
- <translation>Execută comanda când cel mai bun bloc se modifică (%s în cmd este înlocuit cu hash-ul blocului)</translation>
+ <translation>Execută comanda cînd cel mai bun bloc se modifică (%s în cmd este înlocuit cu hash-ul blocului)</translation>
</message>
<message>
<source>Upgrade wallet to latest format</source>
@@ -2533,11 +3102,11 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com
</message>
<message>
<source>Rescan the block chain for missing wallet transactions</source>
- <translation>Rescanează lanțul de bloc pentru tranzacțiile portofel lipsă</translation>
+ <translation>Rescanează lanţul de bloc pentru tranzacţiile portofel lipsă</translation>
</message>
<message>
<source>Use OpenSSL (https) for JSON-RPC connections</source>
- <translation>Folosește OpenSSL (https) pentru conexiunile JSON-RPC</translation>
+ <translation>Foloseşte OpenSSL (https) pentru conexiunile JSON-RPC</translation>
</message>
<message>
<source>This help message</source>
@@ -2545,27 +3114,75 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com
</message>
<message>
<source>Allow DNS lookups for -addnode, -seednode and -connect</source>
- <translation>Permite căutări DNS pentru -addnode, -seednode și -connect</translation>
+ <translation>Permite căutări DNS pentru -addnode, -seednode şi -connect</translation>
</message>
<message>
<source>Loading addresses...</source>
- <translation>Încarc adrese...</translation>
+ <translation>Încărcare adrese...</translation>
</message>
<message>
<source>Error loading wallet.dat: Wallet corrupted</source>
<translation>Eroare la încărcarea wallet.dat: Portofel corupt</translation>
</message>
<message>
+ <source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Goleşte baza de date a activităţii din memoria pool în jurnal pe disc la fiecare &lt;n&gt; megaocteţi (implicit: %u)</translation>
+ </message>
+ <message>
+ <source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
+ <translation>Produce toate informaţiile de depanare (implicit: %u &lt;category&gt; furnizată este opţională)</translation>
+ </message>
+ <message>
+ <source>(default: %s)</source>
+ <translation>(implicit: %s)</translation>
+ </message>
+ <message>
+ <source>Acceptable ciphers (default: %s)</source>
+ <translation>Cifruri acceptabile (implicit: %s)</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>Eroare la încărcarea wallet.dat</translation>
</message>
<message>
+ <source>Force safe mode (default: %u)</source>
+ <translation>Forţează mod sigur (implicit: %u)</translation>
+ </message>
+ <message>
+ <source>Generate coins (default: %u)</source>
+ <translation>Generează monede (implicit: %u)</translation>
+ </message>
+ <message>
+ <source>How many blocks to check at startup (default: %u, 0 = all)</source>
+ <translation>Cîte blocuri verifică la pornire (implicit: %u, 0 = toate)</translation>
+ </message>
+ <message>
<source>Invalid -proxy address: '%s'</source>
<translation>Adresa -proxy nevalidă: '%s'</translation>
</message>
<message>
+ <source>Server certificate file (default: %s)</source>
+ <translation>Fişierul certificat al serverului (implicit: %s)</translation>
+ </message>
+ <message>
+ <source>Server private key (default: %s)</source>
+ <translation>Cheia privată a serverului (implicit: %s)</translation>
+ </message>
+ <message>
+ <source>Set minimum block size in bytes (default: %u)</source>
+ <translation>Setare mărime minimă bloc în octeţi (implicit: %u)</translation>
+ </message>
+ <message>
+ <source>Specify configuration file (default: %s)</source>
+ <translation>Specificaţi fişierul configuraţie (implicit: %s)</translation>
+ </message>
+ <message>
+ <source>Specify pid file (default: %s)</source>
+ <translation>Specifică fişierul pid (implicit: %s)</translation>
+ </message>
+ <message>
<source>Unknown network specified in -onlynet: '%s'</source>
- <translation>Rețeaua specificată în -onlynet este necunoscută: '%s'</translation>
+ <translation>Reţeaua specificată în -onlynet este necunoscută: '%s'</translation>
</message>
<message>
<source>Cannot resolve -bind address: '%s'</source>
@@ -2580,24 +3197,20 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com
<translation>Suma nevalidă pentru -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Sumă nevalidă</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Fonduri insuficiente</translation>
</message>
<message>
<source>Loading block index...</source>
- <translation>Încarc indice bloc...</translation>
+ <translation>Încărcare index bloc...</translation>
</message>
<message>
<source>Add a node to connect to and attempt to keep the connection open</source>
- <translation>Adaugă un nod la care te poți conecta pentru a menține conexiunea deschisă</translation>
+ <translation>Adaugă un nod la care te poţi conecta pentru a menţine conexiunea deschisă</translation>
</message>
<message>
<source>Loading wallet...</source>
- <translation>Încarc portofel...</translation>
+ <translation>Încărcare portofel...</translation>
</message>
<message>
<source>Cannot downgrade wallet</source>
@@ -2609,17 +3222,13 @@ spre exemplu: alertnotify=echo %%s | mail -s "Alerta Bitcoin" admin@foo.com
</message>
<message>
<source>Rescanning...</source>
- <translation>Rescanez...</translation>
+ <translation>Rescanare...</translation>
</message>
<message>
<source>Done loading</source>
<translation>Încărcare terminată</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Pentru a folosi opțiunea %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Eroare</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts
index 55986d4092..c208b3e25e 100644
--- a/src/qt/locale/bitcoin_ru.ts
+++ b/src/qt/locale/bitcoin_ru.ts
@@ -1,9 +1,9 @@
-<TS language="ru" version="2.0">
+<TS language="ru" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Для того, чтобы изменить адрес или метку, дважды кликните по изменяемому объекту</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Клик правой кнопкой для редактирования адреса или метки</translation>
</message>
<message>
<source>Create a new address</source>
@@ -152,10 +152,6 @@
<translation>Сменить пароль</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Введите старый и новый пароль для бумажника.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Подтвердите шифрование бумажника</translation>
</message>
@@ -184,10 +180,6 @@
<translation>Введите новый пароль бумажника.&lt;br/&gt;Используйте пароль, состоящий из &lt;b&gt;десяти или более случайных символов&lt;/b&gt;, или &lt;b&gt;восьми или более слов&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Сейчас программа закроется для завершения процесса шифрования. Помните, что шифрование вашего бумажника не может полностью защитить ваши биткойны от кражи с помощью инфицирования вашего компьютера вредоносным ПО.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Не удалось зашифровать бумажник</translation>
</message>
@@ -307,10 +299,6 @@
<translation>Отправить монеты на указанный адрес Bitcoin</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Изменить параметры конфигурации Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Сделать резервную копию бумажника в другом месте</translation>
</message>
@@ -412,40 +400,20 @@
</message>
<message>
<source>&amp;Command-line options</source>
- <translation>&amp;Пармаетры командной строки</translation>
+ <translation>&amp;Параметры командной строки</translation>
</message>
<message>
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
<translation>Показать помощь по Bitcoin Core и получить список доступных параметров командной строки.</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n активное соединение с сетью</numerusform><numerusform>%n активных соединений с сетью</numerusform><numerusform>%n активных соединений с сетью Bitcoin</numerusform></translation>
- </message>
<message>
<source>No block source available...</source>
<translation>Источник блоков недоступен...</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n час</numerusform><numerusform>%n часа</numerusform><numerusform>%n часов</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n день</numerusform><numerusform>%n дня</numerusform><numerusform>%n дней</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n неделя</numerusform><numerusform>%n недели</numerusform><numerusform>%n недель</numerusform></translation>
- </message>
<message>
<source>%1 and %2</source>
<translation>%1 и %2</translation>
</message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation><numerusform>%n год</numerusform><numerusform>%n лет</numerusform><numerusform>%n года</numerusform></translation>
- </message>
<message>
<source>%1 behind</source>
<translation>%1 позади</translation>
@@ -474,10 +442,6 @@
<source>Up to date</source>
<translation>Синхронизировано</translation>
</message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>Обработан %n блок истории транзакций.</numerusform><numerusform>Обработано %n блока истории транзакций.</numerusform><numerusform>Обработано %n блоков истории транзакций.</numerusform></translation>
- </message>
<message>
<source>Catching up...</source>
<translation>Синхронизируется...</translation>
@@ -491,18 +455,6 @@
<translation>Входящая транзакция</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Дата: %1
-Сумма: %2
-Тип: %3
-Адрес: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Бумажник &lt;b&gt;зашифрован&lt;/b&gt; и в настоящее время &lt;b&gt;разблокирован&lt;/b&gt;</translation>
</message>
@@ -705,10 +657,6 @@ Address: %4
<translation>нет</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Эта пометка становится красной, если размер транзакции больше 1000 байт.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Это значит, что требуется комиссия как минимум %1 на КБ.</translation>
</message>
@@ -721,14 +669,6 @@ Address: %4
<translation>Транзакции с более высоким приоритетом будут вероятнее других включены в блок.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Эта пометка становится красной, если приоритет ниже, чем "средний".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Эта пометка становится красной, если какой-либо из адресатов получает сумму менее %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>[нет метки]</translation>
</message>
@@ -849,30 +789,6 @@ Address: %4
<source>command-line options</source>
<translation>параметры командной строки</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Настройки интерфейса</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Выберите язык, например "de_DE" (по умолчанию: как в системе)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Запускать свёрнутым</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Указать корневые SSL-сертификаты для запроса платежа (по умолчанию: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Показывать сплэш при запуске (по умолчанию: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Выбрать каталог данных при запуске (по умолчанию: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -912,15 +828,7 @@ Address: %4
<source>Error</source>
<translation>Ошибка</translation>
</message>
- <message numerus="yes">
- <source>%n GB of free space available</source>
- <translation><numerusform>%nГБ свободного места доступно</numerusform><numerusform>%nГБ свободного места доступно</numerusform><numerusform>%nГБ свободного места доступно</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>(of %n GB needed)</source>
- <translation><numerusform>(из необходимых %nГБ)</numerusform><numerusform>(из необходимых %nГБ)</numerusform><numerusform>(из необходимых %nГБ)</numerusform></translation>
- </message>
-</context>
+ </context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -955,14 +863,6 @@ Address: %4
<translation>&amp;Главная</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Автоматически запускать Bitcoin после входа в систему</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Запускать Bitcoin при входе в систему</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Размер кэша &amp;БД</translation>
</message>
@@ -1075,10 +975,6 @@ Address: %4
<translation>&amp;Cворачивать в системный лоток вместо панели задач</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 Quit in the menu.</source>
- <translation>Сворачивать вместо закрытия. Если данная опция будет выбрана — приложение закроется только после выбора соответствующего пункта в меню.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>С&amp;ворачивать при закрытии</translation>
</message>
@@ -1091,10 +987,6 @@ Address: %4
<translation>&amp;Язык интерфейса:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Здесь можно выбрать язык интерфейса. Настройки вступят в силу после перезапуска Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Отображать суммы в единицах: </translation>
</message>
@@ -1131,10 +1023,6 @@ Address: %4
<translation>Для применения изменений требуется перезапуск клиента.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Клиент будет выключен, желаете продолжить?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Это изменение потребует перезапуска клиента.</translation>
</message>
@@ -1217,10 +1105,6 @@ Address: %4
<source>Current total balance in watch-only addresses</source>
<translation>Текущий общий баланс на адресах наблюдения</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>не синхронизировано</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1241,10 +1125,6 @@ Address: %4
<translation>Сеть запроса платежа не совпадает с сетью клиента.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Запрос платежа просрочен.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>Запрос платежа не инициализирован.</translation>
</message>
@@ -1285,6 +1165,14 @@ Address: %4
<translation>Возврат от %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>Запрос платежа %1 слишком большой (%2 байтов, разрешено %3 байтов).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>DoS-защита запроса платежа</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Ошибка связи с %1: %2</translation>
</message>
@@ -1312,10 +1200,6 @@ Address: %4
<translation>Юзер-агент</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Адрес/имя хоста</translation>
- </message>
- <message>
<source>Ping Time</source>
<translation>Время задержки</translation>
</message>
@@ -1347,14 +1231,6 @@ Address: %4
<translation>%1 с</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>СЕТЬ</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>НЕИЗВЕСТНЫЙ</translation>
- </message>
- <message>
<source>None</source>
<translation>Ничего</translation>
</message>
@@ -1450,7 +1326,7 @@ Address: %4
</message>
<message>
<source>Sent</source>
- <translation>посланный</translation>
+ <translation>Отправлено</translation>
</message>
<message>
<source>&amp;Peers</source>
@@ -1553,18 +1429,10 @@ Address: %4
<translation>Отладочный лог-файл</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Открыть отладочный лог-файл Bitcoin из текущего каталога данных. Это может занять несколько секунд для больших лог-файлов.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Очистить консоль</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Добро пожаловать в RPC-консоль Bitcoin.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Используйте стрелки вверх и вниз для просмотра истории и &lt;b&gt;Ctrl-L&lt;/b&gt; для очистки экрана.</translation>
</message>
@@ -1853,14 +1721,6 @@ Address: %4
<translation>Свернуть настройки комиссии</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Сворачивать</translation>
- </message>
- <message>
- <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
- <translation>Если комиссия установлена в 1000 сатоши, а транзакция составляет лишь 250 байт, тогда комиссия "на килобайт" составит 250 сатоши, а "как минимум" — 1000 сатоши. Для транзакций крупнее килобайта в обоих случаях будет использоваться платёж "на килобайт".</translation>
- </message>
- <message>
<source>per kilobyte</source>
<translation>за килобайт</translation>
</message>
@@ -1989,10 +1849,6 @@ Address: %4
<translation>или</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Адрес получателя неверный, пожалуйста, перепроверьте.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Сумма для отправки должно быть больше 0.</translation>
</message>
@@ -2005,10 +1861,6 @@ Address: %4
<translation>Сумма превысит Ваш баланс, если комиссия в размере %1 будет добавлена к транзакции</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Обнаружен дублирующийся адрес. Отправка на один и тот же адрес возможна только один раз за одну операцию отправки</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Не удалось создать транзакцию!</translation>
</message>
@@ -2017,14 +1869,10 @@ Address: %4
<translation>Транзакция была отклонена! Такое может произойти, если некоторые монеты уже были потрачены, например, если Вы используете одну копию бумажника (wallet.dat), а монеты были потрачены из другой копии, но не были отмечены как потраченные в этой.</translation>
</message>
<message>
- <source>A fee higher than %1 is considered an insanely high fee.</source>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation>Комиссия больше, чем %1, считается невероятно большой.</translation>
</message>
<message>
- <source>Estimated to begin confirmation within %1 block(s).</source>
- <translation>Начало подтверждения ожидается через %1 блок(ов).</translation>
- </message>
- <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Внимание: неверный адрес Bitcoin</translation>
</message>
@@ -2100,10 +1948,6 @@ Address: %4
<translation>Сообщение:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Это проверенный запрос платежа.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Введите метку для этого адреса, чтобы добавить его в список использованных</translation>
</message>
@@ -2112,10 +1956,6 @@ Address: %4
<translation>К bitcoin: URI было прикреплено сообщение, которое будет сохранено вместе с транзакцией для вашего сведения. Заметьте: сообщение не будет отправлено через сеть Bitcoin.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Это непроверенный запрос платежа.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Получатель:</translation>
</message>
@@ -2146,10 +1986,6 @@ Address: %4
<translation>&amp;Подписать сообщение</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Вы можете подписывать сообщения своими адресами, чтобы доказать владение ими. Будьте осторожны, не подписывайте что-то неопределённое, так как фишинговые атаки могут обманным путём заставить вас подписать нежелательные сообщения. Подписывайте только те сообщения, с которыми вы согласны вплоть до мелочей.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>Адрес Bitcoin, которым подписать сообщение</translation>
</message>
@@ -2202,10 +2038,6 @@ Address: %4
<translation>&amp;Проверить сообщение</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Введите ниже адрес для подписи, сообщение (убедитесь, что переводы строк, пробелы, табы и т.п. в точности скопированы) и подпись, чтобы проверить сообщение. Убедитесь, что не скопировали лишнего в подпись, по сравнению с самим подписываемым сообщением, чтобы не стать жертвой атаки "man-in-the-middle".</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>Адрес Bitcoin, которым было подписано сообщение</translation>
</message>
@@ -2322,10 +2154,6 @@ Address: %4
<source>Status</source>
<translation>Статус</translation>
</message>
- <message numerus="yes">
- <source>, broadcast through %n node(s)</source>
- <translation><numerusform>, разослано через %n узел</numerusform><numerusform>, разослано через %n узла</numerusform><numerusform>, разослано через %n узлов</numerusform></translation>
- </message>
<message>
<source>Date</source>
<translation>Дата</translation>
@@ -2362,10 +2190,6 @@ Address: %4
<source>Credit</source>
<translation>Кредит</translation>
</message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation><numerusform>будет доступно через %n блок</numerusform><numerusform>будет доступно через %n блока</numerusform><numerusform>будет доступно через %n блоков</numerusform></translation>
- </message>
<message>
<source>not accepted</source>
<translation>не принято</translation>
@@ -2438,10 +2262,6 @@ Address: %4
<source>, has not been successfully broadcast yet</source>
<translation>, ещё не было успешно разослано</translation>
</message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Открыто для ещё %n блока</numerusform><numerusform>Открыто для ещё %n блоков</numerusform><numerusform>Открыто для ещё %n блоков</numerusform></translation>
- </message>
<message>
<source>unknown</source>
<translation>неизвестно</translation>
@@ -2469,17 +2289,9 @@ Address: %4
<translation>Тип</translation>
</message>
<message>
- <source>Address</source>
- <translation>Адрес</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Незрелый (%1 подтверждений, будет доступен после %2)</translation>
</message>
- <message numerus="yes">
- <source>Open for %n more block(s)</source>
- <translation><numerusform>Открыто для ещё %n блока</numerusform><numerusform>Открыто для ещё %n блоков</numerusform><numerusform>Открыто для ещё %n блоков</numerusform></translation>
- </message>
<message>
<source>Open until %1</source>
<translation>Открыто до %1</translation>
@@ -2501,6 +2313,10 @@ Address: %4
<translation>Нет активных соединений с сетью</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Метка</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Неподтверждено</translation>
</message>
@@ -2553,10 +2369,6 @@ Address: %4
<translation>Использовался ли в транзакции адрес для наблюдения.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Адрес назначения транзакции.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Сумма, добавленная, или снятая с баланса.</translation>
</message>
@@ -2795,30 +2607,6 @@ Address: %4
<translation>Принимать подключения извне (по умолчанию: 1, если не используется -proxy или -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, вы должны установить опцию rpcpassword в конфигурационном файле:
- %s
-Рекомендуется использовать следующий случайный пароль:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(вам не нужно запоминать этот пароль)
-Имя и пароль ДОЛЖНЫ различаться.
-Если файл не существует, создайте его и установите права доступа только для владельца, только для чтения.
-Также рекомендуется включить alertnotify для оповещения о проблемах;
-Например: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Привязаться к указанному адресу и всегда прослушивать только его. Используйте [хост]:порт для IPv6</translation>
</message>
@@ -2835,14 +2623,6 @@ rpcpassword=%s
<translation>Войти в режим тестирования на регрессии, в котором используется специальная цепь, где блоки находятся мгновенно.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Ошибка: транзакция была отклонена! Это могло произойти в случае, если некоторые монеты в вашем бумажнике уже были потрачены, например, если вы используете копию wallet.dat, и монеты были использованы в копии, но не отмечены как потраченные здесь.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Ошибка: эта транзакция требует комиссию как минимум %s из-за суммы, сложности или использования недавно полученных средств!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Выполнить команду, когда меняется транзакция в бумажнике (%s в команде заменяется на TxID)</translation>
</message>
@@ -2919,10 +2699,6 @@ rpcpassword=%s
<translation>Параметры отладки/тестирования:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Определить свой IP (по умолчанию: 1 при прослушивании и если не используется -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Не загружать бумажник и запретить обращения к нему через RPC</translation>
</message>
@@ -2955,10 +2731,6 @@ rpcpassword=%s
<translation>Ошибка: мало места на диске!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Ошибка: бумажник заблокирован, невозможно создать транзакцию!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Не удалось начать прослушивание на порту. Используйте -listen=0 если вас это устраивает.</translation>
</message>
@@ -2987,10 +2759,6 @@ rpcpassword=%s
<translation>Соединяться только по сети &lt;net&gt; (ipv4, ipv6 или onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Перестроить индекс цепи блоков из текущих файлов blk000??.dat</translation>
- </message>
- <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>Установить размер кэша БД в мегабайтах(от %d до %d, по умолчанию: %d)</translation>
</message>
@@ -3055,10 +2823,6 @@ rpcpassword=%s
<translation>Не удалось установить блокировку на каталог данных %s. Возможно, Bitcoin Core уже запущен.</translation>
</message>
<message>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
- <translation>Ограничить скорость передачи бесплатных транзакций до &lt;n&gt;*1000 байт в минуту (по умолчанию: %u)</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Создавать новые файлы с системными правами по умолчанию вместо umask 077 (эффективно только при отключенном бумажнике)</translation>
</message>
@@ -3083,6 +2847,14 @@ rpcpassword=%s
<translation>Комиссии (в BTC/Кб) меньшие этого значения считаются нулевыми для создания транзакции (по умолчанию: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Если paytxfee не задан, включить достаточную комиссию для подтверждения транзакции в среднем за n блоков (по умолчанию: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Неверное значение для -maxtxfee=&lt;amount&gt;: '%s' (минимальная комиссия трансляции %s для предотвращения зависания транзакций)</translation>
+ </message>
+ <message>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation>Наибольший размер данных в носителе данных транзакций, которые мы передаем и генерируем (по умолчанию: %u)</translation>
</message>
@@ -3103,6 +2875,34 @@ rpcpassword=%s
<translation>Этот продукт включает ПО, разработанное OpenSSL Project для использования в OpenSSL Toolkit &lt;https://www.openssl.org/&gt; и криптографическое ПО, написанное Eric Young и ПО для работы с UPnP, написанное Thomas Bernard.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>Для использования bitcoind или опции bitcoin-qt -server, вы должны установить опцию rpcpassword в конфигурационном файле:
+ %s
+Рекомендуется использовать следующий случайный пароль:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(вам не нужно запоминать этот пароль)
+Имя и пароль ДОЛЖНЫ различаться.
+Если файл не существует, создайте его и установите право доступа только для чтения только для владельца.
+Также рекомендуется включить alertnotify для оповещения о проблемах;
+Например: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Внимание: установлено очень большое значение -paytxfee. Такие большие комиссии могут быть уплачены в отдельной транзакции.</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Внимание: убедитесь, что дата и время на Вашем компьютере выставлены верно. Если Ваши часы идут неправильно, Bitcoin Core будет работать некорректно.</translation>
</message>
@@ -3111,10 +2911,18 @@ rpcpassword=%s
<translation>Участники из белого списка не могуть быть забанены за DoS, и их транзакции всегда транслируются, даже если они уже содержатся в памяти. Полезно, например, для шлюза.</translation>
</message>
<message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Принимать публичные REST-запросы (по умолчанию: %u)</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>Не удаётся разрешить адрес в параметре -whitebind: '%s'</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Выбрать каталог данных при запуске (по умолчанию: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Подключаться через SOCKS5 прокси</translation>
</message>
@@ -3131,6 +2939,10 @@ rpcpassword=%s
<translation>Ошибка загрузки wallet.dat: бумажник требует более новую версию Bitcoin Core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Ошибка чтения базы данных, работа завершается.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Ошибка: обнаружен неподдерживаемый параметр -tor, используйте -onion.</translation>
</message>
@@ -3147,6 +2959,10 @@ rpcpassword=%s
<translation>Не удалось проверить чистоту. Bitcoin Core выключается.</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Неверное значение -maxtxfee=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Неверная сумма в параметре -minrelaytxfee=&lt;кол-во&gt;: '%s'</translation>
</message>
@@ -3163,10 +2979,6 @@ rpcpassword=%s
<translation>Указана неверная сетевая маска в -whitelist: '%s'</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Хранить максимум &lt;n&gt; несоединённых блоков в памяти (по умолчанию: %u)</translation>
- </message>
- <message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>Держать в памяти до &lt;n&gt; несвязных транзакций (по умолчанию: %u)</translation>
</message>
@@ -3179,10 +2991,6 @@ rpcpassword=%s
<translation>Параметры трансляции узла:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Печатать блок при запуске, если он найден в индексе блоков</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Параметры RPC SSL: (см. Bitcoin вики для инструкций по настройке SSL)</translation>
</message>
@@ -3191,6 +2999,10 @@ rpcpassword=%s
<translation>Параметры сервера RPC:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>Поддержка RPC постоянных HTTP подключений (по умолчанию: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Случайно отбрасывать 1 из каждых &lt;n&gt; сетевых сообщений</translation>
</message>
@@ -3207,10 +3019,22 @@ rpcpassword=%s
<translation>Осуществить транзакцию бесплатно, если возможно (по умолчанию: %u)</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Указать корневые SSL-сертификаты для запроса платежа (по умолчанию: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Выберите язык, например "de_DE" (по умолчанию: как в системе)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Показать все отладочные параметры (использование: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Показывать сплэш при запуске (по умолчанию: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Сжимать файл debug.log при запуске клиента (по умолчанию: 1, если нет -debug)</translation>
</message>
@@ -3219,6 +3043,10 @@ rpcpassword=%s
<translation>Не удалось подписать транзакцию</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Запускать свёрнутым</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Это экспериментальное ПО.</translation>
</message>
@@ -3231,6 +3059,10 @@ rpcpassword=%s
<translation>Сумма транзакции должна быть положительна</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Транзакция слишком большая для правил комиссии.</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Транзакция слишком большая</translation>
</message>
@@ -3255,10 +3087,6 @@ rpcpassword=%s
<translation>Внимание</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Внимание: эта версия устарела, требуется обновление!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Внимание: неподдерживаемый аргумент -benchmark проигнорирован, используйте -debug=bench.</translation>
</message>
@@ -3327,10 +3155,6 @@ rpcpassword=%s
<translation>Насколько тщательна проверка контрольных блоков -checkblocks (0-4, по умолчанию: %u)</translation>
</message>
<message>
- <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
- <translation>Если paytxfee не задан, включить достаточную комиссию для подтверждения транзакции в среднем за n блоков (по умолчанию: %u)</translation>
- </message>
- <message>
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
<translation>Записывать в лог приоритет транзакции и комиссию на килобайт во время добычи блоков (по умолчанию: %u)</translation>
</message>
@@ -3423,10 +3247,6 @@ rpcpassword=%s
<translation>Дописывать отметки времени к отладочному выводу (по умолчанию: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Печатать дерево блоков при запуске (по умолчанию: %u)</translation>
- </message>
- <message>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation>Транслировать и генерировать транзакции носителей данных (по умолчанию: %u)</translation>
</message>
@@ -3499,10 +3319,6 @@ rpcpassword=%s
<translation>Неверная сумма в параметре -paytxfee=&lt;кол-во&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Неверная сумма</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Недостаточно монет</translation>
</message>
@@ -3535,10 +3351,6 @@ rpcpassword=%s
<translation>Загрузка завершена</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Чтобы использовать опцию %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Ошибка</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sah.ts b/src/qt/locale/bitcoin_sah.ts
index 84b973bf92..6cc17f480a 100644
--- a/src/qt/locale/bitcoin_sah.ts
+++ b/src/qt/locale/bitcoin_sah.ts
@@ -1,10 +1,6 @@
-<TS language="sah" version="2.0">
+<TS language="sah" version="2.1">
<context>
<name>AddressBookPage</name>
- <message>
- <source>Double-click to edit address or label</source>
- <translation>Аадырыскын уларытаргар иккитэ баттаа</translation>
- </message>
</context>
<context>
<name>AddressTableModel</name>
diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts
index fe7c62cd60..8e7d38be00 100644
--- a/src/qt/locale/bitcoin_sk.ts
+++ b/src/qt/locale/bitcoin_sk.ts
@@ -1,9 +1,9 @@
-<TS language="sk" version="2.0">
+<TS language="sk" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dvojklikom editovať adresu alebo popis</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Kliknutím pravým tlačidlom upravte adresu alebo popis</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>Zmena hesla</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Zadajte staré a nové heslo k peňaženke.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Potvrďte šifrovanie peňaženky</translation>
</message>
@@ -188,10 +184,6 @@
<translation>Zadajte nové heslo k peňaženke.&lt;br/&gt;Prosím použite heslo s dĺžkou aspoň &lt;b&gt;10 alebo viac náhodných znakov&lt;/b&gt;, alebo &lt;b&gt;8 alebo viac slov&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin sa teraz ukončí pre dokončenie procesu šifrovania. Pamätaj že šifrovanie peňaženky Ťa nemôže úplne ochrániť pred kráďežou bitcoinov pomocou škodlivého software.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Šifrovanie peňaženky zlyhalo</translation>
</message>
@@ -284,11 +276,11 @@
</message>
<message>
<source>&amp;Sending addresses...</source>
- <translation>Posielajúca adresa ...</translation>
+ <translation>&amp;Odosielajúce adresy ...</translation>
</message>
<message>
<source>&amp;Receiving addresses...</source>
- <translation>Prijímajúca adresa...</translation>
+ <translation>&amp;Prijímajúce adresy...</translation>
</message>
<message>
<source>Open &amp;URI...</source>
@@ -311,10 +303,6 @@
<translation>Poslať bitcoins na adresu</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Upraviť možnosti nastavenia pre bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Zálohovať peňaženku na iné miesto</translation>
</message>
@@ -422,34 +410,14 @@
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
<translation>Zobraziť pomocnú správu od Bitcoin Jadra pre získanie zoznamu dostupných možností príkazového riadku</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n aktívne pripojenie do siete Bitcoin</numerusform><numerusform>%n aktívne pripojenia do siete Bitcoin</numerusform><numerusform>%n aktívnych pripojení do siete Bitcoin</numerusform></translation>
- </message>
<message>
<source>No block source available...</source>
<translation>Nedostupný zdroj blokov...</translation>
</message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n hodina</numerusform><numerusform>%n hodiny</numerusform><numerusform>%n hodín</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n deň</numerusform><numerusform>%n dni</numerusform><numerusform>%n dní</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n týždeň</numerusform><numerusform>%n týždne</numerusform><numerusform>%n týždňov</numerusform></translation>
- </message>
<message>
<source>%1 and %2</source>
<translation> %1 a %2</translation>
</message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation><numerusform>%n rok</numerusform><numerusform>%n roky</numerusform><numerusform>%n rokov</numerusform></translation>
- </message>
<message>
<source>%1 behind</source>
<translation>%1 pozadu</translation>
@@ -460,7 +428,7 @@
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation>Transakcie potom nebudú ešte viditeľné.</translation>
+ <translation>Transakcie po tomto čase ešte nebudú viditeľné.</translation>
</message>
<message>
<source>Error</source>
@@ -491,17 +459,6 @@
<translation>Prijaté transakcie</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Dátum: %1
-Suma: %2
-Typ: %3
-Adresa: %4</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Peňaženka je &lt;b&gt;zašifrovaná&lt;/b&gt; a momentálne &lt;b&gt;odomknutá&lt;/b&gt;</translation>
</message>
@@ -520,6 +477,10 @@ Adresa: %4</translation>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Výber mince</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>Množstvo:</translation>
</message>
@@ -540,6 +501,10 @@ Adresa: %4</translation>
<translation>Poplatok:</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>Prach:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation>Po poplatku:</translation>
</message>
@@ -564,6 +529,14 @@ Adresa: %4</translation>
<translation>Suma</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>Prijaté s označením</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>Prijaté s adresou</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>Dátum</translation>
</message>
@@ -624,6 +597,10 @@ Adresa: %4</translation>
<translation>Kopírovať prioritu</translation>
</message>
<message>
+ <source>Copy dust</source>
+ <translation>Kopírovať prach</translation>
+ </message>
+ <message>
<source>Copy change</source>
<translation>Kopírovať zmenu</translation>
</message>
@@ -672,6 +649,10 @@ Adresa: %4</translation>
<translation>žiadne</translation>
</message>
<message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation>Môže sa líšiť o +/- %1 satoshi pre každý vstup</translation>
+ </message>
+ <message>
<source>yes</source>
<translation>áno</translation>
</message>
@@ -680,10 +661,6 @@ Adresa: %4</translation>
<translation>nie</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Tento popis zčervená ak veľkosť transakcie presiahne 1000 bytov.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>To znamená že požadovaný poplatok je aspoň %1 za kB.</translation>
</message>
@@ -696,14 +673,6 @@ Adresa: %4</translation>
<translation>Transakcie s vysokou prioritou sa pravdepodobnejsie dostanú do bloku.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Tento popis zčervenie ak je priorita nižčia ako "medium".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Tento popis zčervenie ak ktorýkoľvek príjemca dostane sumu menšiu ako %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(bez popisu)</translation>
</message>
@@ -824,30 +793,6 @@ Adresa: %4</translation>
<source>command-line options</source>
<translation>voľby príkazového riadku</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI možnosti</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Nastaviť jazyk, napríklad "sk_SK" (predvolené: systémový)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Spustiť minimalizované</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Nastaviť koreňový certifikát pre výzvy na platbu (prednastavené: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Zobraziť splash screen pri spustení (predvolené: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Zvoľte dátový priečinok pri štarte (prednastavené: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -918,16 +863,8 @@ Adresa: %4</translation>
<translation>&amp;Hlavné</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Automaticky spustiť Bitcoin po zapnutí počítača</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Spustiť Bitcoin pri spustení systému správy okien</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
- <translation>Veľkosť vyrovnávacej pamäti databázy</translation>
+ <translation>Veľkosť vyrovnávacej pamäti &amp;databázy</translation>
</message>
<message>
<source>MB</source>
@@ -935,7 +872,15 @@ Adresa: %4</translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation>Počet skript overujucich vlákien</translation>
+ <translation>Počet &amp;vlákien overujúcich skript</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside</source>
+ <translation>Prijať spojenia zvonku</translation>
+ </message>
+ <message>
+ <source>Allow incoming connections</source>
+ <translation>Povoliť prichádzajúce spojenia</translation>
</message>
<message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
@@ -979,7 +924,7 @@ Adresa: %4</translation>
</message>
<message>
<source>Enable coin &amp;control features</source>
- <translation>Povoliť možnosti coin control</translation>
+ <translation>Povoliť možnosti "&amp;coin control"</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>
@@ -998,6 +943,14 @@ Adresa: %4</translation>
<translation>Mapovať port pomocou &amp;UPnP</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>Pripojiť do siete Bitcoin cez proxy server SOCKS5.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>&amp;Pripojiť cez proxy server SOCKS5 (predvolený proxy).</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>Proxy &amp;IP:</translation>
</message>
@@ -1022,10 +975,6 @@ Adresa: %4</translation>
<translation>Zobraziť len ikonu na lište po minimalizovaní okna.</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 Quit in the menu.</source>
- <translation>Minimalizovat namiesto ukončenia aplikácie keď sa okno zavrie. Keď je zvolená táto možnosť, aplikácia sa zavrie len po zvolení Ukončiť v menu.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimalizovať pri zavretí</translation>
</message>
@@ -1038,10 +987,6 @@ Adresa: %4</translation>
<translation>Jazyk užívateľského rozhrania:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Tu sa dá nastaviť jazyk užívateľského rozhrania. Toto nastavenie bude účinné po reštartovaní Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Zobrazovať hodnoty v jednotkách:</translation>
</message>
@@ -1078,10 +1023,6 @@ Adresa: %4</translation>
<translation>Reštart klienta potrebný pre aktivovanie zmien.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Klient bude vypnutý, chcete pokračovať?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Táto zmena by vyžadovala reštart klienta.</translation>
</message>
@@ -1098,7 +1039,7 @@ Adresa: %4</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>Zobrazené informácie môžu byť neaktuápne. Vaša peňaženka sa automaticky synchronizuje so sieťou Bitcoin po nadviazaní spojenia ale tento proces ešte nieje ukončený.</translation>
+ <translation>Zobrazené informácie môžu byť neaktuálne. Vaša peňaženka sa automaticky synchronizuje so sieťou Bitcoin po nadviazaní spojenia, ale tento proces ešte nie je ukončený.</translation>
</message>
<message>
<source>Available:</source>
@@ -1110,7 +1051,7 @@ Adresa: %4</translation>
</message>
<message>
<source>Pending:</source>
- <translation>Čakajúce potvrdenie</translation>
+ <translation>Čakajúce potvrdenie:</translation>
</message>
<message>
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
@@ -1125,6 +1066,10 @@ Adresa: %4</translation>
<translation>Vytvorený zostatok ktorý ešte nedosiahol zrelosť</translation>
</message>
<message>
+ <source>Balances</source>
+ <translation>Stav účtu</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation>Celkovo:</translation>
</message>
@@ -1133,10 +1078,10 @@ Adresa: %4</translation>
<translation>Váš súčasný celkový zostatok</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>nesynchronizované</translation>
+ <source>Recent transactions</source>
+ <translation>Nedávne transakcie</translation>
</message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -1194,7 +1139,15 @@ Adresa: %4</translation>
</context>
<context>
<name>PeerTableModel</name>
- </context>
+ <message>
+ <source>User Agent</source>
+ <translation>Aplikácia</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Čas odozvy</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
@@ -1202,6 +1155,10 @@ Adresa: %4</translation>
<translation>Suma</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation>Zadajte bitcoin adresu (napr. %1)</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation>%1 h</translation>
</message>
@@ -1213,7 +1170,11 @@ Adresa: %4</translation>
<source>N/A</source>
<translation>nie je k dispozícii</translation>
</message>
- </context>
+ <message>
+ <source>%1 ms</source>
+ <translation>%1 ms</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1264,6 +1225,10 @@ Adresa: %4</translation>
<translation>Používa OpenSSL verziu</translation>
</message>
<message>
+ <source>Using BerkeleyDB version</source>
+ <translation>Používa BerkeleyDB verziu</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation>Čas spustenia</translation>
</message>
@@ -1288,6 +1253,54 @@ Adresa: %4</translation>
<translation>Aktuálny počet blokov</translation>
</message>
<message>
+ <source>Received</source>
+ <translation>Prijaté</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation>Odoslané</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>Vyberte počítač pre zobrazenie podrobností.</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <translation>Smer</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation>Verzia</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation>Aplikácia</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation>Služby</translation>
+ </message>
+ <message>
+ <source>Starting Height</source>
+ <translation>Počiatočná výška</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation>Dĺžka spojenia</translation>
+ </message>
+ <message>
+ <source>Bytes Sent</source>
+ <translation>Odoslaných bajtov</translation>
+ </message>
+ <message>
+ <source>Bytes Received</source>
+ <translation>Prijatých bajtov</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation>Čas odozvy</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Čas posledného bloku</translation>
</message>
@@ -1301,7 +1314,7 @@ Adresa: %4</translation>
</message>
<message>
<source>&amp;Network Traffic</source>
- <translation>Sieťová prevádzka</translation>
+ <translation>&amp;Sieťová prevádzka</translation>
</message>
<message>
<source>&amp;Clear</source>
@@ -1328,20 +1341,12 @@ Adresa: %4</translation>
<translation>Súbor záznamu ladenia</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Otvoriť Bitcoin log súbor pre ladenie z aktuálneho dátového adresára. Toto môže trvať niekoľko sekúnd pre veľké súbory.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Vymazať konzolu</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Vitajte v Bitcoin RPC konzole. Baník, pyčo!</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
- <translation>Použi šipky hore a dolu pre navigáciu históriou a &lt;b&gt;Ctrl-L&lt;/b&gt; pre vyčistenie obrazovky.</translation>
+ <translation>Použi šípky hore a dolu pre navigáciu históriou a &lt;b&gt;Ctrl-L&lt;/b&gt; pre vyčistenie obrazovky.</translation>
</message>
<message>
<source>Type &lt;b&gt;help&lt;/b&gt; for an overview of available commands.</source>
@@ -1363,7 +1368,19 @@ Adresa: %4</translation>
<source>%1 GB</source>
<translation>%1 GB</translation>
</message>
- </context>
+ <message>
+ <source>Inbound</source>
+ <translation>Prichádzajúce</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <translation>Odchádzajúce</translation>
+ </message>
+ <message>
+ <source>Fetching...</source>
+ <translation>Získava sa...</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
@@ -1592,6 +1609,66 @@ Adresa: %4</translation>
<translation>Vlastná adresa zmeny</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>Poplatok za transakciu:</translation>
+ </message>
+ <message>
+ <source>collapse fee-settings</source>
+ <translation>zbaliť nastavenia poplatkov</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>za kilobajt</translation>
+ </message>
+ <message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>Ak je poplatok nastavený na 1000 satoshi a transakcia je veľká len 250 bajtov, potom "za kilobajt" zaplatí poplatok 250 satoshi, ale "spolu aspoň" zaplatí 1000 satoshi. Pre transakcie väčšie ako kilobajt platia oba spôsoby za každý kilobajt.</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>spolu aspoň</translation>
+ </message>
+ <message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>Zaplatenie len minimálneho poplatku je v poriadku, pokiaľ existuje menej transakcií ako miesta v blokoch. Uvedomte si však, že ak bude vyšší dopyt po transakciách ako dokáže sieť spracovať, môže byť vaša transakcia odsúvaná a nepotvrdená donekonečna.</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(prečítajte si nápovedu pod kurzorom)</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>Odporúčaný:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>Vlastný:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(Automatický poplatok ešte nebol aktivovaný. Toto zvyčajne trvá niekoľko blokov...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>Čas potvrdenia:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>normálne</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>rýchle</translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>Poslať ako transakciu bez poplatku, ak je to možné</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(potvrdenie môže trvať dlhšie)</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Poslať viacerým príjemcom naraz</translation>
</message>
@@ -1604,6 +1681,10 @@ Adresa: %4</translation>
<translation>Vyčistiť všetky polia formulára.</translation>
</message>
<message>
+ <source>Dust:</source>
+ <translation>Prach:</translation>
+ </message>
+ <message>
<source>Clear &amp;All</source>
<translation>Zmazať &amp;všetko</translation>
</message>
@@ -1664,10 +1745,6 @@ Adresa: %4</translation>
<translation>alebo</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Adresa príjemcu je neplatná, prosím, overte ju.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Suma na úhradu musí byť väčšia ako 0.</translation>
</message>
@@ -1680,10 +1757,6 @@ Adresa: %4</translation>
<translation>Suma celkom prevyšuje Váš zostatok ak sú započítané %1 transakčné poplatky.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Duplikát adresy objavený, je možné poslať na každú adresu len raz v jednej odchádzajúcej transakcii.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Vytvorenie transakcie zlyhalo!</translation>
</message>
@@ -1692,6 +1765,10 @@ Adresa: %4</translation>
<translation>Transakcia bola zamietnutá! Toto sa môže stať ak niektoré coins vo vašej peňaženke už boli minuté, ako keď použijete kópiu wallet.dat a coins boli minuté z kópie ale neoznačené ako minuté tu.</translation>
</message>
<message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>Zaplatiť minimálny poplatok %1</translation>
+ </message>
+ <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Varovanie: Nesprávna Bitcoin adresa</translation>
</message>
@@ -1704,6 +1781,10 @@ Adresa: %4</translation>
<translation>Varovanie: Neznáma adresa pre výdavok</translation>
</message>
<message>
+ <source>Copy dust</source>
+ <translation>Kopírovať prach</translation>
+ </message>
+ <message>
<source>Are you sure you want to send?</source>
<translation>Určite to chcete odoslať?</translation>
</message>
@@ -1759,10 +1840,6 @@ Adresa: %4</translation>
<translation>Správa:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Toto je overená výzva k platbe.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Vložte popis pre túto adresu aby sa uložila do zoznamu použitých adries</translation>
</message>
@@ -1771,10 +1848,6 @@ Adresa: %4</translation>
<translation>Správa ktorá bola pripojená k bitcoin: URI a ktorá bude uložená s transakcou pre Vaše potreby. Poznámka: Táto správa nebude poslaná cez sieť Bitcoin.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Toto je neoverená výzva k platbe.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Platba pre:</translation>
</message>
@@ -1805,10 +1878,6 @@ Adresa: %4</translation>
<translation>&amp;Podpísať Správu</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Môžete podpísať správy svojou adresou a dokázať, že ju vlastníte. Buďte opatrní a podpíšte len prehlásenia s ktorými plne súhlasíte, nakoľko útoky typu "phishing" Vás môžu lákať k ich podpísaniu.</translation>
- </message>
- <message>
<source>Choose previously used address</source>
<translation>Vybrať predtým použitú adresu</translation>
</message>
@@ -1857,10 +1926,6 @@ Adresa: %4</translation>
<translation>Overiť správu...</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Vložte podpisovaciu adresu, správu (uistite sa, že kopírujete ukončenia riadkov, medzery, odrážky, atď. presne) a podpis pod to na overenie adresy. Buďte opatrní a nečítajte ako podpísané viac než je v samotnej podpísanej správe a môžete sa tak vyhnúť podvodu mitm útokom.</translation>
- </message>
- <message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
<translation>Overím správy sa uistiť že bola podpísaná označenou Bitcoin adresou</translation>
</message>
@@ -2096,10 +2161,6 @@ Adresa: %4</translation>
<translation>Typ</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresa</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Nezrelé (%1 potvrdení, bude k dispozícii po %2)</translation>
</message>
@@ -2124,6 +2185,10 @@ Adresa: %4</translation>
<translation>Offline</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Popis</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Nepotvrdené</translation>
</message>
@@ -2172,10 +2237,6 @@ Adresa: %4</translation>
<translation>Typ transakcie.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Cieľová adresa transakcie.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Suma pridaná alebo odobraná k zostatku.</translation>
</message>
@@ -2383,7 +2444,7 @@ Adresa: %4</translation>
</message>
<message>
<source>Connect to a node to retrieve peer addresses, and disconnect</source>
- <translation>Pripojiť sa k nóde, získať adresy ďaľších počítačov v sieti a odpojit sa.</translation>
+ <translation>Pripojiť sa k uzlu, získať adresy ďalších počítačov v sieti a odpojiť sa</translation>
</message>
<message>
<source>Specify your own public address</source>
@@ -2406,30 +2467,6 @@ Adresa: %4</translation>
<translation>Prijať spojenia zvonku (predvolené: 1 ak žiadne -proxy alebo -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, musíte nastaviť rpcpassword heslo v súbore nastavení:
-%s
-Odporúča sa používať nasledujúce náhodné heslo:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(nemusíte si pamätať toto heslo)
-Užívateľské meno a heslo NESMÚ byť rovnaké.
-Ak súbor neexistuje, vytvorte ho s prístupovým právom owner-readable-only čitateľné len pre majiteľa.
-Tiež sa odporúča nastaviť alertnotify aby ste boli upozorňovaní na problémy;
-napríklad: alertnotify=echo %%s | mail -s "Bitcoin Výstraha" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Spojiť s danou adresou a vždy na nej počúvať. Použite zápis [host]:port pre IPv6</translation>
</message>
@@ -2438,14 +2475,6 @@ napríklad: alertnotify=echo %%s | mail -s "Bitcoin Výstraha" admin@foo.com
<translation>Vojsť do režimu regresného testovania, ktorý používa špeciálnu reťaz v ktorej môžu byť bloky v okamihu vyriešené.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Transakcia bola zamietnutá! Toto sa môže stať ak niektoré coins vo vašej peňaženke už boli minuté, ako keď použijete kópiu wallet.dat a coins boli minuté z kópie ale neoznačené ako minuté tu.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Chyba: Táto transakcia vyžaduje transakčný poplatok aspoň %s kvôli svojej sume, komplexite alebo použitiu nedávno prijatých prostriedkov.</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Vykonaj príkaz keď sa zmení transakcia peňaženky (%s v príkaze je nahradená TxID)</translation>
</message>
@@ -2477,7 +2506,7 @@ The network does not appear to fully agree! Some miners appear to be experiencin
</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>Varovanie: Zjavne sa úplne nezhodujeme s našimi peer-mi! Možno potrebujete prejsť na novšiu verziu alebo ostatné nódy potrebujú vyššiu verziu.</translation>
+ <translation>Varovanie: Zjavne sa úplne nezhodujeme s našimi peer-mi! Možno potrebujete prejsť na novšiu verziu alebo ostatné uzly potrebujú vyššiu verziu.</translation>
</message>
<message>
<source>Warning: error reading wallet.dat! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
@@ -2520,10 +2549,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Možnosti ladenia/testovania:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Zisti vlastnú IP adresu (predvolené: 1 pri počúvaní/listening a žiadnej -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Nenahrat peňaženku a zablokovať volania RPC.</translation>
</message>
@@ -2552,10 +2577,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Chyba: Málo miesta na disku!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Chyba: Peňaženka je zamknutá, nemôžem vytvoriť transakciu!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Chyba počúvania na ktoromkoľvek porte. Použi -listen=0 ak toto chcete.</translation>
</message>
@@ -2580,12 +2601,8 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Nedostatok kľúčových slov súboru.</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Znovu vytvoriť zoznam blokov zo súčasných blk000??.dat súborov</translation>
- </message>
- <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
- <translation>Nastaviť veľkosť pomocnej pamäti databázy v megabajtoch (%d na %d, prednatavené: %d)</translation>
+ <translation>Nastaviť veľkosť pomocnej pamäti databázy v megabajtoch (%d do %d, prednastavené: %d)</translation>
</message>
<message>
<source>Set maximum block size in bytes (default: %d)</source>
@@ -2628,14 +2645,42 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Neviem uzamknúť data adresár %s. Jadro Bitcoin je pravdepodobne už spustené.</translation>
</message>
<message>
+ <source>Error: Listening for incoming connections failed (listen returned error %s)</source>
+ <translation>Chyba: Počúvanie prichádzajúcich spojení zlyhalo (vrátená chyba je %s)</translation>
+ </message>
+ <message>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
- <translation>Vykonať príkaz keď po prijatí patričné varovanie alebo vidíme veľmi dlhé rozdvojenie siete (%s v cmd je nahradené správou)</translation>
+ <translation>Vykonať príkaz po prijatí patričného varovania alebo uvidíme veľmi dlhé rozdvojenie siete (%s v cmd je nahradené správou)</translation>
+ </message>
+ <message>
+ <source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source>
+ <translation>Poplatky (v BTC/Kb) nižšie ako toľkoto sa považujú za nulové pri postupovaní transakcií (predvolené: %s)</translation>
+ </message>
+ <message>
+ <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>Poplatky (v BTC/Kb) nižšie ako toľkoto sa považujú za nulové pri vytváraní transakcií (predvolené: %s)</translation>
</message>
<message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation>Nastaviť najväčšiu veľkosť vysoká-dôležitosť/nízke-poplatky transakcií v bajtoch (prednastavené: %d)</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Zvoľte dátový priečinok pri štarte (prednastavené: 0)</translation>
+ </message>
+ <message>
+ <source>Connect through SOCKS5 proxy</source>
+ <translation>Pripojiť cez proxy server SOCKS5</translation>
+ </message>
+ <message>
+ <source>Error loading wallet.dat: Wallet requires newer version of Bitcoin Core</source>
+ <translation>Chyba pri čítaní wallet.dat: Peňaženka vyžaduje vyššiu verziu Jadra Bitcoin</translation>
+ </message>
+ <message>
+ <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
+ <translation>Poplatok (v BTC/kB), ktorý sa pridá k transakciám, ktoré odosielate (predvolený: %s)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Informácia</translation>
</message>
@@ -2648,10 +2693,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Neplatná suma pre -mintxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Vytlač blok pri spustení, ak nájdený v zozname blokov</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Možnosti RPC SSL: (Pozri v Bitcoin Wiki pokyny pre SSL nastavenie)</translation>
</message>
@@ -2672,10 +2713,26 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Odoslať trace/debug informácie na konzolu namiesto debug.info žurnálu</translation>
</message>
<message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>Poslať ako transakcie bez poplatku, ak je to možné (predvolené: %u)</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Nastaviť koreňový certifikát pre výzvy na platbu (prednastavené: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Nastaviť jazyk, napríklad "sk_SK" (predvolené: systémový)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Zobraziť všetky možnosti ladenia (použitie: --help --help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Zobraziť splash screen pri spustení (predvolené: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Zmenšiť debug.log pri spustení klienta (predvolené: 1 ak bez -debug)</translation>
</message>
@@ -2684,6 +2741,14 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Podpísanie správy zlyhalo</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Spustiť minimalizované</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation>Toto je experimentálny softvér.</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Suma transakcie príliš malá</translation>
</message>
@@ -2692,6 +2757,10 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Hodnoty transakcie musia byť väčšie ako nula (pozitívne)</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transakcia je príliš veľká pre aktuálne podmienky poplatkov</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Transakcia príliš veľká</translation>
</message>
@@ -2708,10 +2777,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Upozornenie</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Upozornenie: Táto verzia je zastaraná, vyžaduje sa aktualizácia!</translation>
- </message>
- <message>
<source>Zapping all transactions from wallet...</source>
<translation>Zmazať všetky transakcie z peňaženky...</translation>
</message>
@@ -2760,6 +2825,14 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Chyba načítania wallet.dat: Peňaženka je poškodená</translation>
</message>
<message>
+ <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
+ <translation>Zaznamenať prioritu transakcie a poplatok za kB pri ťažení blokov (predvolené: %u)</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
+ <translation>Použiť samostatný SOCKS5 proxy server na dosiahnutie počítačov cez skryté služby Tor (predvolené: %s)</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>Chyba načítania wallet.dat</translation>
</message>
@@ -2768,6 +2841,10 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Neplatná adresa proxy: '%s'</translation>
</message>
<message>
+ <source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
+ <translation>Udržiavať najviac &lt;n&gt; spojení s inými počítačmi (predvolené: %u)</translation>
+ </message>
+ <message>
<source>Unknown network specified in -onlynet: '%s'</source>
<translation>Neznáma sieť upresnená v -onlynet: '%s'</translation>
</message>
@@ -2784,10 +2861,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Neplatná suma pre -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Neplatná suma</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Nedostatok prostriedkov</translation>
</message>
@@ -2820,10 +2893,6 @@ The network does not appear to fully agree! Some miners appear to be experiencin
<translation>Dokončené načítavanie</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Použiť %s možnosť.</translation>
- </message>
- <message>
<source>Error</source>
<translation>Chyba</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sl_SI.ts b/src/qt/locale/bitcoin_sl_SI.ts
index 60fc4a93e5..abbdba3760 100644
--- a/src/qt/locale/bitcoin_sl_SI.ts
+++ b/src/qt/locale/bitcoin_sl_SI.ts
@@ -1,11 +1,7 @@
-<TS language="sl_SI" version="2.0">
+<TS language="sl_SI" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dvakrat klikni za urejanje naslovov ali oznak</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Ustvari nov naslov</translation>
</message>
@@ -152,10 +148,6 @@
<translation>Zamenjaj geslo</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Vnesite staro in novo geslo denarnice.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Potrdi šifriranje denarnice</translation>
</message>
@@ -176,10 +168,6 @@
<translation>Denarnica šifrirana</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin se bo zaprl, da bi dokončal proces šifriranja. Zapomnite si, da šifriranje vaše denarnice ne more popolnoma zaščititi pred krajami zlonamernih programov, ki bi lahko bili nameščeni na vašem računalniku.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Šifriranje denarnice spodletelo</translation>
</message>
@@ -295,10 +283,6 @@
<translation>Pošlji kovance na Bitcoin naslov</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Spremeni konfiguracijo nastavitev za Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Napravi varnostno kopijo denarnice na drugo lokacijo</translation>
</message>
@@ -386,30 +370,10 @@
<source>Open a bitcoin: URI or payment request</source>
<translation>Odpri Bitcoin: URI ali zahteva o plačilu</translation>
</message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network</source>
- <translation><numerusform>%n aktivna povezava v bitcoin omrežje</numerusform><numerusform>%n aktivni povezavi v bitcoin omrežje</numerusform><numerusform>%n aktivnih povezav v bitcoin omrežje</numerusform><numerusform>%n aktivnih povezav v bitcoin omrežje</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation><numerusform>%n ura</numerusform><numerusform>%n uri</numerusform><numerusform>%n ure</numerusform><numerusform>%n ura</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation><numerusform>%n dan</numerusform><numerusform>%n dneva</numerusform><numerusform>%n dnevi</numerusform><numerusform>%n dni</numerusform></translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation><numerusform>%n teden</numerusform><numerusform>%n tedna</numerusform><numerusform>%n tedni</numerusform><numerusform>%n tednov</numerusform></translation>
- </message>
<message>
<source>%1 and %2</source>
<translation>%1 in %2</translation>
</message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation><numerusform>%n leto</numerusform><numerusform>%n leti</numerusform><numerusform>%n leta</numerusform><numerusform>%n let</numerusform></translation>
- </message>
<message>
<source>%1 behind</source>
<translation>%1 odzadaj</translation>
@@ -447,18 +411,6 @@
<translation>Prilivi</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Datum: %1
-Količina: %2
-Vrsta: %3
-Naslov: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Denarnica je &lt;b&gt;šifrirana&lt;/b&gt; in trenutno &lt;b&gt;odklenjena&lt;/b&gt;</translation>
</message>
@@ -486,7 +438,7 @@ Naslov: %4
</message>
<message>
<source>Amount:</source>
- <translation>Količina:</translation>
+ <translation>Znesek:</translation>
</message>
<message>
<source>Priority:</source>
@@ -641,10 +593,6 @@ Naslov: %4
<translation>ne</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>V primeru, da je velikost transakcije večja od 1000 bitov, se ta oznaka se obarva rdeče.</translation>
- </message>
- <message>
<source>Can vary +/- 1 byte per input.</source>
<translation>Se lahko razlikuje +/- 1 byte na vnos.</translation>
</message>
@@ -653,10 +601,6 @@ Naslov: %4
<translation>Transakcije z višjo prioriteto imajo boljše možnosti za vključitev v blok.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Oznaka se obarva rdeče, kadar je prioriteta manjša od "srednje".</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(ni oznake)</translation>
</message>
@@ -773,30 +717,6 @@ Naslov: %4
<source>command-line options</source>
<translation>možnosti ukazne vrstice</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>možnosti uporabniškega vmesnika</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Nastavi jezik, npr. "sl_SI" (privzeto: jezikovna oznaka sistema)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Zaženi pomanjšano</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Nastavi korenske SSL certifikate za plačilni zahtevek (privzeto: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Ob zagonu prikaži uvodni zaslon (privzeto: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Ob zagonu izberi mapo za shranjevanje podatkov (privzeto: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -871,14 +791,6 @@ Naslov: %4
<translation>&amp;Glavno</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Po prijavi v sistem samodejno zaženite Bitcoin.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Zaženi Bitcoin ob prijavi v sistem</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Velikost lokalne zbirke &amp;podatkovne baze</translation>
</message>
@@ -951,10 +863,6 @@ Naslov: %4
<translation>&amp;Minimiraj na pladenj namesto na opravilno vrstico</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 Quit in the menu.</source>
- <translation>Minimiziraj namesto izhoda iz programa, ko je okno zaprto. Ko je ta opcija omogočena se bo aplikacija zaprla z izbiro opcije Zapri iz menija. </translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>&amp;Minimiziraj na ukaz zapri</translation>
</message>
@@ -967,10 +875,6 @@ Naslov: %4
<translation>Vmesnik uporabnika &amp;jezik:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Tukaj je mogoče nastaviti uporabniški vmesnik za jezike. Ta nastavitev bo prikazana šele, ko boste znova zagnali Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;</translation>
</message>
@@ -1025,11 +929,7 @@ Naslov: %4
<source>Your current total balance</source>
<translation>Vaše trenutno skupno stanje</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>iz sinhronizacije</translation>
- </message>
-</context>
+ </context>
<context>
<name>PaymentServer</name>
<message>
@@ -1091,7 +991,7 @@ Naslov: %4
<name>QRImageWidget</name>
<message>
<source>&amp;Save Image...</source>
- <translation>&amp;Shrani sliko...</translation>
+ <translation>&amp;Shrani sliko..</translation>
</message>
<message>
<source>&amp;Copy Image</source>
@@ -1209,10 +1109,6 @@ Naslov: %4
<translation>Počisti konzolo</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Dobrodošli na Bitcoin RPC konzoli.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Uporabi puščice za gor in dol za navigacijo po zgodovini in &lt;b&gt;Ctrl-L&lt;/b&gt; za izbris izpisa na ekranu.</translation>
</message>
@@ -1438,7 +1334,7 @@ Naslov: %4
</message>
<message>
<source>Clear &amp;All</source>
- <translation>Počisti &amp;vse</translation>
+ <translation>Počisti &amp;vse </translation>
</message>
<message>
<source>Balance:</source>
@@ -1493,10 +1389,6 @@ Naslov: %4
<translation>Količina presega vaše dobroimetje</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Najdena kopija naslova, možnost pošiljanja na vsakega izmed naslov le enkrat ob pošiljanju.</translation>
- </message>
- <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Opozorilo: Neveljaven Bitcoin naslov</translation>
</message>
@@ -1805,10 +1697,6 @@ Naslov: %4
<translation>Vrsta</translation>
</message>
<message>
- <source>Address</source>
- <translation>Naslov</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Odpri enoto %1</translation>
</message>
@@ -1825,6 +1713,10 @@ Naslov: %4
<translation>Generirano, toda ne sprejeto</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Oznaka</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Nepotrjeno</translation>
</message>
@@ -1865,10 +1757,6 @@ Naslov: %4
<translation>Vrsta transakcije.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Naslov prejemnika transakcije.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Količina odlita ali prilita dobroimetju.</translation>
</message>
@@ -2083,14 +1971,6 @@ Naslov: %4
<translation>Uporabi testno omrežje</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Napaka: Transakcija ni bila sprejeta! To se je morebiti zgodilo, ker so nekateri kovanci v vaši denarnici bili že porabljeni, na primer če ste uporabili kopijo wallet.dat in so tako kovanci bili porabljeni v kopiji, ostali pa označeni kot neporabljeni.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Napaka: Ta transakcija potrebuje povizijo, ki je najmanj %s zaradi svoje količine, kompliciranosti, ali zaradi uporabe prejetih sredstev.</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Izvedi ukaz, ko bo transakcija denarnice se spremenila (V cmd je bil TxID zamenjan za %s)</translation>
</message>
@@ -2119,14 +1999,14 @@ Naslov: %4
<translation>Opozorilo: Premalo prostora na disku!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Opozorilo: Denarnica je zaklenjena, ni mogoče opraviti transkacijo! </translation>
- </message>
- <message>
<source>Importing...</source>
<translation>Uvažam...</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Ob zagonu izberi mapo za shranjevanje podatkov (privzeto: 0)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Informacije</translation>
</message>
@@ -2135,10 +2015,26 @@ Naslov: %4
<translation>Pošlji sledilne/razhroščevalne informacije v konzolo namesto jih shraniti v debug.log datoteko</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Nastavi korenske SSL certifikate za plačilni zahtevek (privzeto: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Nastavi jezik, npr. "sl_SI" (privzeto: jezikovna oznaka sistema)</translation>
+ </message>
+ <message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Ob zagonu prikaži uvodni zaslon (privzeto: 1)</translation>
+ </message>
+ <message>
<source>Signing transaction failed</source>
<translation>Podpisovanje transakcije spodletelo</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Zaženi pomanjšano</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation>Količina transakcije je pramajhna</translation>
</message>
@@ -2159,10 +2055,6 @@ Naslov: %4
<translation>Opozorilo</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Opozorilo: ta različica je zastarela, potrebna je nadgradnja!</translation>
- </message>
- <message>
<source>wallet.dat corrupt, salvage failed</source>
<translation>wallet.dat poškodovana, neuspešna obnova</translation>
</message>
@@ -2227,10 +2119,6 @@ Naslov: %4
<translation>Neveljavna količina za -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Neveljavna količina</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Premalo sredstev</translation>
</message>
@@ -2263,10 +2151,6 @@ Naslov: %4
<translation>Nalaganje končano</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Za uporabo %s opcije</translation>
- </message>
- <message>
<source>Error</source>
<translation>Napaka</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sq.ts b/src/qt/locale/bitcoin_sq.ts
index 7e63f239ca..2e345e85cb 100644
--- a/src/qt/locale/bitcoin_sq.ts
+++ b/src/qt/locale/bitcoin_sq.ts
@@ -1,23 +1,55 @@
-<TS language="sq" version="2.0">
+<TS language="sq" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Klikoni 2 herë për të ndryshuar adressën ose etiketën</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Kliko me të djathtën për të ndryshuar adresën ose etiketen.</translation>
</message>
<message>
<source>Create a new address</source>
<translation>Krijo një adresë të re</translation>
</message>
<message>
+ <source>&amp;New</source>
+ <translation>&amp;E re</translation>
+ </message>
+ <message>
<source>Copy the currently selected address to the system clipboard</source>
<translation>Kopjo adresën e zgjedhur në memorjen e sistemit </translation>
</message>
<message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Kopjo</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Address</source>
+ <translation>&amp;Kopjo adresen</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Fshi adresen e selektuar nga lista</translation>
+ </message>
+ <message>
<source>&amp;Delete</source>
<translation>&amp;Fshi</translation>
</message>
<message>
+ <source>Choose the address to send coins to</source>
+ <translation>Zgjidh adresen ku do te dergoni monedhat</translation>
+ </message>
+ <message>
+ <source>Sending addresses</source>
+ <translation>Duke derguar adresen</translation>
+ </message>
+ <message>
+ <source>Receiving addresses</source>
+ <translation>Duke marr adresen</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Ndrysho</translation>
+ </message>
+ <message>
<source>Comma separated file (*.csv)</source>
<translation>Skedar i ndarë me pikëpresje(*.csv)</translation>
</message>
@@ -53,7 +85,7 @@
</message>
<message>
<source>Encrypt wallet</source>
- <translation>Enkripto portofolin</translation>
+ <translation>Kripto portofolin</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
@@ -76,14 +108,14 @@
<translation>Ndrysho frazkalimin</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Futni frazkalimin e vjetër dhe të ri në portofol. </translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Konfirmoni enkriptimin e portofolit</translation>
</message>
<message>
+ <source>Are you sure you wish to encrypt your wallet?</source>
+ <translation>Jeni te sigurt te enkriptoni portofolin tuaj?</translation>
+ </message>
+ <message>
<source>Wallet encrypted</source>
<translation>Portofoli u enkriptua</translation>
</message>
@@ -147,6 +179,26 @@
<translation>Ndrysho frazkalimin e përdorur per enkriptimin e portofolit</translation>
</message>
<message>
+ <source>Bitcoin</source>
+ <translation>Bitcoin</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation>Portofol</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Dergo</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation>&amp;Merr</translation>
+ </message>
+ <message>
+ <source>&amp;Show / Hide</source>
+ <translation>&amp;Shfaq / Fsheh</translation>
+ </message>
+ <message>
<source>&amp;File</source>
<translation>&amp;Skedar</translation>
</message>
@@ -163,6 +215,30 @@
<translation>Shiriti i mjeteve</translation>
</message>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Berthama Bitcoin</translation>
+ </message>
+ <message>
+ <source>&amp;About Bitcoin Core</source>
+ <translation>Rreth Berthames Bitkoin</translation>
+ </message>
+ <message>
+ <source>%1 and %2</source>
+ <translation>%1 dhe %2</translation>
+ </message>
+ <message>
+ <source>%1 behind</source>
+ <translation>%1 Pas</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Problem</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Informacion</translation>
+ </message>
+ <message>
<source>Up to date</source>
<translation>I azhornuar</translation>
</message>
@@ -193,6 +269,14 @@
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>Zgjedhja e monedhes</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation>Shuma:</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation>Sasia</translation>
</message>
@@ -201,6 +285,18 @@
<translation>Data</translation>
</message>
<message>
+ <source>Copy address</source>
+ <translation>Kopjo adresën</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>po</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>jo</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation>(pa etiketë)</translation>
</message>
@@ -250,12 +346,44 @@
</context>
<context>
<name>FreespaceChecker</name>
+ <message>
+ <source>name</source>
+ <translation>emri</translation>
+ </message>
</context>
<context>
<name>HelpMessageDialog</name>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Berthama Bitcoin</translation>
+ </message>
+ <message>
+ <source>version</source>
+ <translation>versioni</translation>
+ </message>
+ <message>
+ <source>About Bitcoin Core</source>
+ <translation>Rreth Berthames Bitkoin</translation>
+ </message>
</context>
<context>
<name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>Miresevini</translation>
+ </message>
+ <message>
+ <source>Welcome to Bitcoin Core.</source>
+ <translation>Miresevini ne Berthamen Bitcoin</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Berthama Bitcoin</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Problem</translation>
+ </message>
</context>
<context>
<name>OpenURIDialog</name>
@@ -292,6 +420,22 @@
</context>
<context>
<name>RPCConsole</name>
+ <message>
+ <source>&amp;Open</source>
+ <translation>&amp;Hap</translation>
+ </message>
+ <message>
+ <source>&amp;Clear</source>
+ <translation>&amp;Pastro</translation>
+ </message>
+ <message>
+ <source>never</source>
+ <translation>asnjehere</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation>i/e panjohur</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
@@ -341,6 +485,10 @@
<translation>Dërgo Monedha</translation>
</message>
<message>
+ <source>Amount:</source>
+ <translation>Shuma:</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>Dërgo marrësve të ndryshëm njëkohësisht</translation>
</message>
@@ -417,6 +565,10 @@
<context>
<name>SplashScreen</name>
<message>
+ <source>Bitcoin Core</source>
+ <translation>Berthama Bitcoin</translation>
+ </message>
+ <message>
<source>[testnet]</source>
<translation>[testo rrjetin]</translation>
</message>
@@ -477,10 +629,6 @@
<translation>Lloji</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adresë</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Hapur deri më %1</translation>
</message>
@@ -497,6 +645,10 @@
<translation>I krijuar por i papranuar</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiketë</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Marrë me</translation>
</message>
@@ -532,6 +684,10 @@
<translation>Minuar</translation>
</message>
<message>
+ <source>Copy address</source>
+ <translation>Kopjo adresën</translation>
+ </message>
+ <message>
<source>Comma separated file (*.csv)</source>
<translation>Skedar i ndarë me pikëpresje(*.csv)</translation>
</message>
@@ -570,5 +726,21 @@
</context>
<context>
<name>bitcoin-core</name>
- </context>
+ <message>
+ <source>Information</source>
+ <translation>Informacion</translation>
+ </message>
+ <message>
+ <source>Insufficient funds</source>
+ <translation>Fonde te pamjaftueshme</translation>
+ </message>
+ <message>
+ <source>Rescanning...</source>
+ <translation>Rikerkim</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Problem</translation>
+ </message>
+</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_sr.ts b/src/qt/locale/bitcoin_sr.ts
index b005ce23ad..83e6e2f29e 100644
--- a/src/qt/locale/bitcoin_sr.ts
+++ b/src/qt/locale/bitcoin_sr.ts
@@ -1,11 +1,7 @@
-<TS language="sr" version="2.0">
+<TS language="sr" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Kliknite dva puta da izmenite adresu ili etiketu</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Napravite novu adresu</translation>
</message>
@@ -92,10 +88,6 @@
<translation>Промена лозинке</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Унесите стару и нову лозинку за шифровање новчаника.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Одобрите шифровање новчаника</translation>
</message>
@@ -112,10 +104,6 @@
<translation>Новчаник је шифрован</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin će se sad zatvoriti da bi završio proces enkripcije. Zapamti da enkripcija tvog novčanika ne može u potpunosti da zaštiti tvoje bitcoine da ne budu ukradeni od malawarea koji bi inficirao tvoj kompjuter.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Неуспело шифровање новчаника</translation>
</message>
@@ -203,10 +191,6 @@
<translation>Пошаљите новац на bitcoin адресу</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Изаберите могућности bitcoin-а</translation>
- </message>
- <message>
<source>Change the passphrase used for wallet encryption</source>
<translation>Мењање лозинке којом се шифрује новчаник</translation>
</message>
@@ -251,14 +235,6 @@
<translation>Придошла трансакција</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Datum: %1⏎ Iznos: %2⏎ Tip: %3⏎ Adresa: %4⏎</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Новчаник јс &lt;b&gt;шифрован&lt;/b&gt; и тренутно &lt;b&gt;откључан&lt;/b&gt;</translation>
</message>
@@ -569,10 +545,6 @@ Address: %4
<translation>tip</translation>
</message>
<message>
- <source>Address</source>
- <translation>Адреса</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>Otvoreno do %1</translation>
</message>
@@ -589,6 +561,10 @@ Address: %4
<translation>Generisan ali nije prihvaćen</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Етикета</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Primljen sa</translation>
</message>
@@ -625,10 +601,6 @@ Address: %4
<translation>Tip transakcije</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Destinacija i adresa transakcije</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Iznos odbijen ili dodat balansu.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts
index 551f6976cf..289074f134 100644
--- a/src/qt/locale/bitcoin_sv.ts
+++ b/src/qt/locale/bitcoin_sv.ts
@@ -1,9 +1,9 @@
-<TS language="sv" version="2.0">
+<TS language="sv" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Dubbelklicka för att ändra adressen eller etiketten</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Högerklicka för att ändra adressen eller etiketten.</translation>
</message>
<message>
<source>Create a new address</source>
@@ -79,7 +79,7 @@
</message>
<message>
<source>&amp;Edit</source>
- <translation>&amp;Editera</translation>
+ <translation>&amp;Ändra</translation>
</message>
<message>
<source>Export Address List</source>
@@ -157,10 +157,6 @@ Var vänlig och försök igen.</translation>
<translation>Ändra lösenord</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Ange plånbokens gamla och nya lösenord.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Bekräfta kryptering av plånbok</translation>
</message>
@@ -173,6 +169,10 @@ Var vänlig och försök igen.</translation>
<translation>Är du säker på att du vill kryptera din plånbok?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Bitcoin Core kommer att stängas för att slutföra krypteringsprocessen. Kom ihåg att plånbokskryptering inte garanterar fullt skydd mot skadlig kod på din dator.</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>VIKTIGT: Alla tidigare säkerhetskopior du har gjort av plånbokens fil ska ersättas med den nya genererade, krypterade plånboks filen. Av säkerhetsskäl kommer tidigare säkerhetskopior av den okrypterade plånboks filen blir oanvändbara när du börjar använda en ny, krypterad plånbok.</translation>
</message>
@@ -189,8 +189,8 @@ Var vänlig och försök igen.</translation>
<translation>Ange plånbokens nya lösenord. &lt;br/&gt; Använd ett lösenord på &lt;b&gt;tio eller fler slumpmässiga tecken,&lt;/b&gt; eller &lt;b&gt;åtta eller fler ord.&lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Programmet kommer nu att stänga ner för att färdigställa krypteringen. Tänk på att en krypterad plånbok inte skyddar mot stöld om din dator är infekterad med en keylogger.</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Ge det gamla lösenordet och det nya lösenordet för plånboken.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -312,10 +312,6 @@ Var vänlig och försök igen.</translation>
<translation>Skicka bitcoins till en Bitcoin-adress</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Ändra konfigurationsalternativ för Bitcoin</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Säkerhetskopiera plånboken till en annan plats</translation>
</message>
@@ -404,6 +400,10 @@ Var vänlig och försök igen.</translation>
<translation>&amp;Om Bitcoin Core</translation>
</message>
<message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Ändra konfigurationsalternativ för Bitcoin Core</translation>
+ </message>
+ <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Visa listan av använda avsändaradresser och etiketter</translation>
</message>
@@ -432,6 +432,10 @@ Var vänlig och försök igen.</translation>
<translation>Ingen block-källa tillgänglig...</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>Bearbetade %n block av transaktionshistoriken.</numerusform><numerusform>Bearbetade %n block av transaktionshistoriken.</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n timme</numerusform><numerusform>%n timmar</numerusform></translation>
</message>
@@ -479,35 +483,49 @@ Var vänlig och försök igen.</translation>
<source>Up to date</source>
<translation>Uppdaterad</translation>
</message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>Bearbetat %n block av transaktionshistoriken.</numerusform><numerusform>Bearbetat %n block av transaktionshistoriken.</numerusform></translation>
- </message>
<message>
<source>Catching up...</source>
<translation>Hämtar senaste...</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>Transaktion skickad</translation>
+ <source>Date: %1
+</source>
+ <translation>Datum: %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>Inkommande transaktion</translation>
+ <source>Amount: %1
+</source>
+ <translation>Belopp: %1
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Type: %1
</source>
- <translation>Datum: %1
-Belopp: %2
-Typ: %3
-Adress: %4
+ <translation>Typ: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>Etikett: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Adress: %1
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation>Transaktion skickad</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Inkommande transaktion</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Denna plånbok är &lt;b&gt;krypterad&lt;/b&gt; och för närvarande &lt;b&gt;olåst&lt;/b&gt;</translation>
</message>
@@ -698,6 +716,18 @@ Adress: %4
<translation>ingen</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Denna etikett blir röd om transaktionens storlek är större än 1000 bytes.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Denna etikett blir röd om prioriteten är lägre än "medium".</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>Denna etikett blir röd om någon mottagare får ett belopp mindre än %1.</translation>
+ </message>
+ <message>
<source>yes</source>
<translation>ja</translation>
</message>
@@ -706,10 +736,6 @@ Adress: %4
<translation>nej</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Denna etikett blir röd om transaktionen överstiger 1000 byte.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Detta betyder att en avgift på minst %1 per kB behövs.</translation>
</message>
@@ -722,14 +748,6 @@ Adress: %4
<translation>Transaktioner med högre prioritet har större sannolikhet att inkluderas i ett block.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Denna etikett blir röd om prioriteten är mindre än "medium".</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Denna etikett blir röd om någon mottagare får en betalning som är mindre än %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(Ingen etikett)</translation>
</message>
@@ -850,30 +868,6 @@ Adress: %4
<source>command-line options</source>
<translation>kommandoradsalternativ</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI alternativ</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Ändra språk, till exempel "de_DE" (förvalt: systemets språk)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Starta som minimerad</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Sätt SSL root-certifikat för betalningsbegäran (förvalt: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Visa startbilden vid uppstart (förvalt: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Välj datakatalog vid uppstart (förvalt: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -956,14 +950,6 @@ Adress: %4
<translation>&amp;Allmänt</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Starta Bitcoin automatiskt efter inloggning.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Starta Bitcoin vid systemstart</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Storleken på &amp;databascache</translation>
</message>
@@ -988,6 +974,14 @@ Adress: %4
<translation>Proxyns IP-adress (t.ex. IPv4: 127.0.0.1 / IPv6: ::1)</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>Minimera istället för att stänga programmet när fönstret stängs. När detta alternativ är aktiverat stängs programmet endast genom att välja Stäng i menyn.</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>Gränssnittets språk kan väljas här. Denna inställning träder i kraft efter omstart av Bitcoin Core.</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>Tredjeparts URL:er (t.ex. en block utforskare) som finns i transaktionstabben som ett menyval i sammanhanget. %s i URL:en ersätts med tansaktionshashen. Flera URL:er är separerade med vertikala streck |.</translation>
</message>
@@ -1012,6 +1006,14 @@ Adress: %4
<translation>&amp;Nätverk</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>Kör Bitcoin Core automatiskt vid systeminloggning.</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>&amp;Kör Bitcoin Core vid systeminloggning</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = auto, &lt;0 = lämna så många kärnor lediga)</translation>
</message>
@@ -1076,10 +1078,6 @@ Adress: %4
<translation>&amp;Minimera till systemfältet istället för aktivitetsfältet</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 Quit in the menu.</source>
- <translation>Minimera applikationen istället för att stänga ner den när fönstret stängs. Detta innebär att programmet fotrsätter att köras tills du väljer Avsluta i menyn.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>M&amp;inimera vid stängning</translation>
</message>
@@ -1092,10 +1090,6 @@ Adress: %4
<translation>Användargränssnittets &amp;språk: </translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Användargränssnittets språk kan ställas in här. Denna inställning träder i kraft efter en omstart av Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>&amp;Måttenhet att visa belopp i: </translation>
</message>
@@ -1132,8 +1126,8 @@ Adress: %4
<translation>Klientomstart är nödvändig för att aktivera ändringarna.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Klienten skall stängas av, vill du fortsätta?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>Programmet kommer att stängas. Vill du fortsätta?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1218,10 +1212,6 @@ Adress: %4
<source>Current total balance in watch-only addresses</source>
<translation>Nuvarande total balans i granska-bara adresser</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>osynkroniserad</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1242,10 +1232,6 @@ Adress: %4
<translation>Betalningsbegärans nätverk matchar inte klientens nätverk.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Tiden för betalningsbegäran gick ut</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>Betalningsbegäran är inte initierad.</translation>
</message>
@@ -1278,14 +1264,30 @@ Adress: %4
<translation>Betalningsbegäransfilen kan inte läsas! Detta kan orsakas av en felaktig betalningsbegäransfil.</translation>
</message>
<message>
+ <source>Payment request expired.</source>
+ <translation>Betalningsbegäran löpte ut.</translation>
+ </message>
+ <message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>Overifierade betalningsbegärningar till specialbetalningsskript stöds inte.</translation>
</message>
<message>
+ <source>Invalid payment request.</source>
+ <translation>Ogiltig betalningsbegäran.</translation>
+ </message>
+ <message>
<source>Refund from %1</source>
<translation>Återbetalning från %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>Betalningsbegäran %1 är för stor (%2 bytes, tillåten %3 bytes)</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Betalningsbegäran begär DoS-skydd</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Kommunikationsfel med %1: %2</translation>
</message>
@@ -1313,8 +1315,8 @@ Adress: %4
<translation>Användaragent</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adress/Värdnamn</translation>
+ <source>Node/Service</source>
+ <translation>Nod/Tjänst</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1348,14 +1350,6 @@ Adress: %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>NÄTVERK</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>OKÄND</translation>
- </message>
- <message>
<source>None</source>
<translation>Ingen</translation>
</message>
@@ -1446,6 +1440,10 @@ Adress: %4
<translation>Aktuellt antal block</translation>
</message>
<message>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Öppna felsökningsloggfilen för Bitcoin Core från den nuvarande datakatalogen. Detta kan ta några sekunder om loggfilen är stor.</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Mottagen</translation>
</message>
@@ -1514,6 +1512,10 @@ Adress: %4
<translation>Pingtid</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation>Tidsförskjutning</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Sista blocktid</translation>
</message>
@@ -1554,16 +1556,12 @@ Adress: %4
<translation>Debugloggfil</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Öppna Bitcoin debug-loggfilen som finns i datakatalogen. Detta kan ta några sekunder för stora loggfiler.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Rensa konsollen</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Välkommen till Bitcoin RPC-konsollen.</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Välkommen till RPC-konsolen för Bitcoin Core.</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
@@ -1850,14 +1848,6 @@ Adress: %4
<translation>Fäll ihop avgiftsinställningarna</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Minimera</translation>
- </message>
- <message>
- <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
- <translation>Om den anpassad avgiften är satt till 1000 satoshi och transaktionen bara är 250 byte, betalar "per kilobyte" bara 250 satoshi i avgift, medans "minst" betalar 1000 satoshi. För transaktioner större än en kilobyte betalar både per kilobyte.</translation>
- </message>
- <message>
<source>per kilobyte</source>
<translation>per kilobyte</translation>
</message>
@@ -1866,6 +1856,10 @@ Adress: %4
<translation>Om den anpassad avgiften är satt till 1000 satoshi och transaktionen bara är 250 byte, betalar "per kilobyte" bara 250 satoshi i avgift, medans "totalt minst" betalar 1000 satoshi. För transaktioner större än en kilobyte betalar både per kilobyte.</translation>
</message>
<message>
+ <source>Hide</source>
+ <translation>Göm</translation>
+ </message>
+ <message>
<source>total at least</source>
<translation>totalt minst</translation>
</message>
@@ -1986,10 +1980,6 @@ Adress: %4
<translation>eller</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Mottagarens adress är inte giltig, vänligen kontrollera igen.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Det betalade beloppet måste vara större än 0.</translation>
</message>
@@ -2002,10 +1992,6 @@ Adress: %4
<translation>Totalvärdet överstiger ditt saldo när transaktionsavgiften %1 är pålagd.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Dubblett av adress funnen, kan bara skicka till varje adress en gång per sändning.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Transaktionen gick inte att skapa!</translation>
</message>
@@ -2014,16 +2000,28 @@ Adress: %4
<translation>Transaktionen avslogs! Detta kan hända om några av mynten i plånboken redan spenderats, t.ex om du använt en kopia av wallet.dat och mynt spenderades i kopian men inte markerats som spenderade här.</translation>
</message>
<message>
- <source>A fee higher than %1 is considered an insanely high fee.</source>
- <translation>En avgift högre än %1 anses som en onormalt hög avgift.</translation>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation>En avgift som är högre än %1 anses vara en orimligt hög avgift.</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>Betalningsbegäran löpte ut.</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation><numerusform>Uppskattas till att påbörja bekräftelse inom %n block.</numerusform><numerusform>Uppskattas till att påbörja bekräftelse inom %n block.</numerusform></translation>
</message>
<message>
<source>Pay only the minimum fee of %1</source>
<translation>Betala endast den minimala avgiften på %1</translation>
</message>
<message>
- <source>Estimated to begin confirmation within %1 block(s).</source>
- <translation>Bekräftelsen beräknas börja inom %1 block.</translation>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>Mottagarens adress är ogiltig. Kontrollera igen.</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation>Duplicerad adress upptäckt: adresser skall endast användas en gång var.</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
@@ -2097,12 +2095,20 @@ Adress: %4
<translation>Radera denna post</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>Avgiften dras från beloppet som skickas. Mottagaren kommer att få mindre bitcoins än du angivit i belopp-fältet. Om flera mottagare valts kommer avgiften delas jämt.</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Meddelande:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Detta är en verifierad betalningsbegäran.</translation>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>Detta är en oautentiserad betalningsbegäran.</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>Detta är en autentiserad betalningsbegäran.</translation>
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
@@ -2113,10 +2119,6 @@ Adress: %4
<translation>Ett meddelande som bifogades bitcoin-URI, vilket lagras med transaktionen som referens. NB: Meddelandet kommer inte att sändas över Bitcoinnätverket.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Detta är en overifierad betalningsbegäran.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Betala Till:</translation>
</message>
@@ -2147,8 +2149,8 @@ Adress: %4
<translation>&amp;Signera Meddelande</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Du kan signera meddelanden med dina adresser för att bevisa att du äger dem. Var försiktig med vad du signerar eftersom phising-attacker kan försöka få dig att skriva över din identitet till någon annan. Signera bara väldetaljerade påståenden du kan gå i god för.</translation>
+ <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>Du kan underteckna meddelanden/avtal med dina adresser för att bevisa att du kan ta emot bitcoins som skickats till dem. Var försiktig så du inte undertecknar något oklart eller konstigt, eftersom phishing-angrepp kan försöka få dig att underteckna din identitet till dem. Underteckna endast väldetaljerade meddelanden som du godkänner.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -2203,8 +2205,8 @@ Adress: %4
<translation>&amp;Verifiera Meddelande</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Skriv in din adress, meddelande (se till att du kopierar radbrytningar, mellanslag, tabbar, osv. exakt) och signatur nedan för att verifiera meddelandet. Var noga med att inte läsa in mer i signaturen än vad som finns i det signerade meddelandet, för att undvika att luras av en man-in-the-middle attack.</translation>
+ <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>Ange mottagarens adress, meddelande (kopiera radbrytningar, mellanrum, flikar, etc. exakt) och signatur nedan för att verifiera meddelandet. Undvik att läsa in mera information i signaturen än vad som stod i själva undertecknade meddelandet, för att undvika ett man-in-the-middle-angrepp. Notera att detta endast bevisar att undertecknad tar emot med adressen, det bevisar inte vem som skickat transaktionen!</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
@@ -2470,10 +2472,6 @@ Adress: %4
<translation>Typ</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adress</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Omogen (%1 konfirmeringar, blir tillgänglig efter %2)</translation>
</message>
@@ -2502,6 +2500,10 @@ Adress: %4
<translation>Nerkopplad</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etikett</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Okonfirmerade</translation>
</message>
@@ -2558,8 +2560,8 @@ Adress: %4
<translation>Anger om granska-bara--adresser är involverade i denna transaktion.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Transaktionens destinationsadress.</translation>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation>Användardefinierat syfte/ändamål för transaktionen.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2800,34 +2802,14 @@ Adress: %4
<translation>Acceptera anslutningar utifrån (förvalt: 1 om ingen -proxy eller -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, du behöver sätta ett rpclösensord i konfigurationsfilen:
-%s
-Det är rekommenderat att använda följande slumpade lösenord:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(du behöver inte komma ihåg lösenordet)
-Användarnamnet och lösenordet FÅR INTE bara detsamma.
-Om filen inte existerar, skapa den med enbart ägarläsbara filrättigheter.
-Det är också rekommenderat att sätta alertnotify så du meddelas om problem;
-till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Bind till given adress och lyssna alltid på den. Använd [värd]:port notation för IPv6</translation>
</message>
<message>
+ <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default: %u)</source>
+ <translation>Hastighetsbegränsa avgiftsfria transaktionerna till &lt;n&gt;*1000 bytes per minut (förvalt: %u)</translation>
+ </message>
+ <message>
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
<translation>Ta bort alla plånbokstransaktioner och återskapa bara dom som är en del av blockkedjan genom att ange -rescan vid uppstart</translation>
</message>
@@ -2840,14 +2822,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ange regressiontestläge, som använder en speciell kedja i vilka block kan lösas omedelbart.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Fel: Transaktionen avslogs! Detta kan hända om några av mynten i plånboken redan spenderats, t.ex om du använt en kopia av wallet.dat och mynt spenderades i kopian men inte markerats som spenderas här.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Fel: Denna transaktion kräver en transaktionsavgift på minst %s på grund av dess storlek, komplexitet, eller användning av senast mottagna bitcoins!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Exekvera kommando när en plånbokstransaktion ändras (%s i cmd är ersatt av TxID)</translation>
</message>
@@ -2856,6 +2830,14 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>I denna mode kontrollerar -genproclimit hur många block som genereras på en gång.</translation>
</message>
<message>
+ <source>Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Maximal total avgift att använda i en plånbokstransaktion. Sätts denna för lågt kommer stora transaktioner att avbrytas (förvalt: %s)</translation>
+ </message>
+ <message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, &gt;%u = target size in MiB to use for block files)</source>
+ <translation>Reducera lagringsbehovet genom att beskära (ta bort) gamla block. Detta läge avaktiverar plånbokssupport och är inkompatibel med -txindex. Varning: Ändras denna inställning måste hela blockkedjan laddas ner igen. 0 = avaktivera beskärning av blocks, &gt;%u = målstorlek i MiB att använda för blockfiler)</translation>
+ </message>
+ <message>
<source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
<translation>Ange antalet skriptkontrolltrådar (%u till %d, 0 = auto, &lt;0 = lämna så många kärnor lediga, förval: %d)</translation>
</message>
@@ -2924,10 +2906,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Avlusnings/Testnings optioner:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Hitta egen IP-adress (förvalt: 1 under lyssning och utan -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Ladda inte plånboken och stäng av RPC-anrop till plånboken</translation>
</message>
@@ -2960,10 +2938,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Fel: Hårddiskutrymme är lågt!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Fel: Plånboken är låst, det går ej att skapa en transaktion!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Misslyckades att lyssna på någon port. Använd -listen=0 om du vill detta.</translation>
</message>
@@ -2992,8 +2966,12 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Anslut enbart till noder i nätverket &lt;net&gt; (IPv4, IPv6 eller onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Återskapa blockkedjans index från nuvarande blk000??.dat filer</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>Beskärning kan inte konfigureras med ett negativt värde.</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Beskärningsläge är inkompatibel med -txindex.</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -3032,6 +3010,10 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Plånboksinställningar:</translation>
</message>
<message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>Varning: Denna version är föråldrad; uppgradering krävs!</translation>
+ </message>
+ <message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>Du måste återskapa databasen med -reindex för att ändra -txindex</translation>
</message>
@@ -3060,14 +3042,14 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Kan inte låsa data-mappen %s. Bitcoin Core körs förmodligen redan.</translation>
</message>
<message>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
- <translation>Antalsbegränsa kontinuerligt fria transaktioner till &lt;n&gt;*1000 bytes per minut (förvalt:%u)</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Skapa nya filer med systemets förvalda rättigheter, istället för umask 077 (bara effektivt med avaktiverad plånboks funktionalitet)</translation>
</message>
<message>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Upptäck egna IP adresser (standard: 1 vid lyssning ingen -externalip eller -proxy)</translation>
+ </message>
+ <message>
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
<translation>Fel: Avlyssning av inkommande anslutningar misslyckades (Avlyssningen returnerade felkod %s)</translation>
</message>
@@ -3088,22 +3070,74 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Avgifter (i BTC/Kb) mindre än detta betraktas som nollavgift för transaktionsskapande (förvalt: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Om paytxfee inte är satt, inkludera tillräcklig avgift så att transaktionen börjar att konfirmeras inom n blocks (förvalt: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>Otillåtet belopp för -maxtxfee=&lt;belopp&gt;: '%s' (måste åtminstånde vara minrelay avgift %s för att förhindra stoppade transkationer)</translation>
+ </message>
+ <message>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation>Maximal storlek på data i databärartransaktioner som vi reläar och bryter (förvalt: %u) </translation>
</message>
<message>
+ <source>Prune configured below the minimum of %d MB. Please use a higher number.</source>
+ <translation>Beskärning konfigurerad under miniminivån %d MB. Var vänlig använd ett högre värde.</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Sök efter klientadresser med DNS sökningen, om det finns otillräckligt med adresser (förvalt: 1 om inte -connect)</translation>
</message>
<message>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>Slumpa autentiseringen för varje proxyanslutning. Detta möjliggör Tor ström-isolering (förvalt: %u)</translation>
+ </message>
+ <message>
+ <source>Require high priority for relaying free or low-fee transactions (default: %u)</source>
+ <translation>Begär hög prioritet för att vidarebefodra lågavgiftstransaktioner (förvalt: %u)</translation>
+ </message>
+ <message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation>Sätt den maximala storleken av hög-prioriterade/låg-avgifts transaktioner i byte (förvalt: %d)</translation>
</message>
<message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>Transaktionen är för liten att skicka efter det att avgiften har dragits</translation>
+ </message>
+ <message>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation>Denna produkten innehåller mjukvara utvecklad av OpenSSL Project för användning i OpenSSL Toolkit &lt;https://www.openssl.org/&gt; och kryptografisk mjukvara utvecklad av Eric Young samt UPnP-mjukvara skriven av Thomas Bernard.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>För att använda bitconid,eller -server optionen till bitcoin-qt så mäste du sätta ett rpclösensord i konfigurationsfilen:
+%s
+Det är rekommenderat att använda följande slumpade lösenord:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(du behöver inte komma ihåg lösenordet)
+Användarnamnet och lösenordet FÅR INTE vara detsamma.
+Om filen inte existerar, skapa den med enbart ägarläsbara filrättigheter.
+Det är också rekommenderat att sätta alertnotify så du meddelas om problem;
+till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Varning: -maxtxfee är satt väldigt hög! Så höga avgifter kan betalas för en enstaka transaktion.</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Varning: Vänligen kolla så att din dators datum och tid är korrekt! Om din klocka går fel kommer Bitcoin Core inte att fungera korrekt.</translation>
</message>
@@ -3112,10 +3146,38 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Vitlistade klienter kan inte bli DoS bannade och deras transaktioner reläas alltid, även om dom redan är i mempoolen, användbart för t.ex en gateway </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>Du måste bygga om databasen genom att använda -reindex för att återgå till obeskärt läge. Detta kommer att ladda ner hela blockkedjan.</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(förvalt: %u)</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Acceptera publika REST förfrågningar (förvalt: %u)</translation>
+ </message>
+ <message>
+ <source>Activating best chain...</source>
+ <translation>Aktiverar bästa kedjan...</translation>
+ </message>
+ <message>
+ <source>Allow self signed root certificates (default: 0)</source>
+ <translation>Tillåt självsignerade root-certifikat (förvalt: 0)</translation>
+ </message>
+ <message>
+ <source>Can't run with a wallet in prune mode.</source>
+ <translation>Kan inte köra med en plånbok i beskärningsläge.</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>Kan inte matcha -whitebind adress: '%s'</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Välj datakatalog vid uppstart (förvalt: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Anslut genom SOCKS5 proxy</translation>
</message>
@@ -3132,6 +3194,10 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Fel vid inläsningen av wallet.dat: Kontofilen kräver en senare version av Bitcoin Core</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Fel vid läsning från databas, avslutar.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Fel: Argumentet -tor stöds inte, använd -onion.</translation>
</message>
@@ -3148,6 +3214,10 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Initieringschecken fallerade. Bitcoin Core stängs av...</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Otillåtet belopp för -maxtxfee=&lt;belopp&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Ogiltigt belopp för -minrelaytxfee=&lt;belopp&gt;: '%s'</translation>
</message>
@@ -3164,10 +3234,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ogiltig nätmask angiven i -whitelist: '%s'</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Håll som mest &lt;n&gt; oanslutningsbara block i minnet (förvalt: %u)</translation>
- </message>
- <message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>Håll som mest &lt;n&gt; oanslutningsbara transaktioner i minnet (förvalt: %u)</translation>
</message>
@@ -3180,10 +3246,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Nodreläoptioner:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Skriv ut block vid uppstart, om det hittas i blockindexet</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>RPC SSL optioner: (se Bitcoin Wiki för SSL inställningsinstruktioner)</translation>
</message>
@@ -3192,6 +3254,10 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>RPC serveroptioner:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>RPC support för HTTP permanent anslutning (förvalt: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Slumpmässigt tappa 1 av varje &lt;n&gt; nåtverksmeddelande</translation>
</message>
@@ -3200,6 +3266,10 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Slupmässigt brus 1 gång varje &lt;n&gt; nätverksmeddelande</translation>
</message>
<message>
+ <source>Rebuild block chain index from current blk000??.dat files on startup</source>
+ <translation>Återskapa blockkedjans index från nuvarande blk000??.dat filer under uppstarten</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Skicka trace-/debuginformation till terminalen istället för till debug.log</translation>
</message>
@@ -3208,10 +3278,22 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Sänd transaktioner som nollavgiftstransaktioner om möjligt (förvalt: %u)</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Sätt SSL root-certifikat för betalningsbegäran (förvalt: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Ändra språk, till exempel "de_DE" (förvalt: systemets språk)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Visa alla avlusningsoptioner (använd: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Visa startbilden vid uppstart (förvalt: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Krymp debug.log filen vid klient start (förvalt: 1 vid ingen -debug)</translation>
</message>
@@ -3220,6 +3302,14 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Signering av transaktion misslyckades</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Starta som minimerad</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>Transaktionen är för liten för att betala avgiften</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Detta är experimentmjukvara.</translation>
</message>
@@ -3232,10 +3322,18 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Transaktionens belopp måste vara positiva</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Transaktionen är för stor för avgiftspolicyn</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Transaktionen är för stor</translation>
</message>
<message>
+ <source>UI Options:</source>
+ <translation>UI Alternativ:</translation>
+ </message>
+ <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation>Det går inte att binda till %s på den här datorn (bind returnerade felmeddelande %s)</translation>
</message>
@@ -3256,10 +3354,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Varning</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Varning: denna version är föråldrad, uppgradering krävs!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Varning: Argument -benchmark stöds inte och ignoreras, använd -debug=bench.</translation>
</message>
@@ -3328,10 +3422,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Hur grundlig blockverifikationen vid -checkblocks är (0-4, förvalt: %u)</translation>
</message>
<message>
- <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
- <translation>Om paytxfee inte är satt, inkludera tillräcklig avgift så att transaktionen konfirmeras inom n blocks (förvalt: %u)</translation>
- </message>
- <message>
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
<translation>Logga transaktionsprioritet och avgift per kB vid blockbrytning (förvalt: %u)</translation>
</message>
@@ -3408,6 +3498,10 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ha som mest &lt;n&gt; anslutningar till andra klienter (förvalt: %u)</translation>
</message>
<message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>Gör så att plånboken sänder ut transaktionerna</translation>
+ </message>
+ <message>
<source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
<translation>Maximal mottagningsbuffert per anslutning, &lt;n&gt;*1000 byte (förvalt: %u)</translation>
</message>
@@ -3424,10 +3518,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Skriv ut tidsstämpel i avlusningsinformationen (förvalt: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Skriv ut blockträdet vid uppstart (förvalt: %u)</translation>
- </message>
- <message>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation>Reläa och bearbeta databärartransaktioner (förvalt: %u) </translation>
</message>
@@ -3504,10 +3594,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Ogiltigt belopp för -paytxfee=&lt;belopp&gt;:'%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Ogiltig mängd</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Otillräckligt med bitcoins</translation>
</message>
@@ -3540,10 +3626,6 @@ till exempel: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Klar med laddning</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Att använda %s alternativet</translation>
- </message>
- <message>
<source>Error</source>
<translation>Fel</translation>
</message>
diff --git a/src/qt/locale/bitcoin_th_TH.ts b/src/qt/locale/bitcoin_th_TH.ts
index 174816aaef..7b5d1ae01c 100644
--- a/src/qt/locale/bitcoin_th_TH.ts
+++ b/src/qt/locale/bitcoin_th_TH.ts
@@ -1,11 +1,7 @@
-<TS language="th_TH" version="2.0">
+<TS language="th_TH" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>ดับเบิ้ลคลิก เพื่อแก้ไขที่อยู่ หรือชื่อ</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>สร้างที่อยู่ใหม่</translation>
</message>
@@ -76,10 +72,6 @@
<translation>เปลี่ยนรหัสผ่าน</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>กรอกรหัสผ่านเก่าและรหัสผ่านใหม่สำหรับกระเป๋าสตางค์</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>ยืนยันการเข้ารหัสกระเป๋าสตางค์</translation>
</message>
@@ -349,8 +341,8 @@
<context>
<name>TransactionTableModel</name>
<message>
- <source>Address</source>
- <translation>ที่อยู่</translation>
+ <source>Label</source>
+ <translation>ชื่อ</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_tr.ts b/src/qt/locale/bitcoin_tr.ts
index ab02cc92a6..bf6f3f2791 100644
--- a/src/qt/locale/bitcoin_tr.ts
+++ b/src/qt/locale/bitcoin_tr.ts
@@ -1,9 +1,9 @@
-<TS language="tr" version="2.0">
+<TS language="tr" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Adresi ya da etiketi düzenlemek için çift tıklayınız</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Adresi ya da etiketi düzenlemek için sağ düğme ile tıklayınız.</translation>
</message>
<message>
<source>Create a new address</source>
@@ -27,7 +27,7 @@
</message>
<message>
<source>&amp;Copy Address</source>
- <translation>Adresi &amp;kopyala</translation>
+ <translation>&amp;Adresi Kopyala</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -59,7 +59,7 @@
</message>
<message>
<source>Sending addresses</source>
- <translation>Yollama adresleri</translation>
+ <translation>&amp;Gönderme adresleri...</translation>
</message>
<message>
<source>Receiving addresses</source>
@@ -156,10 +156,6 @@
<translation>Parolayı değiştir</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Cüzdan için eski ve yeni parolaları giriniz.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Cüzdan şifrelenmesini teyit eder</translation>
</message>
@@ -172,6 +168,10 @@
<translation>Cüzdanınızı şifrelemek istediğinizden emin misiniz?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>Şifreleme işlemini tamamlamak için Bitcoin Çekirdeği şimdi kapanacaktır. Cüzdanınızı şifrelemenin, Bitcoinlerinizin bilgisayara bulaşan kötücül bir yazılım tarafından çalınmaya karşı tamamen koruyamayacağını unutmayınız.</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>ÖNEMLİ: Önceden yapmış olduğunuz cüzdan dosyası yedeklemelerinin yeni oluşturulan şifrelenmiş cüzdan dosyası ile değiştirilmeleri gerekir. Güvenlik nedenleriyle yeni, şifrelenmiş cüzdanı kullanmaya başladığınızda eski şifrelenmemiş cüzdan dosyaları işe yaramaz hale gelecektir.</translation>
</message>
@@ -188,8 +188,8 @@
<translation>Cüzdan için yeni parolayı giriniz.&lt;br/&gt;Lütfen &lt;b&gt;on ya da daha fazla rastgele karakter&lt;/b&gt; veya &lt;b&gt;sekiz ya da daha fazla kelime&lt;/b&gt; içeren bir parola kullanınız.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Şifreleme işlemini tamamlamak için Bitcoin şimdi kapanacaktır. Cüzdanınızı şifrelemenin, Bitcoinlerinizin bilgisayara bulaşan kötücül bir yazılım tarafından çalınmaya karşı tamamen koruyamayacağını unutmayınız.</translation>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>Cüzdan için eski parolayı ve yeni parolayı giriniz.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -311,10 +311,6 @@
<translation>Bir Bitcoin adresine Bitcoin yolla</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Bitcoin seçeneklerinin yapılandırmasını değiştir</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Cüzdanı diğer bir konumda yedekle</translation>
</message>
@@ -403,6 +399,10 @@
<translation>Bitcoin Çekirdeği &amp;hakkında</translation>
</message>
<message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>Bitcoin Çekirdeği yapılandırma seçeneklerini değiştir</translation>
+ </message>
+ <message>
<source>Show the list of used sending addresses and labels</source>
<translation>Kullanılmış gönderme adresleri ve etiketlerin listesini göster</translation>
</message>
@@ -431,6 +431,10 @@
<translation>Hiçbir blok kaynağı mevcut değil...</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>Muamele tarihçesinden %n blok işlendi.</numerusform><numerusform>Muamele tarihçesinden %n blok işlendi</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n saat</numerusform><numerusform>%n saat</numerusform></translation>
</message>
@@ -478,35 +482,49 @@
<source>Up to date</source>
<translation>Güncel</translation>
</message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>Muamele tarihçesinden %n blok işlendi</numerusform><numerusform>Muamele tarihçesinden %n blok işlendi</numerusform></translation>
- </message>
<message>
<source>Catching up...</source>
<translation>Aralık kapatılıyor...</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>Muamele yollandı</translation>
+ <source>Date: %1
+</source>
+ <translation>Tarih: %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>Gelen muamele</translation>
+ <source>Amount: %1
+</source>
+ <translation>Meblağ: %1
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Type: %1
</source>
- <translation>Tarih: %1
-Meblağ: %2
-Tür: %3
-Adres: %4
+ <translation>Tür: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>Etiket: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>Adres: %1
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation>Muamele yollandı</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Gelen muamele</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Cüzdan &lt;b&gt;şifrelenmiştir&lt;/b&gt; ve şu anda &lt;b&gt;kilidi açıktır&lt;/b&gt;</translation>
</message>
@@ -697,6 +715,18 @@ Adres: %4
<translation>boş</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>Eğer muamele boyutu 1000 bayttan yüksek ise bu etiket kırmızı hale gelir.</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>Eğer öncelik "ortadan" düşükse bu etiket kırmızı olur.</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>Eğer herhangi bir alıcı %1'den düşük bir meblağ alırsa bu etiket kırmızı olur.</translation>
+ </message>
+ <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation>Giriş başına +/- %1 satoshi olarak değişebilir.</translation>
</message>
@@ -709,10 +739,6 @@ Adres: %4
<translation>hayır</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Eğer muamele boyutu 1000 bayttan büyükse bu etkiket kırmızı olur.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Bu, kB başına en az %1 ücret gerektiği anlamnına gelir.</translation>
</message>
@@ -725,14 +751,6 @@ Adres: %4
<translation>Yüksek öncelikli muamelelerin bir bloğa dahil olmaları daha olasıdır.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Eğer öncelik "ortadan" düşükse bu etiket kırmızı olur.</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Eğer herhangi bir alıcı %1'den düşük bir meblağ alırsa bu etiket kırmızı olur.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(boş etiket)</translation>
</message>
@@ -853,30 +871,6 @@ Adres: %4
<source>command-line options</source>
<translation>komut satırı seçenekleri</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Kullanıcı arayüzü seçenekleri</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Lisan belirt, mesela "de_De" (varsayılan: sistem dili)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Küçültülmüş olarak başlat</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Ödeme talebi için SSL kök sertifikalarını belirle (varsayılan: -system-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Başlatıldığında başlangıç ekranını göster (varsayılan: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Başlangıçta veri klasörü seç (varsayılan: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -959,14 +953,6 @@ Adres: %4
<translation>&amp;Esas ayarlar</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Sistemde oturum açıldığında Bitcoin'i otomatik olarak başlat.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>Bitcoin'i sistem oturumuyla &amp;başlat</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>&amp;Veritabanı tamponunun boyutu</translation>
</message>
@@ -991,6 +977,14 @@ Adres: %4
<translation>Vekil sunucusunun IP adresi (mesela IPv4: 127.0.0.1 / IPv6: ::1)</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>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>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>Kullanıcı arayüzünün dili burada belirtilebilir. Bu ayar Bitcoin Çekirdeği tekrar başlatıldığında etkinleşecektir.</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>Muameleler sekmesinde bağlam menüsü unsurları olarak görünen üçüncü taraf bağlantıları (mesela bir blok tarayıcısı). URL'deki %s, muamele hash değeri ile değiştirilecektir. Birden çok bağlantılar düşey çubuklar | ile ayrılacaktır.</translation>
</message>
@@ -1015,6 +1009,14 @@ Adres: %4
<translation>&amp;Şebeke</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>Sistemde oturum açıldığında Bitcoin Çekirdeğini otomatik olarak başlat.</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>Bitcoin Çekirdeğini sistem oturumuyla &amp;başlat</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = otomatik, &lt;0 = bu kadar çekirdeği kullanma)</translation>
</message>
@@ -1079,10 +1081,6 @@ Adres: %4
<translation>İşlem çubuğu yerine sistem çekmecesine &amp;küçült</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 Quit in the menu.</source>
- <translation>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>M&amp;inimize on close</source>
<translation>Kapatma sırasında k&amp;üçült</translation>
</message>
@@ -1095,10 +1093,6 @@ Adres: %4
<translation>Kullanıcı arayüzü &amp;lisanı:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Kullanıcı arayüzünün dili burada belirtilebilir. Bu ayar Bitcoin tekrar başlatıldığında etkinleşecektir.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>Meblağları göstermek için &amp;birim:</translation>
</message>
@@ -1135,8 +1129,8 @@ Adres: %4
<translation>Değişikliklerin uygulanması için istemcinin yeniden başlatılması lazımdır.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>İstemci kapanacaktır, devam etmek istiyor musunuz?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>İstemci kapanacaktır. Devam etmek istiyor musunuz?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1221,10 +1215,6 @@ Adres: %4
<source>Current total balance in watch-only addresses</source>
<translation>Sadece izlenen adreslerdeki güncel toplam bakiye</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>eşleşme dışı</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1245,10 +1235,6 @@ Adres: %4
<translation>Ödeme talebi şebekesi istemci şebekesine denk gelmiyor.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Ödeme talebinin ömrü doldu.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>Ödeme talebi başlatılmamış.</translation>
</message>
@@ -1281,14 +1267,30 @@ Adres: %4
<translation>Ödeme talebi okunamaz ya da işlenemez! Bunun sebebi geçersiz bir ödeme talebi dosyası olabilir.</translation>
</message>
<message>
+ <source>Payment request expired.</source>
+ <translation>Ödeme talebinin ömrü doldu.</translation>
+ </message>
+ <message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>Özel ödeme betiklerine teyit edilmemiş ödeme talepleri desteklenmez.</translation>
</message>
<message>
+ <source>Invalid payment request.</source>
+ <translation>Geçersiz ödeme talebi.</translation>
+ </message>
+ <message>
<source>Refund from %1</source>
<translation>%1 öğesinden iade</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>%1 ödeme talebi çok büyük (%2 bayt, müsaade edilen %3 bayt).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>Ödeme talebi DoS koruması</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>%1 ile iletişimde hata: %2</translation>
</message>
@@ -1316,8 +1318,8 @@ Adres: %4
<translation>Kullanıcı Yazılımı</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Adres/Makine ismi</translation>
+ <source>Node/Service</source>
+ <translation>Düğüm/Servis</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1351,14 +1353,6 @@ Adres: %4
<translation>%1 s</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>ŞEBEKE</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>BİLİNMİYOR</translation>
- </message>
- <message>
<source>None</source>
<translation>Boş</translation>
</message>
@@ -1449,6 +1443,10 @@ Adres: %4
<translation>Güncel blok sayısı</translation>
</message>
<message>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>Güncel veri klasöründen Bitcoin Çekirdeği hata ayıklama kütük dosyasını açar. Büyük kütük dosyaları için bu birkaç saniye alabilir.</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>Alınan</translation>
</message>
@@ -1517,6 +1515,10 @@ Adres: %4
<translation>Ping Zamanı</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation>Saat Farkı</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>Son blok zamanı</translation>
</message>
@@ -1557,16 +1559,12 @@ Adres: %4
<translation>Hata ayıklama kütük dosyası</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Güncel veri klasöründen Bitcoin hata ayıklama kütük dosyasını açar. Büyük kütük dosyaları için bu birkaç saniye alabilir.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Konsolu temizle</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bitcoin RPC konsoluna hoş geldiniz.</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>Bitcoin Çekirdeği RPC konsoluna hoş geldiniz.</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
@@ -1857,14 +1855,6 @@ Adres: %4
<translation>ücret-ayarlarını-küçült</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Küçült</translation>
- </message>
- <message>
- <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
- <translation>Eğer özel ücret 1000 satoşi olarak ayarlandıysa ve muamele sadece 250 baytsa, "kilobayt başı" ücret olarak sadece 250 satoşi öder ve "asgari" 1000 satoşi öder. Bir kilobayttan yüksek muameleler için ikisi de kilobayt başı ödeme yapar.</translation>
- </message>
- <message>
<source>per kilobyte</source>
<translation>kilobayt başı</translation>
</message>
@@ -1873,6 +1863,10 @@ Adres: %4
<translation>Eğer özel ücret 1000 satoşi olarak ayarlandıysa ve muamele sadece 250 baytsa, "kilobayt başı" ücret olarak sadece 250 satoşi öder ve "toplam asgari" 1000 satoşi öder. Bir kilobayttan yüksek muameleler için ikisi de kilobayt başı ödeme yapar.</translation>
</message>
<message>
+ <source>Hide</source>
+ <translation>Sakla</translation>
+ </message>
+ <message>
<source>total at least</source>
<translation>toplam asgari</translation>
</message>
@@ -1993,10 +1987,6 @@ Adres: %4
<translation>veya</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Alıcı adresi geçerli değildir, lütfen denetleyiniz.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Ödeyeceğiniz tutarın sıfırdan yüksek olması gerekir.</translation>
</message>
@@ -2009,10 +1999,6 @@ Adres: %4
<translation>Toplam, %1 muamele ücreti ilâve edildiğinde bakiyenizi geçmektedir.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Çift adres bulundu, belli bir gönderi sırasında her adrese sadece tek bir gönderide bulunulabilir.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Muamelenin oluşturulması başarısız oldu!</translation>
</message>
@@ -2021,16 +2007,24 @@ Adres: %4
<translation>Muamele reddedildi! Cüzdanınızdaki madenî paraların bazıları zaten harcanmış olduğunda bu meydana gelebilir. Örneğin wallet.dat dosyasının bir kopyasını kullandıysanız ve kopyada para harcandığında ancak burada harcandığı işaretlenmediğinde.</translation>
</message>
<message>
- <source>A fee higher than %1 is considered an insanely high fee.</source>
- <translation>%1 tutarından yüksek ücret delicesine aşırı yüksek bir ücret olarak kabul edilir.</translation>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation>%1 tutarından yüksek ücret saçma derecede yüksek bir ücret olarak kabul edilir.</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>Ödeme talebinin ömrü doldu.</translation>
</message>
<message>
<source>Pay only the minimum fee of %1</source>
<translation>Sadece asgari ücret olan %1 tutarını öde</translation>
</message>
<message>
- <source>Estimated to begin confirmation within %1 block(s).</source>
- <translation>Tahmini olarak %1 blok içinde teyide başlanacaktır.</translation>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>Alıcı adresi geçerli değildir. Lütfen denetleyiniz.</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation>Çift adres bulundu: adresler herbiri için sadece bir kez kullanılmalıdır.</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
@@ -2104,12 +2098,24 @@ Adres: %4
<translation>Bu unsuru kaldır</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>Ücret yollanan meblağdan alınacaktır. Alıcı meblağ alanında girdiğinizden daha az bitcoin alacaktır. Eğer birden çok alıcı seçiliyse ücret eşit olarak bölünecektir.</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation>Ücreti meblağdan düş</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>Mesaj:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Bu, teyit edilmiş bir ödeme talebidir.</translation>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>Bu, kimliği doğrulanmamış bir ödeme talebidir.</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>Bu, kimliği doğrulanmış bir ödeme talebidir.</translation>
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
@@ -2120,10 +2126,6 @@ Adres: %4
<translation>Bitcoin: URI'siyle ilişkili ve bilginiz için muameleyle saklanacak bir mesaj. Not: Bu mesaj Bitcoin şebekesi üzerinden gönderilmeyecektir.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Bu, teyit edilmemiş bir ödeme talebidir.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Şu adrese öde:</translation>
</message>
@@ -2154,8 +2156,8 @@ Adres: %4
<translation>Mesaj &amp;imzala</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Bir adresin sizin olduğunu ispatlamak için adresinizle mesaj imzalayabilirsiniz. Oltalama saldırılarının kimliğinizi imzanızla elde etmeyi deneyebilecekleri için belirsiz 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 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>Adreslerinize yollanan bitcoinleri alabileceğiniz ispatlamak için adreslerinizle mesaj/anlaşma 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>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
@@ -2210,8 +2212,8 @@ Adres: %4
<translation>Mesaj &amp;kontrol et</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>İmza için kullanılan adresi, mesajı (satır sonları, boşluklar, sekmeler vs. karakterleri tam olarak kopyaladığınızdan emin olunuz) ve imzayı aşağıda giriniz. Bir ortadaki adam saldırısı tarafından kandırılmaya mâni olmak için imzadan, imzalı mesajın içeriğini aşan bir anlam çıkarmamaya dikkat ediniz.</translation>
+ <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>Alıcının adresini, mesajı (satır sonları, boşluklar, sekmeler vs. karakterleri tam olarak kopyaladığınızdan emin olunuz) ve imzayı aşağıda giriniz. Bir ortadaki adam saldırısı tarafından kandırılmaya mâni olmak için imzadan, imzalı mesajın içeriğini aşan bir anlam çıkarmamaya dikkat ediniz. Bunun sadece imzalayan tarafın adres ile alım yapabildiğini ispatladığını ve herhangi bir muamelenin gönderi tarafını kanıtlayamayacağını unutmayınız!</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
@@ -2477,10 +2479,6 @@ Adres: %4
<translation>Tür</translation>
</message>
<message>
- <source>Address</source>
- <translation>Adres</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Olgunlaşmamış (%1 teyit, %2 teyit ardından kullanılabilir olacaktır)</translation>
</message>
@@ -2509,6 +2507,10 @@ Adres: %4
<translation>Çevrim dışı</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Etiket</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Teyit edilmemiş</translation>
</message>
@@ -2565,8 +2567,8 @@ Adres: %4
<translation>Bu muamelede sadece izlenen bir adresin bulunup bulunmadığı.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Muamelenin alıcı adresi.</translation>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation>Muamelenin kullanıcı tanımlı niyeti/amacı.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2807,34 +2809,14 @@ Adres: %4
<translation>Dışarıdan gelen bağlantıları kabul et (varsayılan: -proxy veya -connect yoksa 1)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, şu yapılandırma dosyasında rpc parolası belirtmeniz gerekir:
-%s
-Aşağıdaki rastgele oluşturulan parolayı kullanmanız tavsiye edilir:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(bu parolayı hatırlamanız gerekli değildir)
-Kullanıcı ismi ile parolanın FARKLI olmaları gerekir.
-Dosya mevcut değilse, sadece sahibi için okumayla sınırlı izin ile oluşturunuz.
-Sorunlar hakkında bildiri almak için alertnotify unsurunu ayarlamanız tavsiye edilir;
-mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Belirtilen adrese bağlan ve daima ondan dinle. IPv6 için [makine]:port yazımını kullanınız</translation>
</message>
<message>
+ <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default: %u)</source>
+ <translation>Devamlı olarak ücretsiz muameleleri dakikada &lt;n&gt;*1000 bayt olarak sınırla (varsayılan: %u)</translation>
+ </message>
+ <message>
<source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
<translation>Tüm cüzdan muamelelerini sil ve başlangıçta -rescan ile sadece blok zincirinin parçası olanları geri getir</translation>
</message>
@@ -2847,14 +2829,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Blokların anında çözülebileceği özel bir zincir kullanan regresyon deneme kipine gir.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Hata: Muamele reddedildi! Cüzdanınızdaki madenî paraların bazıları zaten harcanmış olduğunda bu meydana gelebilir. Örneğin wallet.dat dosyasının bir kopyasını kullandıysanız ve kopyada para harcandığında ancak burada harcandığı işaretlenmediğinde.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Hata: Muamelenin meblağı, karmaşıklığı ya da yakın geçmişte alınan fonların kullanılması nedeniyle bu muamele en az %s tutarında ücret gerektirmektedir!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Bir cüzdan muamelesi değiştiğinde komutu çalıştır (komuttaki %s muamele kimliği ile değiştirilecektir)</translation>
</message>
@@ -2863,6 +2837,14 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Bu kipte -genproclimit kaç sayıda bloğun anında oluşturulduğunu kontrol eder.</translation>
</message>
<message>
+ <source>Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>Tek cüzdan muamelesinde kullanılacak azami toplam ücret; bunu çok düşük olarak ayarlamak büyük muameleleri iptal edebilir (varsayılan: %s)</translation>
+ </message>
+ <message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, &gt;%u = target size in MiB to use for block files)</source>
+ <translation>Depolama gerekliliğini eski blokları silerek düşür. Bu kip cüzdan desteğini devre dışı bırakır ve -txindex ile uyumsuzdur. İkaz: Bu ayarı geri almak tüm blok zincirini yeniden indirmeyi gerektirir. (varsayılan: 0 = blokları silmeyi devre dışı bırak, &gt;%u = MB olarak blok dosyaları için kullanılacak hedef boyut)</translation>
+ </message>
+ <message>
<source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
<translation>Betik kontrolü iş parçacıklarının sayısını belirler (%u ilâ %d, 0 = otomatik, &lt;0 = bu sayıda çekirdeği kullanma, varsayılan: %d)</translation>
</message>
@@ -2931,10 +2913,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Hata ayıklama/deneme seçenekleri:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Kendi IP adresini keşfet (varsayılan: dinlenildiğinde ve -externalip yoksa 1)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Cüzdanı yükleme ve cüzdan RPC çağrılarını devre dışı bırak</translation>
</message>
@@ -2967,10 +2945,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Hata: Disk alanı düşük!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Hata: Cüzdan kilitli, muamele oluşturulamadı!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Herhangi bir portun dinlenmesi başarısız oldu. Bunu istiyorsanız -listen=0 seçeneğini kullanınız.</translation>
</message>
@@ -2999,8 +2973,12 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Sadece &lt;net&gt; şebekesindeki düğümlere bağlan (ipv4, ipv6 veya onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Blok zinciri indeksini güncel blk000??.dat dosyalarından tekrar inşa et</translation>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>Prune negatif bir değerle yapılandırılamaz.</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>Prune kipi -txindex ile uyumsuzdur.</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -3039,6 +3017,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Cüzdan seçenekleri:</translation>
</message>
<message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>Uyarı: Bu sürüm çok eskidir; güncellemeniz gerekir!</translation>
+ </message>
+ <message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>-txindex'i değiştirmek için veritabanını -reindex kullanarak tekrar inşa etmeniz gerekmektedir</translation>
</message>
@@ -3067,14 +3049,14 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>%s veri dizininde kilit elde edilemedi. Bitcoin Çekirdeği muhtemelen hâlihazırda çalışmaktadır.</translation>
</message>
<message>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
- <translation>Devamlı olarak ücretsiz muameleleri dakikada &lt;n&gt;*1000 bayt olarak sınırla (varsayılan: %u)</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Yeni dosyaları umask 077 yerine varsayılan izinlerle oluştur (sadece devre dışı cüzdan işlevselliği ile etkilidir)</translation>
</message>
<message>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>Kendi IP adreslerini keşfet (varsayılan: dinlenildiğinde ve -externalip ya da -proxy yoksa 1)</translation>
+ </message>
+ <message>
<source>Error: Listening for incoming connections failed (listen returned error %s)</source>
<translation>Hata: İçeri gelen bağlantıların dinlenmesi başarısız oldu (dinleme %s hatasını verdi)</translation>
</message>
@@ -3095,14 +3077,34 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Kb başına BTC olarak bundan düşük ücretler muamele oluşturulması için sıfır değerinde ücret olarak kabul edilir (varsayılan: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Eğer paytxfee ayarlanmadıysa kafi derecede ücret ekleyin ki muameleler teyite vasati n blok içinde başlasın (varsayılan: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>-maxtxfee=&lt;tutar&gt; için geçersiz tutar: '%s' (Sıkışmış muameleleri önlemek için en az %s değerinde asgari aktarım ücretine eşit olmalıdır)</translation>
+ </message>
+ <message>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation>Aktardığımız ve oluşturduğumuz veri taşıyıcı muamelelerindeki azami veri boyutu (varsayılan: %u)</translation>
</message>
<message>
+ <source>Prune configured below the minimum of %d MB. Please use a higher number.</source>
+ <translation>Prune, asgari değer olan %d MB'den düşük olarak ayarlanmıştır. Lütfen daha yüksek bir sayı kullanınız.</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>Adres sayısı azaldıysa DNS sorgulamasıyla eş adresleri ara (varsayılan: 1 -connect kullanılmadıysa)</translation>
</message>
<message>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>Her vekil bağlantısı için kimlik verilerini rastgele yap. Bu, Tor akış izolasyonunu etkinleştirir (varsayılan: %u)</translation>
+ </message>
+ <message>
+ <source>Require high priority for relaying free or low-fee transactions (default: %u)</source>
+ <translation>Ücretsiz ya da düşük ücretli muamelelerin geçişi için yüksek öncelik iste (varsayılan: %u)</translation>
+ </message>
+ <message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation>Yüksek öncelikli/düşük ücretli muamelelerin azami boyutunu bayt olarak ayarla (varsayılan: %d)</translation>
</message>
@@ -3111,10 +3113,42 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Etkinse bitcoin oluşuturulmasına atanan iş parçacığı sayısını ayarla (-1 = tüm çekirdekler, varsayılan: %d)</translation>
</message>
<message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>Bu muamele, ücret düşüldükten sonra göndermek için çok düşük</translation>
+ </message>
+ <message>
<source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
<translation>Bu ürün OpenSSL projesi tarafından OpenSSL araç takımı (http://www.openssl.org/) için geliştirilen yazılımlar, Eric Young (eay@cryptsoft.com) tarafından hazırlanmış şifreleme yazılımları ve Thomas Bernard tarafından programlanmış UPnP yazılımı içerir.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>bitcoind ya da bitcoin-qt ile -server seçeneğini kullanmak için yapılandırma dosyasında bir rpc parolası belirtmeniz gerekir:
+%s
+Aşağıdaki rastgele oluşturulan parolayı kullanmanız tavsiye edilir:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(bu parolayı hatırlamanız gerekli değildir)
+Kullanıcı ismi ile parolanın FARKLI olmaları gerekir.
+Dosya mevcut değilse, sadece sahibi için okumayla sınırlı izin ile oluşturunuz.
+Sorunlar hakkında bildiri almak için alertnotify unsurunu ayarlamanız tavsiye edilir;
+mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>İkaz: -maxtxfee çok yüksek bir değere ayarlanmış! Bu denli yüksek ücretler tek bir muamelede ödenebilir.</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Uyarı: Lütfen bilgisayarınızın saat ve tarihinin doğru olduğunu kontol ediniz! Saatinizde gecikme varsa Bitcoin Çekirdeği doğru şekilde çalışamaz.</translation>
</message>
@@ -3123,10 +3157,38 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Beyaz listeye alınan eşler DoS yasaklamasına uğramazlar ve muameleleri zaten mempool'da olsalar da daima aktarılır, bu mesela bir geçit için kullanışlıdır</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>Prune olmayan kipe dönmek için veritabanını -reindex ile tekrar derlemeniz gerekir. Bu, tüm blok zincirini tekrar indirecektir</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(varsayılan: %u)</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Herkese açık REST taleplerini kabul et (varsayılan: %u)</translation>
+ </message>
+ <message>
+ <source>Activating best chain...</source>
+ <translation>En iyi zincir etkinleştiriliyor...</translation>
+ </message>
+ <message>
+ <source>Allow self signed root certificates (default: 0)</source>
+ <translation>Kendinden imzalı kök sertifikalara müsaade et (varsayılan: 0)</translation>
+ </message>
+ <message>
+ <source>Can't run with a wallet in prune mode.</source>
+ <translation>Prune kipindeki bir cüzdan ile çalışamaz.</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>-whitebind adresi çözümlenemedi: '%s'</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Başlangıçta veri klasörü seç (varsayılan: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>SOCKS5 vekil sunucusu vasıtasıyla bağlan</translation>
</message>
@@ -3143,6 +3205,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>wallet.dat dosyasının yüklenmesinde hata: Cüzdan Bitcoin Çekirdeğinin daha yeni bir sürümünü gerektirmektedir</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>Veritabanından okumada hata, kapatılıyor.</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>Hata: Deskteklenmeyen -tor argümanı bulundu, -onion kullanınız.</translation>
</message>
@@ -3159,6 +3225,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Başlatma sınaması başarısız oldu. Bitcoin Çekirdeği kapatılıyor.</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>-maxtxfee=&lt;tutar&gt; için geçersiz tutar: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>-minrelaytxfee=&lt;amount&gt; için geçersiz meblağ: '%s'</translation>
</message>
@@ -3175,10 +3245,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>-whitelist: '%s' unsurunda geçersiz bir ağ maskesi belirtildi</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Hafızada en çok &lt;n&gt; bağlanılamaz blok tut (varsaylan: %u)</translation>
- </message>
- <message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>Hafızada en çok &lt;n&gt; bağlanılamaz muamele tut (varsayılan: %u)</translation>
</message>
@@ -3191,10 +3257,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Düğüm röle seçenekleri:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Başlangıçta bloğu göster, blok indeksinde bulunduysa</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>RPC SSL seçenekleri: (SSL kurulumu yönergeleri için Bitcoin vikisine bakınız)</translation>
</message>
@@ -3203,6 +3265,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>RPC sunucu seçenekleri:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>Kalıcı HTTP bağlantıları için RPC desteği (varsayılan: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>Her &lt;n&gt; şebeke mesajından rastgele 1 mesajı görmezden gel</translation>
</message>
@@ -3211,6 +3277,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Her &lt;n&gt; şebeke mesajından rastgele birini bulanıklaştır</translation>
</message>
<message>
+ <source>Rebuild block chain index from current blk000??.dat files on startup</source>
+ <translation>Başlangıçta blok zinciri indeksini güncel blk000??.dat dosyalarından tekrar inşa et</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>Trace/hata ayıklama verilerini debug.log dosyası yerine konsola gönder</translation>
</message>
@@ -3219,10 +3289,22 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Muameleleri mümkünse ücretsiz olarak gönder (varsayılan: %u)</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Ödeme talebi için SSL kök sertifikalarını belirle (varsayılan: -system-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Lisan belirt, mesela "de_De" (varsayılan: sistem dili)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Tüm hata ayıklama seçeneklerini göster (kullanımı: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Başlatıldığında başlangıç ekranını göster (varsayılan: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>İstemci başlatıldığında debug.log dosyasını küçült (varsayılan: -debug bulunmadığında 1)</translation>
</message>
@@ -3231,6 +3313,14 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Muamelenin imzalanması başarısız oldu</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Küçültülmüş olarak başlat</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>Muamele meblağı ücreti ödemek için çok düşük</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Bu, deneysel bir yazılımdır.</translation>
</message>
@@ -3243,10 +3333,18 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Muamele tutarının pozitif olması lazımdır</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Ücret politikası için çok büyük muamele</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Muamele çok büyük</translation>
</message>
<message>
+ <source>UI Options:</source>
+ <translation>Arayüz Seçenkleri:</translation>
+ </message>
+ <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation>Bu bilgisayarda %s unsuruna bağlanılamadı (bağlanma %s hatasını verdi)</translation>
</message>
@@ -3267,10 +3365,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Uyarı</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Uyarı: Bu sürüm çok eskidir, güncellemeniz gerekir!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Uyarı: Deskteklenmeyen -benchmark argümanı görmezden gelindi, -debug=bench kullanınız.</translation>
</message>
@@ -3339,10 +3433,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>-checkblocks'un blok kontrolünün ne kadar kapsamlı olacağı (0 ilâ 4, varsayılan: %u)</translation>
</message>
<message>
- <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
- <translation>Eğer paytxfee ayarlanmadıysa, kafi derecede ücret ekleyin ki muameleler vasati n blok içinde teyit edilsin (varsayılan: %u)</translation>
- </message>
- <message>
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
<translation>Blok oluşturulduğunda muamele önceliğini ve kB başı ücreti kütüğe al (varsayılan: %u)</translation>
</message>
@@ -3419,6 +3509,10 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Eşler ile en çok &lt;n&gt; adet bağlantı kur (varsayılan: %u)</translation>
</message>
<message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>Cüzdanın muameleleri yayınlamasını sağla</translation>
+ </message>
+ <message>
<source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
<translation>Her bağlantı için azami alım tamponu, &lt;n&gt;*1000 bayt (varsayılan: %u)</translation>
</message>
@@ -3435,10 +3529,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Hata ayıklama verilerinin önüne zaman damgası ekle (varsayılan: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Başlangıçta blok ağacını göster (varsayılan: %u)</translation>
- </message>
- <message>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation>Veri taşıyıcı muameleleri oluştur ve aktar (varsayılan: %u)</translation>
</message>
@@ -3515,10 +3605,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>-paytxfee=&lt;meblağ&gt; için geçersiz meblağ: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Geçersiz meblağ</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Yetersiz bakiye</translation>
</message>
@@ -3551,10 +3637,6 @@ mesela: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
<translation>Yükleme tamamlandı</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>%s seçeneğini kullanmak için</translation>
- </message>
- <message>
<source>Error</source>
<translation>Hata</translation>
</message>
diff --git a/src/qt/locale/bitcoin_uk.ts b/src/qt/locale/bitcoin_uk.ts
index 9b5f4c9f4e..92e0cc75c4 100644
--- a/src/qt/locale/bitcoin_uk.ts
+++ b/src/qt/locale/bitcoin_uk.ts
@@ -1,9 +1,9 @@
-<TS language="uk" version="2.0">
+<TS language="uk" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Двічі клікніть на адресу чи назву для їх зміни</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>Клік правою кнопкою для редагування адреси або мітки</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>Змінити пароль</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Ввести старий та новий паролі для гаманця.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Підтвердити шифрування гаманця</translation>
</message>
@@ -188,10 +184,6 @@
<translation>Введіть нову кодову фразу для гаманця.&lt;br/&gt;Будь ласка, використовуйте кодові фрази що містять &lt;b&gt; як мінімум десять випадкових символів &lt;/b&gt; або &lt;b&gt; як мінімум вісім слів &lt;/b&gt;.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Біткоін-клієнт буде закрито для завершення процесу шифрування. Пам'ятайте, що шифрування гаманця не може повністю захистити ваші біткоіни від крадіжки, у випадку якщо ваш комп'ютер буде інфіковано шкідливими програмами.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Не вдалося зашифрувати гаманець</translation>
</message>
@@ -311,10 +303,6 @@
<translation>Відправити монети на вказану адресу</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Редагувати параметри</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Резервне копіювання гаманця в інше місце</translation>
</message>
@@ -452,7 +440,7 @@
</message>
<message>
<source>%1 behind</source>
- <translation>%1 позаду</translation>
+ <translation>%1 тому</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -478,10 +466,6 @@
<source>Up to date</source>
<translation>Синхронізовано</translation>
</message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>Оброблено %n блок історії транзакцій.</numerusform><numerusform>Оброблено %n блоки історії транзакцій.</numerusform><numerusform>Оброблено %n блоків історії транзакцій.</numerusform></translation>
- </message>
<message>
<source>Catching up...</source>
<translation>Синхронізується...</translation>
@@ -495,18 +479,6 @@
<translation>Отримані транзакції</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Дата: %1
-Кількість: %2
-Тип: %3
-Адреса: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>&lt;b&gt;Зашифрований&lt;/b&gt; гаманець &lt;b&gt;розблоковано&lt;/b&gt;</translation>
</message>
@@ -709,10 +681,6 @@ Address: %4
<translation>ні</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Ця позначка буде червоною, якщо розмір транзакції вищий за 1000 байт.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Це означає, що необхідно внести комісію (щонайменше %1 за КБ).</translation>
</message>
@@ -725,14 +693,6 @@ Address: %4
<translation>Транзакції з вищим пріоритетом мають більше шансів бути включеними до блоку.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Ця позначка буде червоною, якщо пріоритет транзакції нижчий за «середній».</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Ця позначка буде червоною, якщо будь хто з отримувачів отримає менше ніж %1.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(немає назви)</translation>
</message>
@@ -853,30 +813,6 @@ Address: %4
<source>command-line options</source>
<translation>параметри командного рядка</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>Параметри інтерфейсу</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>Встановлення мови, наприклад "de_DE" (типово: системна)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Запускати згорнутим</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Вказати кореневі SSL-сертифікати для запиту платежу (типово: -системні-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>Показувати заставку під час запуску (типово: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Обрати каталог даних під час запуску (типово: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -959,14 +895,6 @@ Address: %4
<translation>&amp;Головні</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Автоматично запускати гаманець при вході до системи.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>&amp;Запускати гаманець при вході в систему</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>Розмір &amp;кешу бази даних</translation>
</message>
@@ -1079,10 +1007,6 @@ Address: %4
<translation>Мінімізувати &amp;у трей</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 Quit in the menu.</source>
- <translation>Згортати замість закриття. Якщо ця опція включена, програма закриється лише після вибору відповідного пункту в меню.</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>Згортати замість закритт&amp;я</translation>
</message>
@@ -1095,10 +1019,6 @@ Address: %4
<translation>Мов&amp;а інтерфейсу користувача:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Встановлює мову інтерфейсу. Зміни набудуть чинності після перезапуску Bitcoin.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>В&amp;имірювати монети в:</translation>
</message>
@@ -1135,10 +1055,6 @@ Address: %4
<translation>Для застосування змін необхідно перезапустити клієнта.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Клієнт вимкнеться, продовжувати?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Ця зміна вступить в силу після перезапуску клієнта</translation>
</message>
@@ -1207,7 +1123,7 @@ Address: %4
</message>
<message>
<source>Recent transactions</source>
- <translation>Недавні транзакції</translation>
+ <translation>Останні транзакції</translation>
</message>
<message>
<source>Unconfirmed transactions to watch-only addresses</source>
@@ -1221,10 +1137,6 @@ Address: %4
<source>Current total balance in watch-only addresses</source>
<translation>Поточний сукупний баланс в адресах для спостереження</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>не синхронізовано</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1245,10 +1157,6 @@ Address: %4
<translation>Мережа запиту платежу не є мережею клієнта.</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>Запит платежу прострочено.</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>Запит платежу не ініціалізовано.</translation>
</message>
@@ -1289,6 +1197,10 @@ Address: %4
<translation>Відшкодування з %1</translation>
</message>
<message>
+ <source>Payment request DoS protection</source>
+ <translation>Оплата потребує захисту DoS</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>Помилка зв'язку з %1: %2</translation>
</message>
@@ -1316,10 +1228,6 @@ Address: %4
<translation>Клієнт користувача</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>Адреса/Ім'я хоста</translation>
- </message>
- <message>
<source>Ping Time</source>
<translation>Затримка</translation>
</message>
@@ -1351,14 +1259,6 @@ Address: %4
<translation>%1 с</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>МЕРЕЖА</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>НЕВІДОМО</translation>
- </message>
- <message>
<source>None</source>
<translation>Відсутні</translation>
</message>
@@ -1557,18 +1457,10 @@ Address: %4
<translation>Файл звіту зневадження</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Відкрийте файл журналу налагодження Bitcoin з поточного каталогу даних. Це може зайняти кілька секунд для великих файлів журналів.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Очистити консоль</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Вітаємо у консолі Bitcoin RPC.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Використовуйте стрілки вгору вниз для навігації по історії, і &lt;b&gt;Ctrl-L&lt;/b&gt; для очищення екрана.</translation>
</message>
@@ -1830,7 +1722,7 @@ Address: %4
</message>
<message>
<source>After Fee:</source>
- <translation>Після комісії</translation>
+ <translation>Після комісії:</translation>
</message>
<message>
<source>Change:</source>
@@ -1857,14 +1749,6 @@ Address: %4
<translation>згорнути налаштування оплат</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>Мінімізувати</translation>
- </message>
- <message>
- <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
- <translation>Якщо оплата користувача встановлюється в 1000 Satoshi і розмір передачі всього 250 байт, то "за кілобайт" платить тільки 250 Satoshi, в той час як "щонайменше" платить 1000 satoshis. Для передач більших, ніж кілобайт обоє платять за кілобайт.</translation>
- </message>
- <message>
<source>per kilobyte</source>
<translation>за кілобайт</translation>
</message>
@@ -1910,7 +1794,7 @@ Address: %4
</message>
<message>
<source>Send as zero-fee transaction if possible</source>
- <translation>Надіслати як нульовий плата за передачу, якщо це можливо</translation>
+ <translation>Надіслати транзакцію без сплати комісії, якщо це можливо</translation>
</message>
<message>
<source>(confirmation may take longer)</source>
@@ -1993,10 +1877,6 @@ Address: %4
<translation>або</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>Адреса отримувача невірна, будь ласка перепровірте.</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>Кількість монет для відправлення повинна бути більше 0.</translation>
</message>
@@ -2009,10 +1889,6 @@ Address: %4
<translation>Сума перевищить ваш баланс, якщо комісія %1 буде додана до вашої транзакції.</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>Знайдено адресу що дублюється. Відправлення на кожну адресу дозволяється лише один раз на кожну операцію переказу.</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>Не вдалося створити транзакцію!</translation>
</message>
@@ -2021,7 +1897,7 @@ Address: %4
<translation>Транзакцію відхилено! Це може статись, якщо декілька монет з вашого гаманця вже використані, наприклад, якщо ви використовуєте одну копію гаманця (wallet.dat), а монети були використані з іншої копії, але не позначені як використані в цій.</translation>
</message>
<message>
- <source>A fee higher than %1 is considered an insanely high fee.</source>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation>Плата вища, ніж %1 вважається шалено високою.</translation>
</message>
<message>
@@ -2029,10 +1905,6 @@ Address: %4
<translation>Платити тільки мінімальний збір у розмірі %1</translation>
</message>
<message>
- <source>Estimated to begin confirmation within %1 block(s).</source>
- <translation>Розрахунковий початок підтвердження протягом %1 блоку(ів).</translation>
- </message>
- <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>Увага: Неправильна Bitcoin-адреса</translation>
</message>
@@ -2108,10 +1980,6 @@ Address: %4
<translation>Повідомлення:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>Це перевірений запит платежу.</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>Введіть мітку для цієї адреси для додавання її в список використаних адрес</translation>
</message>
@@ -2120,10 +1988,6 @@ Address: %4
<translation>Повідомлення, що було додане до bitcoin:URI та буде збережено разом з транзакцією для довідки. Примітка: Це повідомлення не буде відправлено в мережу Bitcoin.</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>Це неперевірений запит платежу.</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>Отримувач:</translation>
</message>
@@ -2154,10 +2018,6 @@ Address: %4
<translation>&amp;Підписати повідомлення</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>Ви можете підписувати повідомлення зі своїми адресами, щоб довести, що ви є їх власником. Остерігайтеся підписувати будь-що незрозуміле, так як за допомогою фішинг-атаки вас можуть спробувати обдурити для отримання вашого підпису під чужими словами. Підписуйте тільки ті повідомлення, з якими ви повністю згодні.</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>Адреса Bitcoin для підпису цього повідомлення</translation>
</message>
@@ -2210,10 +2070,6 @@ Address: %4
<translation>Перевірити повідомлення</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>Введіть нижче адресу підпису, повідомлення (впевніться, що ви точно скопіювали символи завершення рядку, табуляцію, пробіли тощо) та підпис для перевірки повідомлення. Впевніться, що в підпис не було додано зайвих символів: це допоможе уникнути атак типу «людина посередині».</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>Адреса Bitcoin, якою було підписано це повідомлення</translation>
</message>
@@ -2477,10 +2333,6 @@ Address: %4
<translation>Тип</translation>
</message>
<message>
- <source>Address</source>
- <translation>Адреса</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>Незрілі (%1 підтверджень, будуть доступні після %2)</translation>
</message>
@@ -2509,6 +2361,10 @@ Address: %4
<translation>Поза мережею</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Назва</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>Не підтверджено</translation>
</message>
@@ -2565,10 +2421,6 @@ Address: %4
<translation>Показує, чи було залучено адресу для спостереження в цій транзакції.</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Адреса отримувача транзакції.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Сума, додана чи знята з балансу.</translation>
</message>
@@ -2807,30 +2659,6 @@ Address: %4
<translation>Приймати підключення ззовні (типово: 1 за відсутності -proxy чи -connect)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, ви повинні встановити rpcpassword в файлі конфігурації:
-%s
-Рекомендується використати такий випадковий пароль:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(ви не повинні пам'ятати цей пароль)
-Ім’я користувача та пароль ПОВИННІ бути різними.
-Якщо файлу не існує, створіть його, обмеживши доступ правом читання для власника.
-Також рекомендується використовувати alertnotify для того, щоб отримувати сповіщення про проблеми;
-наприклад: alertnotify=echo %%s | mail -s "Сповіщення Bitcoin" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>Прив'язатися до даної адреси та прослуховувати її. Використовуйте запис виду [хост]:порт для IPv6</translation>
</message>
@@ -2847,14 +2675,6 @@ rpcpassword=%s
<translation>Ввійти в режим регресивного тестування, що використовує спеціальний ланцюг з миттєвим знаходженням блоків.</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>Помилка: транзакцію було відхилено. Це може статись, якщо декілька монет з вашого гаманця вже використані, наприклад, якщо ви використовуєте одну копію гаманця (wallet.dat), а монети були використані з іншої копії, але не позначені як використані в цій.</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>Помилка: Ця транзакція потребує додавання комісії щонайменше в %s через її розмір, складність, або внаслідок використання недавно отриманих коштів!</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>Виконати команду, коли транзакція гаманця зміниться (замість %s в команді буде підставлено ідентифікатор транзакції)</translation>
</message>
@@ -2931,10 +2751,6 @@ rpcpassword=%s
<translation>Параметри тестування/налагодження:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>Визначити власну IP-адресу (типово: 1 при прослуховуванні та за відсутності -externalip)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>Не завантажувати гаманець та вимкнути звернення до нього через RPC</translation>
</message>
@@ -2967,10 +2783,6 @@ rpcpassword=%s
<translation>Помилка: Мало вільного місця на диску!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>Помилка: Гаманець заблокований, неможливо створити транзакцію!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>Не вдалося слухати на жодному порту. Використовуйте -listen=0, якщо ви хочете цього.</translation>
</message>
@@ -2999,10 +2811,6 @@ rpcpassword=%s
<translation>Підключити тільки до вузлів в мережі &lt;net&gt; (ipv4, ipv6 або onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>Перебудувати індекс ланцюжка блоків з поточних файлів blk000??.dat</translation>
- </message>
- <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>Встановити розмір кешу бази даних в мегабайтах (від %d до %d, типово: %d)</translation>
</message>
@@ -3067,10 +2875,6 @@ rpcpassword=%s
<translation>Не вдалося встановити блокування на каталог даних %s. Bitcoin Core, ймовірно, вже запущений.</translation>
</message>
<message>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
- <translation>Обмежити швидкість передачі безкоштовних транзакцій до &lt;n&gt;*1000 байтів за хвилину (типово: %u)</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>Створювати нові файли з типовими для системи атрибутами доступу замість маски 077 (діє тільки при вимкненому гаманці)</translation>
</message>
@@ -3095,6 +2899,10 @@ rpcpassword=%s
<translation>Комісії (в BTC/КБ), що менші за вказану, вважатимуться нульовими (для створення транзакції) (типово: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>Якщо параметр paytxfee не встановлено, включити комісію для отримання перших підтверджень транзакцій протягом n блоків (типово: %u)</translation>
+ </message>
+ <message>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation>Максимальний розмір даних в транзакціях носіїв даних, що ми передаємо і добуваємо (за замовчуванням: %u)</translation>
</message>
@@ -3115,6 +2923,34 @@ rpcpassword=%s
<translation>Цей продукт включає в себе програмне забезпечення, розроблене в рамках проекту OpenSSL &lt;https://www.openssl.org/&gt;, криптографічне програмне забезпечення, написане Еріком Янгом, та функції для роботи з UPnP, написані Томасом Бернардом.</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>Для використання bitcoind, або bitcoin-qt з параметром -server, ви повинні встановити rpcpassword в файлі конфігурації:
+%s
+Рекомендується використати такий випадковий пароль:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(вам не треба запам'ятовувати цей пароль)
+Ім'я користувача та пароль ПОВИННІ бути різними.
+Якщо файлу не існує, створіть його, обмеживши доступ правом читання для власника.
+Також рекомендується використовувати alertnotify для того, щоб отримувати сповіщення про проблеми;
+наприклад: alertnotify=echo %%s | mail -s "Сповіщення Bitcoin" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>Увага: установлено дуже велике значення -maxtxfee! Такі великі комісії можуть бути сплачені в окремій транзакції.</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>Увага: будь ласка, перевірте дату і час на своєму комп'ютері! Якщо ваш годинник йде неправильно, Bitcoin Core може працювати некоректно.</translation>
</message>
@@ -3123,10 +2959,18 @@ rpcpassword=%s
<translation>Учасники, що знаходяться в білому списку, не можуть бути заблоковані за DoS та їхні транзакції завжди ретранслюватимуться (навіть якщо вони є в пам'яті), що може бути корисним, наприклад, для шлюзу</translation>
</message>
<message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>Приймати публічні REST-запити (типово: %u)</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>Не вдалося розпізнати адресу для -whitebind: «%s»</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Обрати каталог даних під час запуску (типово: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>Підключитись через SOCKS5-проксі</translation>
</message>
@@ -3159,6 +3003,10 @@ rpcpassword=%s
<translation>Не вдалося пройти базові перевірки під час ініціалізації. Bitcoin Core буде вимкнено.</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>Неприпустима сума для -maxtxfee = &lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>Вказано некоректну суму для параметру -minrelaytxfee: «%s»</translation>
</message>
@@ -3175,10 +3023,6 @@ rpcpassword=%s
<translation>Вказано неправильну маску підмережі для -whitelist: «%s»</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>Утримувати в пам'яті щонайбільше &lt;n&gt; блоків, не під'єднаних до основного ланцюжка (типово: %u)</translation>
- </message>
- <message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>Утримувати в пам'яті щонайбільше &lt;n&gt; транзакцій, що споживають невідомі входи (типово: %u)</translation>
</message>
@@ -3191,10 +3035,6 @@ rpcpassword=%s
<translation>Параметри вузла ретрансляції:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>Роздрукувати блок під час запуску (якщо він буде знайдений в індексі)</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>Параметри RPC SSL: (див. Bitcoin Wiki для налаштування SSL)</translation>
</message>
@@ -3216,13 +3056,25 @@ rpcpassword=%s
</message>
<message>
<source>Send transactions as zero-fee transactions if possible (default: %u)</source>
- <translation>Встановити операцію надсилання, як неоплатну операцію, якщо це можливо (за замовчуванням: %u)</translation>
+ <translation>Не сплачувати комісію за надсилання транзакцій, якщо це можливо (типово: %u)</translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Вказати кореневі SSL-сертифікати для запиту платежу (типово: -системні-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>Встановлення мови, наприклад "de_DE" (типово: системна)</translation>
</message>
<message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>Показати всі налагоджувальні параметри (використання: --help -help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>Показувати заставку під час запуску (типово: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>Стискати файл debug.log під час старту клієнта (типово: 1 коли відсутній параметр -debug)</translation>
</message>
@@ -3231,6 +3083,10 @@ rpcpassword=%s
<translation>Підписання транзакції не вдалося</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>Запускати згорнутим</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>Це програмне забезпечення є експериментальним.</translation>
</message>
@@ -3243,6 +3099,10 @@ rpcpassword=%s
<translation>Суми монет у транзакції мають бути позитивними</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>Транзакція занадто велика для правил комісії</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>Транзакція занадто велика</translation>
</message>
@@ -3267,10 +3127,6 @@ rpcpassword=%s
<translation>Попередження</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>Увага: Поточна версія застаріла, необхідне оновлення!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>Увага: Параметр -benchmark не підтримується та буде проігнорований, використовуйте -debug=bench.</translation>
</message>
@@ -3339,10 +3195,6 @@ rpcpassword=%s
<translation>Рівень ретельності перевірки блоків (0-4, типово: %u)</translation>
</message>
<message>
- <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
- <translation>Якщо параметр paytxfee не встановлено, включити комісію, достатню для підтвердження транзакцій протягом n блоків (типово: %u)</translation>
- </message>
- <message>
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
<translation>Записувати в лог-файл пріоритет транзакції та комісію за кБ під час добування блоків (типово: %u)</translation>
</message>
@@ -3435,10 +3287,6 @@ rpcpassword=%s
<translation>Доповнювати налагоджувальний вивід відміткою часу (типово: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>Роздрукувати дерево блоків під час запуску (типово: %u)</translation>
- </message>
- <message>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation>Ретранслювати та створювати транзакції носіїв даних (типово: %u)</translation>
</message>
@@ -3515,10 +3363,6 @@ rpcpassword=%s
<translation>Помилка у величині комісії -paytxfee=&lt;amount&gt;: «%s»</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>Некоректна кількість</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>Недостатньо коштів</translation>
</message>
@@ -3551,10 +3395,6 @@ rpcpassword=%s
<translation>Завантаження завершене</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>Щоб використати опцію %s</translation>
- </message>
- <message>
<source>Error</source>
<translation>Помилка</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ur_PK.ts b/src/qt/locale/bitcoin_ur_PK.ts
index 86f3226269..9148626f57 100644
--- a/src/qt/locale/bitcoin_ur_PK.ts
+++ b/src/qt/locale/bitcoin_ur_PK.ts
@@ -1,11 +1,7 @@
-<TS language="ur_PK" version="2.0">
+<TS language="ur_PK" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>ایڈریس یا لیبل میں ترمیم کرنے پر ڈبل کلک کریں</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>نیا ایڈریس بنائیں</translation>
</message>
@@ -241,8 +237,8 @@
<translation>ٹائپ</translation>
</message>
<message>
- <source>Address</source>
- <translation> پتہ</translation>
+ <source>Label</source>
+ <translation>چٹ</translation>
</message>
<message>
<source>Sent to</source>
@@ -327,10 +323,6 @@
<translation>یہ مدد کا پیغام</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>غلط رقم</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>ناکافی فنڈز</translation>
</message>
diff --git a/src/qt/locale/bitcoin_uz@Cyrl.ts b/src/qt/locale/bitcoin_uz@Cyrl.ts
index 54e649aede..b8807afb13 100644
--- a/src/qt/locale/bitcoin_uz@Cyrl.ts
+++ b/src/qt/locale/bitcoin_uz@Cyrl.ts
@@ -1,11 +1,7 @@
-<TS language="uz@Cyrl" version="2.0">
+<TS language="uz@Cyrl" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Манзил ёки ёрлиқни таҳрирлаш учун икки марта босинг</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Янги манзил яратинг</translation>
</message>
@@ -156,10 +152,6 @@
<translation>Махфий сузни узгартириш</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>Ҳамёнга эски ва янги паролларингизни киритинг.</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>Ҳамённи кодлашни тасдиқлаш</translation>
</message>
@@ -188,10 +180,6 @@
<translation>Ҳамёнга янги махфий сўз киритинг.&lt;br/&gt;Илтимос, &lt;b&gt;ўнта ёки тасодифий белгили&lt;/b&gt; махфий сўздан фойдаланинг ёки &lt;b&gt;саккизта ёки кўпроқ сўзлар&lt;/b&gt;дан фойдаланинг.</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>Bitcoin кодлаш жараёнини тугатиш учун ёпилади. Ёдда сақланг: ҳамёнингизни кодлаш компьютерингизни зарарлаган зарарли дастурлар томонидан bitcoin тангаларингизни ўғирланишидан тўлиқ ҳимоя қила олмайди.</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>Ҳамённи кодлаш амалга ошмади</translation>
</message>
@@ -311,10 +299,6 @@
<translation>Тангаларни Bitcoin манзилига жўнатиш</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>Bitcoin учун мослаш танловларини ўзгартириш</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>Ҳамённи бошқа манзилга заҳиралаш</translation>
</message>
@@ -491,18 +475,6 @@
<translation>Кирувчи операция</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>Санаси: %1
-Миқдори: %2
-Тури: %3
-Манзили: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>Ҳамён &lt;b&gt;кодланган&lt;/b&gt; ва вақтинча &lt;b&gt;қулфдан чиқарилган&lt;/b&gt;</translation>
</message>
@@ -693,10 +665,6 @@ Address: %4
<translation>йўқ</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>Агар ўтказманинг ҳажми 1000 байтдан ошса, ёрлиқ қизаради.</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>Бу дегани солиқ ҳар кб учун камида %1 талаб қилинади.</translation>
</message>
@@ -709,14 +677,6 @@ Address: %4
<translation>Юқори муҳимликка эга бўлган ўтказмалар тезда блокнинг ичига қўшимча олади.</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>Агар муҳимлиги "ўртача"дан паст бўлса, ушбу ёрлиқ қизил бўлиб ёнади.</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>Агар қабул қилувчи %1дан кичик миқдорни қабул қилса, ушбу ёрлиқ қизил бўлиб ёнади.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(Ёрлик мавжуд эмас)</translation>
</message>
@@ -833,22 +793,6 @@ Address: %4
<source>command-line options</source>
<translation>буйруқлар қатори орқали мослаш</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI мосламалари</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>Йиғилганларни бошлаш</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>Тўлов сўровлари учун SSL асос сертификатларини ўрнатиш (стандарт: -system-)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>Ишга тушиш вақтида маълумотлар директориясини танлаш (стандарт: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -923,14 +867,6 @@ Address: %4
<translation>&amp;Асосий</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>Тизимга киргандан сўнг Bitcoin дастури автоматик ишга туширилсин.</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>Тизимга кирганда Bitcoin &amp;ишга туширилсин</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>&amp;Маълумотлар базаси кеши</translation>
</message>
@@ -995,10 +931,6 @@ Address: %4
<translation>Фойдаланувчи интерфейси &amp;тили:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>Фойдаланувчи тили интерфесини шу ерда ўрнатиш мумкин. TУшбу созлама Bitcoin қайта ишга туширилганда кучга киради.</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>Миқдорларни кўрсатиш учун &amp;қисм:</translation>
</message>
@@ -1027,10 +959,6 @@ Address: %4
<translation>Ўзгаришлар амалга ошиши учун мижозни қайта ишга тушириш талаб қилинади.</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>Мижоз ўчирилади. Давом эттиришни хоҳлайсизми?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>Ушбу ўзгариш мижозни қайтадан ишга туширишни талаб қилади.</translation>
</message>
@@ -1127,14 +1055,6 @@ Address: %4
<translation>%1 с</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>ТАРМОҚ</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>НОМАЪЛУМ</translation>
- </message>
- <message>
<source>None</source>
<translation>Йўқ</translation>
</message>
@@ -1297,18 +1217,10 @@ Address: %4
<translation>Тузатиш журнали файли</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>Жорий махлумотлар директориясидан Bitcoin тузатиш журнали файлини очинг. Бу катта журнал файллари учун бир неча сонияни олиши мумкин.</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>Терминални тозалаш</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>Bitcoin RPC терминлга хуш келибсиз.</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>Тарихни кўриш учун тепага ва пастга кўрсаткичларидан фойдаланинг, экранни тозалаш учун &lt;b&gt;Ctrl-L&lt;/b&gt; тугмалар бирикмасидан фойдаланинг.</translation>
</message>
@@ -1392,6 +1304,26 @@ Address: %4
<translation>Сўралган тўлов тарихи</translation>
</message>
<message>
+ <source>&amp;Request payment</source>
+ <translation>Тўловни &amp;сўраш</translation>
+ </message>
+ <message>
+ <source>Show the selected request (does the same as double clicking an entry)</source>
+ <translation>Танланган сўровни кўрсатиш (икки марта босилганда ҳам бир хил амал бажарилсин)</translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation>Кўрсатиш</translation>
+ </message>
+ <message>
+ <source>Remove the selected entries from the list</source>
+ <translation>Танланганларни рўйхатдан ўчириш</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation>Ўчириш</translation>
+ </message>
+ <message>
<source>Copy label</source>
<translation>Ёрликни нусхала</translation>
</message>
@@ -1693,10 +1625,6 @@ Address: %4
<translation>Тури</translation>
</message>
<message>
- <source>Address</source>
- <translation>Манзил</translation>
- </message>
- <message>
<source>Open until %1</source>
<translation>%1 гача очиш</translation>
</message>
@@ -1713,6 +1641,10 @@ Address: %4
<translation>Яратилди, аммо қабул қилинмади</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>Ёрлиқ</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation>Ёрдамида қабул қилиш</translation>
</message>
@@ -1745,10 +1677,6 @@ Address: %4
<translation>Пул ўтказмаси тури</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>Ўтказиладиган жараён манзили.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>Миқдор ўчирилган ёки балансга қўшилган.</translation>
</message>
@@ -1919,10 +1847,22 @@ Address: %4
<translation>Синов тармоғидан фойдаланинг</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>Ишга тушиш вақтида маълумотлар директориясини танлаш (стандарт: 0)</translation>
+ </message>
+ <message>
<source>Information</source>
<translation>Маълумот</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>Тўлов сўровлари учун SSL асос сертификатларини ўрнатиш (стандарт: -system-)</translation>
+ </message>
+ <message>
+ <source>Start minimized</source>
+ <translation>Йиғилганларни бошлаш</translation>
+ </message>
+ <message>
<source>Username for JSON-RPC connections</source>
<translation>JSON-RPC уланишлари учун фойдаланувчи номи</translation>
</message>
diff --git a/src/qt/locale/bitcoin_vi.ts b/src/qt/locale/bitcoin_vi.ts
index 3ca5605883..38ebd77b71 100644
--- a/src/qt/locale/bitcoin_vi.ts
+++ b/src/qt/locale/bitcoin_vi.ts
@@ -1,11 +1,7 @@
-<TS language="vi" version="2.0">
+<TS language="vi" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>Click đúp chuột để chỉnh sửa địa chỉ hoặc nhãn dữ liệu</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation>Tạo một địa chỉ mới</translation>
</message>
@@ -165,8 +161,8 @@
<context>
<name>TransactionTableModel</name>
<message>
- <source>Address</source>
- <translation>Địa chỉ</translation>
+ <source>Label</source>
+ <translation>Nhãn dữ liệu</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_vi_VN.ts b/src/qt/locale/bitcoin_vi_VN.ts
index bf76c8638a..18d1a252e7 100644
--- a/src/qt/locale/bitcoin_vi_VN.ts
+++ b/src/qt/locale/bitcoin_vi_VN.ts
@@ -1,73 +1,569 @@
-<TS language="vi_VN" version="2.0">
+<TS language="vi_VN" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
+ <source>Right-click to edit address or label</source>
+ <translation>Nhấn chuột phải để sửa địa chỉ hoặc nhãn</translation>
+ </message>
+ <message>
<source>Create a new address</source>
<translation>Tạo một địa chỉ mới</translation>
</message>
+ <message>
+ <source>&amp;New</source>
+ <translation>&amp;Mới</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation>Copy địa chỉ được chọn vào clipboard</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation>&amp;Copy</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation>Đó&amp;ng</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Address</source>
+ <translation>&amp;Copy Địa Chỉ</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation>Xóa địa chỉ hiện tại từ danh sách</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>Xuất dữ liệu trong mục hiện tại ra file</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation>X&amp;uất</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation>&amp;Xó&amp;a</translation>
+ </message>
+ <message>
+ <source>Choose the address to send coins to</source>
+ <translation>Chọn địa chỉ để gửi coin tới</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation>Chọn địa chỉ để nhận coin</translation>
+ </message>
+ <message>
+ <source>C&amp;hoose</source>
+ <translation>C&amp;họn</translation>
+ </message>
+ <message>
+ <source>Sending addresses</source>
+ <translation>Địa chỉ gửi</translation>
+ </message>
+ <message>
+ <source>Receiving addresses</source>
+ <translation>Địa chỉ nhận</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Label</source>
+ <translation>Copy &amp;Nhãn</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation>&amp;Sửa</translation>
+ </message>
+ <message>
+ <source>Export Address List</source>
+ <translation>Xuất Danh Sách Địa Chỉ</translation>
+ </message>
+ <message>
+ <source>Comma separated file (*.csv)</source>
+ <translation>Comma separated file (*.csv)</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation>Xuất Đã Thất Bại</translation>
+ </message>
</context>
<context>
<name>AddressTableModel</name>
- </context>
+ <message>
+ <source>Label</source>
+ <translation>Nhãn</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation>Địa chỉ</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation>(không nhãn)</translation>
+ </message>
+</context>
<context>
<name>AskPassphraseDialog</name>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation>Hội thoại Passphrase</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation>Điền passphrase</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation>Passphrase mới</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation>Điền lại passphrase</translation>
+ </message>
+ <message>
+ <source>Encrypt wallet</source>
+ <translation>Mã hóa ví</translation>
+ </message>
+ <message>
+ <source>Unlock wallet</source>
+ <translation>Mở khóa ví</translation>
+ </message>
+ <message>
+ <source>Decrypt wallet</source>
+ <translation>Giải mã ví</translation>
+ </message>
+ <message>
+ <source>Wallet encrypted</source>
+ <translation>Ví đã được mã hóa</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
+ <message>
+ <source>&amp;Overview</source>
+ <translation>&amp;Tổng quan</translation>
+ </message>
+ <message>
+ <source>Node</source>
+ <translation>Node</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation>T&amp;hoát</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation>Thoát chương trình</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation>Về &amp;Qt</translation>
+ </message>
+ <message>
+ <source>Show information about Qt</source>
+ <translation>Xem thông tin về Qt</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI...</source>
+ <translation>Mở &amp;URI...</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core client</source>
+ <translation>Bitcoin Core client</translation>
+ </message>
+ <message>
+ <source>Bitcoin</source>
+ <translation>Bitcoin</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation>Ví</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation>&amp;Gửi</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation>&amp;Nhận</translation>
+ </message>
+ <message>
+ <source>&amp;Show / Hide</source>
+ <translation>Ẩn / H&amp;iện</translation>
+ </message>
+ <message>
+ <source>Show or hide the main Window</source>
+ <translation>Hiện hoặc ẩn cửa sổ chính</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation>&amp;File</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation>&amp;Thiết lập</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation>Trợ &amp;giúp</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>&amp;About Bitcoin Core</source>
+ <translation>&amp;Về Bitcoin Core</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation><numerusform>%n giờ</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation><numerusform>%n ngày</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation><numerusform>%n tuần</numerusform></translation>
+ </message>
+ <message>
+ <source>%1 and %2</source>
+ <translation>%1 và %2</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation><numerusform>%n năm</numerusform></translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Lỗi</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>Chú ý</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation>Thông tin</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation>Đã cập nhật</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation>Giao dịch đã gửi</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>Giao dịch đang tới</translation>
+ </message>
</context>
<context>
<name>ClientModel</name>
- </context>
+ <message>
+ <source>Network Alert</source>
+ <translation>Network Alert</translation>
+ </message>
+</context>
<context>
<name>CoinControlDialog</name>
+ <message>
+ <source>Quantity:</source>
+ <translation>Lượng:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation>Bytes:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation>Lượng:</translation>
+ </message>
+ <message>
+ <source>Priority:</source>
+ <translation>Tầm quan trọng:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>Phí:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation>Thay đổi:</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation>Lượng</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation>Ngày tháng</translation>
+ </message>
+ <message>
+ <source>Confirmations</source>
+ <translation>Lần xác nhận</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation>Đã xác nhận</translation>
+ </message>
+ <message>
+ <source>Priority</source>
+ <translation>Tầm quan trọng</translation>
+ </message>
+ <message>
+ <source>Copy address</source>
+ <translation>Copy địa chỉ</translation>
+ </message>
+ <message>
+ <source>Copy label</source>
+ <translation>Copy nhãn</translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation>Lượng copy</translation>
+ </message>
+ <message>
+ <source>low</source>
+ <translation>thấp</translation>
+ </message>
+ <message>
+ <source>lower</source>
+ <translation>thấp hơn</translation>
+ </message>
+ <message>
+ <source>lowest</source>
+ <translation>thấp nhất</translation>
+ </message>
+ <message>
+ <source>yes</source>
+ <translation>có</translation>
+ </message>
+ <message>
+ <source>no</source>
+ <translation>không</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation>(không nhãn)</translation>
+ </message>
</context>
<context>
<name>EditAddressDialog</name>
</context>
<context>
<name>FreespaceChecker</name>
+ <message>
+ <source>name</source>
+ <translation>tên</translation>
+ </message>
</context>
<context>
<name>HelpMessageDialog</name>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>version</source>
+ <translation>version</translation>
+ </message>
+ <message>
+ <source>About Bitcoin Core</source>
+ <translation>Về Bitcoin Core</translation>
+ </message>
</context>
<context>
<name>Intro</name>
+ <message>
+ <source>Welcome</source>
+ <translation>Chào mừng</translation>
+ </message>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Lỗi</translation>
+ </message>
</context>
<context>
<name>OpenURIDialog</name>
+ <message>
+ <source>Open URI</source>
+ <translation>Mở URI</translation>
+ </message>
+ <message>
+ <source>URI:</source>
+ <translation>URI:</translation>
+ </message>
</context>
<context>
<name>OptionsDialog</name>
+ <message>
+ <source>Options</source>
+ <translation>Lựa chọn</translation>
+ </message>
+ <message>
+ <source>&amp;Main</source>
+ <translation>&amp;Chính</translation>
+ </message>
+ <message>
+ <source>MB</source>
+ <translation>MB</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation>&amp;Hiển thị</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation>&amp;OK</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Từ chối</translation>
+ </message>
+ <message>
+ <source>default</source>
+ <translation>mặc định</translation>
+ </message>
</context>
<context>
<name>OverviewPage</name>
+ <message>
+ <source>Form</source>
+ <translation>Form</translation>
+ </message>
+ <message>
+ <source>Total:</source>
+ <translation>Tổng:</translation>
+ </message>
</context>
<context>
<name>PaymentServer</name>
</context>
<context>
<name>PeerTableModel</name>
+ <message>
+ <source>User Agent</source>
+ <translation>User Agent</translation>
+ </message>
</context>
<context>
<name>QObject</name>
+ <message>
+ <source>Amount</source>
+ <translation>Lượng</translation>
+ </message>
</context>
<context>
<name>QRImageWidget</name>
</context>
<context>
<name>RPCConsole</name>
+ <message>
+ <source>General</source>
+ <translation>Nhìn Chung</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation>Tên</translation>
+ </message>
+ <message>
+ <source>Block chain</source>
+ <translation>Block chain</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation>Đã gửi</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation>User Agent</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
- </context>
+ <message>
+ <source>Copy label</source>
+ <translation>Copy nhãn</translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation>Lượng copy</translation>
+ </message>
+</context>
<context>
<name>ReceiveRequestDialog</name>
+ <message>
+ <source>Address</source>
+ <translation>Địa chỉ</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation>Lượng</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation>Nhãn</translation>
+ </message>
</context>
<context>
<name>RecentRequestsTableModel</name>
+ <message>
+ <source>Date</source>
+ <translation>Ngày tháng</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation>Nhãn</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation>Lượng</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation>(không nhãn)</translation>
+ </message>
</context>
<context>
<name>SendCoinsDialog</name>
+ <message>
+ <source>Quantity:</source>
+ <translation>Lượng:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation>Bytes:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation>Lượng:</translation>
+ </message>
+ <message>
+ <source>Priority:</source>
+ <translation>Tầm quan trọng:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation>Phí:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation>Thay đổi:</translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation>Lượng copy</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation>(không nhãn)</translation>
+ </message>
</context>
<context>
<name>SendCoinsEntry</name>
@@ -80,21 +576,77 @@
</context>
<context>
<name>SplashScreen</name>
+ <message>
+ <source>Bitcoin Core</source>
+ <translation>Bitcoin Core</translation>
+ </message>
</context>
<context>
<name>TrafficGraphWidget</name>
</context>
<context>
<name>TransactionDesc</name>
+ <message>
+ <source>Date</source>
+ <translation>Ngày tháng</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation>Lượng</translation>
+ </message>
</context>
<context>
<name>TransactionDescDialog</name>
</context>
<context>
<name>TransactionTableModel</name>
+ <message>
+ <source>Date</source>
+ <translation>Ngày tháng</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation>Nhãn</translation>
+ </message>
</context>
<context>
<name>TransactionView</name>
+ <message>
+ <source>Copy address</source>
+ <translation>Copy địa chỉ</translation>
+ </message>
+ <message>
+ <source>Copy label</source>
+ <translation>Copy nhãn</translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation>Lượng copy</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation>Xuất Đã Thất Bại</translation>
+ </message>
+ <message>
+ <source>Comma separated file (*.csv)</source>
+ <translation>Comma separated file (*.csv)</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation>Đã xác nhận</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation>Ngày tháng</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation>Nhãn</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation>Địa chỉ</translation>
+ </message>
</context>
<context>
<name>UnitDisplayStatusBarControl</name>
@@ -107,8 +659,76 @@
</context>
<context>
<name>WalletView</name>
+ <message>
+ <source>&amp;Export</source>
+ <translation>X&amp;uất</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation>Xuất dữ liệu trong mục hiện tại ra file</translation>
+ </message>
</context>
<context>
<name>bitcoin-core</name>
- </context>
+ <message>
+ <source>Information</source>
+ <translation>Thông tin</translation>
+ </message>
+ <message>
+ <source>Transaction too large</source>
+ <translation>Giao dịch quá lớn</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation>Chú ý</translation>
+ </message>
+ <message>
+ <source>on startup</source>
+ <translation>khi khởi động</translation>
+ </message>
+ <message>
+ <source>This help message</source>
+ <translation>Thông điệp trợ giúp này</translation>
+ </message>
+ <message>
+ <source>Loading addresses...</source>
+ <translation>Đang đọc các địa chỉ...</translation>
+ </message>
+ <message>
+ <source>(default: %s)</source>
+ <translation>(mặc định: %s)</translation>
+ </message>
+ <message>
+ <source>Insufficient funds</source>
+ <translation>Không đủ tiền</translation>
+ </message>
+ <message>
+ <source>Loading block index...</source>
+ <translation>Đang đọc block index...</translation>
+ </message>
+ <message>
+ <source>Loading wallet...</source>
+ <translation>Đang đọc ví...</translation>
+ </message>
+ <message>
+ <source>Cannot downgrade wallet</source>
+ <translation>Không downgrade được ví</translation>
+ </message>
+ <message>
+ <source>Cannot write default address</source>
+ <translation>Không ghi được địa chỉ mặc định</translation>
+ </message>
+ <message>
+ <source>Rescanning...</source>
+ <translation>Đang quét lại...</translation>
+ </message>
+ <message>
+ <source>Done loading</source>
+ <translation>Đã nạp xong</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation>Lỗi</translation>
+ </message>
+</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts
index 94d0675bfd..3bcce1faab 100644
--- a/src/qt/locale/bitcoin_zh_CN.ts
+++ b/src/qt/locale/bitcoin_zh_CN.ts
@@ -1,9 +1,9 @@
-<TS language="zh_CN" version="2.0">
+<TS language="zh_CN" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>双击编辑地址或标签</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>鼠标右击编辑地址或标签</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>更改密码</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>请输入该钱包的旧密码与新密码。</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>确认加密钱包</translation>
</message>
@@ -172,6 +168,10 @@
<translation>您确定需要为钱包加密吗?</translation>
</message>
<message>
+ <source>Bitcoin Core will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation>比特币核心现在将关闭以完成加密过程。请记住,在您的计算机被恶意软件感染的情况下,加密不能完全保护您的比特币免于被盗。</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>重要提示:您以前备份的钱包文件应该替换成最新生成的加密钱包文件(重新备份)。从安全性上考虑,您以前备份的未加密的钱包文件,在您使用新的加密钱包后将无效,请重新备份。</translation>
</message>
@@ -184,8 +184,12 @@
<translation>钱包已加密</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>比特币客户端将关闭软件以完成加密过程。请您谨记:钱包加密并不是万能的,电脑中毒等原因仍可能导致您的比特币意外丢失。</translation>
+ <source>Enter the new passphrase to 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>请输入新的钱包密码. &lt;br/&gt;密码须包含&lt;b&gt;10个以上字符&lt;/b&gt;,或&lt;b&gt;8个以上单词&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase to the wallet.</source>
+ <translation>请输入钱包的旧密码与新密码。</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -280,11 +284,11 @@
</message>
<message>
<source>&amp;Sending addresses...</source>
- <translation>&amp;付款地址 </translation>
+ <translation>正在发送地址(&amp;S)...</translation>
</message>
<message>
<source>&amp;Receiving addresses...</source>
- <translation>&amp;收款地址</translation>
+ <translation>正在接收地址(&amp;R)...</translation>
</message>
<message>
<source>Open &amp;URI...</source>
@@ -307,10 +311,6 @@
<translation>向一个比特币地址发送比特币</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>设置选项</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>备份钱包到其他文件夹</translation>
</message>
@@ -399,6 +399,10 @@
<translation>关于比特币核心(&amp;A)</translation>
</message>
<message>
+ <source>Modify configuration options for Bitcoin Core</source>
+ <translation>修改比特币核心的配置选项</translation>
+ </message>
+ <message>
<source>Show the list of used sending addresses and labels</source>
<translation>显示用过的发送地址和标签的列表</translation>
</message>
@@ -412,7 +416,7 @@
</message>
<message>
<source>&amp;Command-line options</source>
- <translation>&amp;命令行 选项</translation>
+ <translation>命令行选项(&amp;C)</translation>
</message>
<message>
<source>Show the Bitcoin Core help message to get a list with possible Bitcoin command-line options</source>
@@ -427,6 +431,10 @@
<translation>沒有可用的区块来源...</translation>
</message>
<message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation><numerusform>已处理 %n 个交易历史数据块。</numerusform></translation>
+ </message>
+ <message numerus="yes">
<source>%n hour(s)</source>
<translation><numerusform>%n 小时</numerusform></translation>
</message>
@@ -479,26 +487,44 @@
<translation>更新中...</translation>
</message>
<message>
- <source>Sent transaction</source>
- <translation>发送交易</translation>
+ <source>Date: %1
+</source>
+ <translation>日期: %1
+</translation>
</message>
<message>
- <source>Incoming transaction</source>
- <translation>流入交易</translation>
+ <source>Amount: %1
+</source>
+ <translation>金额: %1
+</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
+ <source>Type: %1
</source>
- <translation>日期: %1
-金额: %2
-类别: %3
-地址: %4
+ <translation>类型: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation>标签: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation>地址: %1
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation>发送交易</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation>流入交易</translation>
+ </message>
+ <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>钱包已被&lt;b&gt;加密&lt;/b&gt;,当前为&lt;b&gt;解锁&lt;/b&gt;状态</translation>
</message>
@@ -517,6 +543,10 @@ Address: %4
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation>币源选择(Coin Selection)</translation>
+ </message>
+ <message>
<source>Quantity:</source>
<translation>总量:</translation>
</message>
@@ -565,6 +595,14 @@ Address: %4
<translation>金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>按标签收款</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>按地址收款</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>日期</translation>
</message>
@@ -677,6 +715,22 @@ Address: %4
<translation>无</translation>
</message>
<message>
+ <source>This label turns red if the transaction size is greater than 1000 bytes.</source>
+ <translation>如果交易规模大于 1000 字节,此标签将变为红色。</translation>
+ </message>
+ <message>
+ <source>This label turns red if the priority is smaller than "medium".</source>
+ <translation>如果优先级小于“中等”,此标签将变为红色。</translation>
+ </message>
+ <message>
+ <source>This label turns red if any recipient receives an amount smaller than %1.</source>
+ <translation>如果任何接收人收到的金额小于 %1,此标签将变为红色。</translation>
+ </message>
+ <message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation>可能会有 正负 %1 聪(satoshi)的偏差 </translation>
+ </message>
+ <message>
<source>yes</source>
<translation>是</translation>
</message>
@@ -685,10 +739,6 @@ Address: %4
<translation>否</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>如果这笔交易大于1000字节,标签会变成红色。</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>这意味着将对交易收取 %1/千字节 的交易费。</translation>
</message>
@@ -701,14 +751,6 @@ Address: %4
<translation>交易的优先级越高,被矿工收入数据块的速度也越快。</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>如果优先级小于"中位数" ,标签将变成红色。</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>如果收款地址收到小于%1的比特币,标签将变成红色。</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(没有标签)</translation>
</message>
@@ -829,31 +871,6 @@ Address: %4
<source>command-line options</source>
<translation>命令行选项</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>UI选项</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>设置语言, 例如“zh-TW”(默认为系统语言)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>启动时最小化
-</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>设置SSL根证书的付款请求(默认:-系统-)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>启动时显示版权页 (缺省: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>在启动时选择数据目录(默认:0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -886,10 +903,22 @@ Address: %4
<translation>比特币核心</translation>
</message>
<message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation>错误:无法创建 指定的数据目录 "%1" </translation>
+ </message>
+ <message>
<source>Error</source>
<translation>错误</translation>
</message>
- </context>
+ <message numerus="yes">
+ <source>%n GB of free space available</source>
+ <translation><numerusform>有 %n GB 空闲空间</numerusform></translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation><numerusform>(需要%n GB空间)</numerusform></translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -924,14 +953,6 @@ Address: %4
<translation>主要(&amp;M)</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>登录系统后自动开启比特币客户端</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>系统启动时运行(&amp;S)</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>数据库缓存大小(&amp;D)</translation>
</message>
@@ -941,7 +962,7 @@ Address: %4
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation>脚本&amp;验证 进程数 </translation>
+ <translation>脚本验证线程数(&amp;V)</translation>
</message>
<message>
<source>Accept connections from outside</source>
@@ -956,6 +977,14 @@ Address: %4
<translation>代理的 IP 地址 (例如 IPv4: 127.0.0.1 / IPv6: ::1)</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>窗口被关闭时最小化而不是退出应用程序。当此选项启用时,应用程序只会在菜单中选择退出时退出。</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin Core.</source>
+ <translation>可以在这里设置用户界面语言。此设置将在重新启动比特币核心后生效。</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>出现在交易的选项卡的上下文菜单项的第三方网址 (例如:区块链接查询) 。 %s的URL被替换为交易哈希。多个的URL需要竖线 | 分隔。</translation>
</message>
@@ -980,12 +1009,20 @@ Address: %4
<translation>网络(&amp;N)</translation>
</message>
<message>
+ <source>Automatically start Bitcoin Core after logging in to the system.</source>
+ <translation>登录到系统后自动启动比特币核心。</translation>
+ </message>
+ <message>
+ <source>&amp;Start Bitcoin Core on system login</source>
+ <translation>系统登录时启动比特币核心(&amp;S)</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation>(0 = 自动, &lt;0 = 离开很多免费的核心)</translation>
</message>
<message>
<source>W&amp;allet</source>
- <translation>&amp;钱包</translation>
+ <translation>钱包(&amp;A)</translation>
</message>
<message>
<source>Expert</source>
@@ -993,7 +1030,7 @@ Address: %4
</message>
<message>
<source>Enable coin &amp;control features</source>
- <translation>启动货币 &amp;控制功能</translation>
+ <translation>启动货币控制功能(&amp;C)</translation>
</message>
<message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
@@ -1001,7 +1038,7 @@ Address: %4
</message>
<message>
<source>&amp;Spend unconfirmed change</source>
- <translation>&amp;选择未经确认的花费</translation>
+ <translation>使用未经确认的零钱(&amp;S)</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>
@@ -1012,6 +1049,14 @@ Address: %4
<translation>使用 &amp;UPnP 映射端口</translation>
</message>
<message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation>通过 SOCKS5 代理连接比特币网络。</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation>通过 SO&amp;CKS5 代理连接(默认代理):</translation>
+ </message>
+ <message>
<source>Proxy &amp;IP:</source>
<translation>代理服务器 &amp;IP:</translation>
</message>
@@ -1036,10 +1081,6 @@ Address: %4
<translation>最小化到托盘(&amp;M)</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 Quit in the menu.</source>
- <translation>当窗口关闭时程序最小化而不是退出。当使用该选项时,程序只能通过在菜单中选择退出来关闭</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>单击关闭按钮最小化(&amp;I)</translation>
</message>
@@ -1052,10 +1093,6 @@ Address: %4
<translation>用户界面语言(&amp;L):</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>在这里设置用户界面的语言。设置将在客户端重启后生效。</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>比特币金额单位(&amp;U):</translation>
</message>
@@ -1092,8 +1129,8 @@ Address: %4
<translation>更改生效需要重启客户端。</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>客户端即将关闭,确定继续吗?</translation>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <translation>客户端即将关闭,您想继续吗?</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1143,6 +1180,10 @@ Address: %4
<translation>尚未成熟的挖矿收入余额</translation>
</message>
<message>
+ <source>Balances</source>
+ <translation>余额</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation>总额:</translation>
</message>
@@ -1151,8 +1192,28 @@ Address: %4
<translation>您当前的总余额</translation>
</message>
<message>
- <source>out of sync</source>
- <translation>数据同步中</translation>
+ <source>Your current balance in watch-only addresses</source>
+ <translation>您当前 观察地址(watch-only address)的余额 </translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation>可使用:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation>最近交易记录</translation>
+ </message>
+ <message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation>观察地址(watch-only address)的未确认交易记录 </translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation>观察地址(watch-only address)中尚未成熟(matured)的挖矿收入余额:</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation>观察地址(watch-only address)中的当前总余额 </translation>
</message>
</context>
<context>
@@ -1170,8 +1231,8 @@ Address: %4
<translation>支付请求被拒绝</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>支付请求已超时</translation>
+ <source>Payment request network doesn't match client network.</source>
+ <translation>付款请求所在的网络与当前客户端所在的网络不匹配。</translation>
</message>
<message>
<source>Payment request is not initialized.</source>
@@ -1194,22 +1255,50 @@ Address: %4
<translation>付款请求URI链接非法: %1</translation>
</message>
<message>
+ <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation>URI无法解析!原因可能是比特币地址不正确,或者URI参数错误。</translation>
+ </message>
+ <message>
<source>Payment request file handling</source>
<translation>付款请求文件处理 </translation>
</message>
<message>
+ <source>Payment request file cannot be read! This can be caused by an invalid payment request file.</source>
+ <translation>付款请求文件无法读取!可能是付款请求文件不合格。</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>支付请求已过期。</translation>
+ </message>
+ <message>
<source>Unverified payment requests to custom payment scripts are unsupported.</source>
<translation>不支持到自定义付款脚本的未验证付款请求。</translation>
</message>
<message>
+ <source>Invalid payment request.</source>
+ <translation>无效的支付请求。</translation>
+ </message>
+ <message>
<source>Refund from %1</source>
<translation>退款来自 %1</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>支付请求 %1 太大 (%2 字节。只允许 %3 字节)。</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>支付请求防滥用保护</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>%1: %2 通讯出错</translation>
</message>
<message>
+ <source>Payment request cannot be parsed!</source>
+ <translation>无法解析 付款请求!</translation>
+ </message>
+ <message>
<source>Bad response from server %1</source>
<translation>来自 %1 服务器的错误响应</translation>
</message>
@@ -1229,8 +1318,8 @@ Address: %4
<translation>用户代理</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>地址/主机名</translation>
+ <source>Node/Service</source>
+ <translation>节点/服务</translation>
</message>
<message>
<source>Ping Time</source>
@@ -1264,14 +1353,6 @@ Address: %4
<translation>%1 秒</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>网络</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>未知</translation>
- </message>
- <message>
<source>None</source>
<translation>无</translation>
</message>
@@ -1362,6 +1443,10 @@ Address: %4
<translation>当前数据块数量</translation>
</message>
<message>
+ <source>Open the Bitcoin Core debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation>从当前的数据目录打开比特币核心调试日志文件。对于较大的日志文件,这可能需要几秒钟。</translation>
+ </message>
+ <message>
<source>Received</source>
<translation>收到</translation>
</message>
@@ -1371,7 +1456,11 @@ Address: %4
</message>
<message>
<source>&amp;Peers</source>
- <translation>&amp;同类</translation>
+ <translation>同伴(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation>选择节点查看详细信息。</translation>
</message>
<message>
<source>Direction</source>
@@ -1426,6 +1515,10 @@ Address: %4
<translation>Ping 时间</translation>
</message>
<message>
+ <source>Time Offset</source>
+ <translation>时间偏移</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation>上一数据块时间</translation>
</message>
@@ -1466,16 +1559,12 @@ Address: %4
<translation>调试日志文件</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>打开当前目录中的调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>清空控制台</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>欢迎来到 RPC 控制台。</translation>
+ <source>Welcome to the Bitcoin Core RPC console.</source>
+ <translation>欢迎使用 比特币核心 RPC 控制台。</translation>
</message>
<message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
@@ -1754,6 +1843,74 @@ Address: %4
<translation>自定义零钱地址</translation>
</message>
<message>
+ <source>Transaction Fee:</source>
+ <translation>交易费用:</translation>
+ </message>
+ <message>
+ <source>Choose...</source>
+ <translation>选择... </translation>
+ </message>
+ <message>
+ <source>collapse fee-settings</source>
+ <translation>收起 费用设置 </translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation>每kb</translation>
+ </message>
+ <message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>如果自定义交易费设置为 1000聪而交易大小只有250字节,则“每千字节" 模式只支付250聪交易费, 而"最少"模式则支付1000聪。 大于1000字节的交易按每千字节付费。</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation>隐藏</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>最小额 </translation>
+ </message>
+ <message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>交易量小时只支付最小交易费是可以的。但是请注意,当交易量大时您的交易可能永远无法确认。</translation>
+ </message>
+ <message>
+ <source>(read the tooltip)</source>
+ <translation>(请注意提示信息)</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation>推荐:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>自定义:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(智能交易费用 尚未初始化。 需要再下载一些数据块...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time:</source>
+ <translation>确认时间:</translation>
+ </message>
+ <message>
+ <source>normal</source>
+ <translation>一般</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>快速</translation>
+ </message>
+ <message>
+ <source>Send as zero-fee transaction if possible</source>
+ <translation>发送时尽可能 不支付交易费用</translation>
+ </message>
+ <message>
+ <source>(confirmation may take longer)</source>
+ <translation>(确认时间更长) </translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>一次发送给多个接收者</translation>
</message>
@@ -1830,10 +1987,6 @@ Address: %4
<translation>或</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>收款人地址不合法,请检查。</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>支付金额必须大于0。</translation>
</message>
@@ -1846,10 +1999,6 @@ Address: %4
<translation>计入 %1 交易费后的金额超出您的账上余额。</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>发现重复的地址, 每次只能对同一地址发送一次。</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>交易创建失败!</translation>
</message>
@@ -1858,6 +2007,30 @@ Address: %4
<translation>错误:该交易被拒绝!发生这种错误的原因可能是:钱包中的比特币已经被用掉,有可能您复制了wallet.dat钱包文件,然后用复制的钱包文件支付了比特币,但是这个钱包文件中没有记录。</translation>
</message>
<message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation>超过 %1 的交易费被认为是荒谬的高费率。</translation>
+ </message>
+ <message>
+ <source>Payment request expired.</source>
+ <translation>支付请求已过期。</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation><numerusform>预计 %n 个数据块后被确认。</numerusform></translation>
+ </message>
+ <message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>只支付最小费用 %1</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation>接收人地址无效。请重新检查。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation>发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>警告:无效的比特币地址</translation>
</message>
@@ -1909,6 +2082,10 @@ Address: %4
<translation>这是笔正常的支付。</translation>
</message>
<message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation>付款目的地址</translation>
+ </message>
+ <message>
<source>Alt+A</source>
<translation>Alt+A</translation>
</message>
@@ -1925,12 +2102,20 @@ Address: %4
<translation>移除此项</translation>
</message>
<message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation>从金额中减去交易费(&amp;U)</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation>消息:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>这是个有效的支付请求。</translation>
+ <source>This is an unauthenticated payment request.</source>
+ <translation>这是一个未经验证的支付请求。</translation>
+ </message>
+ <message>
+ <source>This is an authenticated payment request.</source>
+ <translation>这是一个已经验证的支付请求。</translation>
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
@@ -1941,10 +2126,6 @@ Address: %4
<translation>bitcoin:URI 附带的备注信息,将会和交易一起存储,备查。 注意:该消息不会通过比特币网络传输。</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>这是个非有效的支付请求。</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>支付给:</translation>
</message>
@@ -1975,8 +2156,8 @@ Address: %4
<translation>签名消息(&amp;S)</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>您可以用你的地址对消息进行签名,以证明您是该地址的所有人。注意不要对模棱两可的消息签名,以免遭受钓鱼式攻击。请确保消息内容准确的表达了您的真实意愿。</translation>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation>用来对消息签名的地址 </translation>
</message>
<message>
<source>Choose previously used address</source>
@@ -2027,8 +2208,12 @@ Address: %4
<translation>验证消息(&amp;V)</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>在下面输入签名地址,消息(请确保换行符、空格符、制表符等等一个不漏)和签名以验证消息。请确保签名信息准确,提防中间人攻击。</translation>
+ <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>请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方签名的地址,它不能证明任何交易!</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation>消息使用的签名地址</translation>
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
@@ -2143,6 +2328,10 @@ Address: %4
<source>Status</source>
<translation>状态</translation>
</message>
+ <message numerus="yes">
+ <source>, broadcast through %n node(s)</source>
+ <translation><numerusform>, 通过 %n 个节点广播 </numerusform></translation>
+ </message>
<message>
<source>Date</source>
<translation>日期</translation>
@@ -2168,6 +2357,10 @@ Address: %4
<translation>自己的地址</translation>
</message>
<message>
+ <source>watch-only</source>
+ <translation>观察地址(watch-only) </translation>
+ </message>
+ <message>
<source>label</source>
<translation>标签</translation>
</message>
@@ -2175,6 +2368,10 @@ Address: %4
<source>Credit</source>
<translation>收入</translation>
</message>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation><numerusform>%n 个数据块后成熟(mature) </numerusform></translation>
+ </message>
<message>
<source>not accepted</source>
<translation>未被接受</translation>
@@ -2184,6 +2381,14 @@ Address: %4
<translation>支出</translation>
</message>
<message>
+ <source>Total debit</source>
+ <translation>总收入</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation>总支出</translation>
+ </message>
+ <message>
<source>Transaction fee</source>
<translation>交易费</translation>
</message>
@@ -2239,6 +2444,10 @@ Address: %4
<source>, has not been successfully broadcast yet</source>
<translation>,未被成功广播</translation>
</message>
+ <message numerus="yes">
+ <source>Open for %n more block(s)</source>
+ <translation><numerusform>再打开 %n 个数据块</numerusform></translation>
+ </message>
<message>
<source>unknown</source>
<translation>未知</translation>
@@ -2266,13 +2475,13 @@ Address: %4
<translation>类别</translation>
</message>
<message>
- <source>Address</source>
- <translation>地址</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>未成熟 (%1 个确认,将在 %2 个后可用)</translation>
</message>
+ <message numerus="yes">
+ <source>Open for %n more block(s)</source>
+ <translation><numerusform>再打开 %n 个数据块</numerusform></translation>
+ </message>
<message>
<source>Open until %1</source>
<translation>至 %1 个数据块时开启</translation>
@@ -2294,6 +2503,10 @@ Address: %4
<translation>掉线</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>标签</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>未确认的 </translation>
</message>
@@ -2326,6 +2539,10 @@ Address: %4
<translation>挖矿所得</translation>
</message>
<message>
+ <source>watch-only</source>
+ <translation>观察地址(watch-only) </translation>
+ </message>
+ <message>
<source>(n/a)</source>
<translation>(不可用)</translation>
</message>
@@ -2342,8 +2559,12 @@ Address: %4
<translation>交易类别。</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>交易目的地址。</translation>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation>该交易中是否涉及 观察地址(watch-only address)。</translation>
+ </message>
+ <message>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation>用户定义的该交易的意图/目的。</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
@@ -2437,6 +2658,10 @@ Address: %4
<translation>导出交易历史</translation>
</message>
<message>
+ <source>Watch-only</source>
+ <translation>观察地址(Watch-only) </translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation>导出失败</translation>
</message>
@@ -2491,7 +2716,11 @@ Address: %4
</context>
<context>
<name>UnitDisplayStatusBarControl</name>
- </context>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation>金额单位。单击选择别的单位。</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2582,44 +2811,24 @@ Address: %4
<translation>接受来自外部的连接 (缺省: 如果不带 -proxy or -connect 参数设置为1)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, 您必须在配置文件设置rpcpassword:
- %s
-建议您使用下面的随机密码:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(您无需记住此密码)
-用户名和密码 必! 须! 不一样。
-如果配置文件不存在,请自行建立一个只有所有者拥有只读权限的文件。
-推荐您开启提示通知以便收到错误通知,
-像这样: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>绑定指定的IP地址开始监听。IPv6地址请使用[host]:port 格式</translation>
</message>
<message>
- <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
- <translation>进入回归测试模式,它采用一种特殊的可立即解决的区块链模拟情况。</translation>
+ <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default: %u)</source>
+ <translation>自由交易不断的速率限制为&lt;n&gt;*1000 字节每分钟(默认值: %u)</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>错误:该交易被拒绝!发生这种错误的原因可能是:钱包中的比特币已经被用掉,有可能您复制了wallet.dat钱包文件,然后用复制的钱包文件支付了比特币,但是这个钱包文件中没有记录。</translation>
+ <source>Delete all wallet transactions and only recover those parts of the blockchain through -rescan on startup</source>
+ <translation>删除钱包的所有交易记录,且只有用 -rescan参数启动客户端才能重新取回交易记录 </translation>
</message>
<message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>错误:因为该交易的数量、复杂度或者动用了刚收到不久的资金,您需要支付不少于%s的交易费用。</translation>
+ <source>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</source>
+ <translation>Distributed under the MIT software license, see the accompanying file COPYING or &lt;http://www.opensource.org/licenses/mit-license.php&gt;.</translation>
+ </message>
+ <message>
+ <source>Enter regression test mode, which uses a special chain in which blocks can be solved instantly.</source>
+ <translation>进入回归测试模式,它采用一种特殊的可立即解决的区块链模拟情况。</translation>
</message>
<message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
@@ -2630,6 +2839,14 @@ rpcpassword=%s
<translation>在-genproclimit这种模式下控制产出多少区块</translation>
</message>
<message>
+ <source>Maximum total fees to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)</source>
+ <translation>单次交易最多使用交易费;设置太低可能导致大宗交易中止 (默认: %s)</translation>
+ </message>
+ <message>
+ <source>Reduce storage requirements by pruning (deleting) old blocks. This mode disables wallet support and is incompatible with -txindex. Warning: Reverting this setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks, &gt;%u = target size in MiB to use for block files)</source>
+ <translation>通过修剪(删除)旧数据块减少存储需求。此模式将禁用钱包支持,并与 -txindex 不兼容。警告:还原此设置需要重新下载整个数据链。(默认: 0 = 禁用修剪数据块, &gt;%u = 数据块文件目标大小,单位 MiB)</translation>
+ </message>
+ <message>
<source>Set the number of script verification threads (%u to %d, 0 = auto, &lt;0 = leave that many cores free, default: %d)</source>
<translation>设置脚本验证的程序 (%u 到 %d, 0 = 自动, &lt;0 = 保留自由的核心, 默认值: %d)</translation>
</message>
@@ -2662,6 +2879,10 @@ rpcpassword=%s
<translation>警告:钱包文件wallet.dat损坏! 原始的钱包文件已经备份到%s目录下并重命名为{timestamp}.bak 。如果您的账户余额或者交易记录不正确,请使用您的钱包备份文件恢复。</translation>
</message>
<message>
+ <source>Whitelist peers connecting from the given netmask or IP address. Can be specified multiple times.</source>
+ <translation>节点白名单,网络掩码或IP址。可多次指定。</translation>
+ </message>
+ <message>
<source>(default: 1)</source>
<translation>(默认值: 1)</translation>
</message>
@@ -2694,10 +2915,6 @@ rpcpassword=%s
<translation>调试/测试选项:</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>发现自己的IP地址(缺省:不带 -externalip 参数监听时设置为1)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>不要加载钱包和禁用钱包的 RPC 调用</translation>
</message>
@@ -2722,12 +2939,12 @@ rpcpassword=%s
<translation>导入数据块数据库出错</translation>
</message>
<message>
- <source>Error: Disk space is low!</source>
- <translation>错误:磁盘剩余空间低!</translation>
+ <source>Error: A fatal internal error occured, see debug.log for details</source>
+ <translation>错误:发生了致命的内部错误,请打开debug.log查看详细信息 </translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>错误:钱包被锁定,无法创建交易!</translation>
+ <source>Error: Disk space is low!</source>
+ <translation>错误:磁盘剩余空间低!</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
@@ -2754,8 +2971,16 @@ rpcpassword=%s
<translation>没有足够的文件描述符可用。</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>重新为当前的blk000??.dat文件建立索引</translation>
+ <source>Only connect to nodes in network &lt;net&gt; (ipv4, ipv6 or onion)</source>
+ <translation>只连接 &lt;net&gt;网络中的节点 (ipv4, ipv6 或 onion) </translation>
+ </message>
+ <message>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation>修剪不能配置一个负数。</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation>修剪模式与 -txindex 不兼容。</translation>
</message>
<message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
@@ -2774,6 +2999,10 @@ rpcpassword=%s
<translation>这是用于回归测试和应用开发目的。</translation>
</message>
<message>
+ <source>Use UPnP to map the listening port (default: %u)</source>
+ <translation>使用UPnp映射监听端口 (默认: %u) </translation>
+ </message>
+ <message>
<source>Verifying blocks...</source>
<translation>正在验证数据库的完整性...</translation>
</message>
@@ -2790,6 +3019,10 @@ rpcpassword=%s
<translation>钱包选项:</translation>
</message>
<message>
+ <source>Warning: This version is obsolete; upgrade required!</source>
+ <translation>警告:此版本已过时,必须升级!</translation>
+ </message>
+ <message>
<source>You need to rebuild the database using -reindex to change -txindex</source>
<translation>您需要将 -reindex 改为 -txindex 以重建数据库</translation>
</message>
@@ -2798,26 +3031,166 @@ rpcpassword=%s
<translation>从blk000??.dat文件导入数据块</translation>
</message>
<message>
+ <source>Allow JSON-RPC connections from specified source. Valid for &lt;ip&gt; are a single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified multiple times</source>
+ <translation>允许来自指定地址的 JSON-RPC 连接。 &lt;ip&gt;为单一IP (如: 1.2.3.4), 网络/掩码 (如: 1.2.3.4/255.255.255.0), 网络/CIDR (如: 1.2.3.4/24)。该选项可多次指定。</translation>
+ </message>
+ <message>
+ <source>An error occurred while setting up the RPC address %s port %u for listening: %s</source>
+ <translation>设置RPC监听端口 %s:%u 时发生错误: %s</translation>
+ </message>
+ <message>
+ <source>Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6</source>
+ <translation>绑定到指定地址和连接的白名单节点。 IPv6使用 [主机]:端口 格式 </translation>
+ </message>
+ <message>
+ <source>Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. This option can be specified multiple times (default: bind to all interfaces)</source>
+ <translation>绑定到指定地址监听 JSON-RPC连接。 IPv6使用[主机]:端口 格式。该选项可多次指定 (默认: 绑定到所有接口) </translation>
+ </message>
+ <message>
<source>Cannot obtain a lock on data directory %s. Bitcoin Core is probably already running.</source>
<translation>无法获取数据目录的 %s. 比特币核心钱包可能已经在运行.</translation>
</message>
<message>
+ <source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
+ <translation>创建系统默认权限的文件,而不是 umask 077 (只在关闭钱包功能时有效) </translation>
+ </message>
+ <message>
+ <source>Discover own IP addresses (default: 1 when listening and no -externalip or -proxy)</source>
+ <translation>发现自己的 IP 地址(默认: 监听并且无 -externalip 或 -proxy 时为 1)</translation>
+ </message>
+ <message>
+ <source>Error: Listening for incoming connections failed (listen returned error %s)</source>
+ <translation>错误:监听外部连接失败 (监听返回错误 %s) </translation>
+ </message>
+ <message>
+ <source>Error: Unsupported argument -socks found. Setting SOCKS version isn't possible anymore, only SOCKS5 proxies are supported.</source>
+ <translation>错误:不支持的 -socks 参数。不再支持设置SOCKS版本,现在只支持 SOCKS5代理。</translation>
+ </message>
+ <message>
<source>Execute command when a relevant alert is received or we see a really long fork (%s in cmd is replaced by message)</source>
<translation>当收到相关提醒或者我们看到一个长分叉时执行命令(%s 将替换为消息)</translation>
</message>
<message>
+ <source>Fees (in BTC/Kb) smaller than this are considered zero fee for relaying (default: %s)</source>
+ <translation>交易费(BTC/kb)比这更小的交易在转发时将被视为零费交易 (默认: %s) </translation>
+ </message>
+ <message>
+ <source>Fees (in BTC/Kb) smaller than this are considered zero fee for transaction creation (default: %s)</source>
+ <translation>交易费(BTC/kb)比这更小的交易在生成交易时将被视为零费交易 (默认: %s) </translation>
+ </message>
+ <message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>如果未设置交易费用,自动添加足够的交易费以确保交易在平均n个数据块内被确认 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>-maxtxfee=&lt;amount&gt;: '%s' 的金额无效(交易费至少为 %s,以免交易滞留过久)</translation>
+ </message>
+ <message>
+ <source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
+ <translation>Maximum size of data in data carrier transactions we relay and mine (default: %u)</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MB. Please use a higher number.</source>
+ <translation>修剪被配置为比最小值 %d MB 更低。请使用更大的数字。</translation>
+ </message>
+ <message>
<source>Query for peer addresses via DNS lookup, if low on addresses (default: 1 unless -connect)</source>
<translation>通过DNS查询每个地址,如果短地址 (默认值: 1 除非 -连接)</translation>
</message>
<message>
+ <source>Randomize credentials for every proxy connection. This enables Tor stream isolation (default: %u)</source>
+ <translation>为每个代理连接随机化凭据。这将启用 Tor 流隔离 (默认: %u)</translation>
+ </message>
+ <message>
+ <source>Require high priority for relaying free or low-fee transactions (default: %u)</source>
+ <translation>免费中继和低费率交易需要高优先级 (默认: %u)</translation>
+ </message>
+ <message>
<source>Set maximum size of high-priority/low-fee transactions in bytes (default: %d)</source>
<translation>设置 高优先级/低交易费 交易的最大字节 (缺省: %d)</translation>
</message>
<message>
+ <source>Set the number of threads for coin generation if enabled (-1 = all cores, default: %d)</source>
+ <translation>设置比特币生成线程数 ( -1=所有核, 默认: %d) </translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation>在交易费被扣除后发送的交易金额太小</translation>
+ </message>
+ <message>
+ <source>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</source>
+ <translation>This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit &lt;https://www.openssl.org/&gt; and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard.</translation>
+ </message>
+ <message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>要使用 bitcoind 或者 bitcoin-qt 中的 -server 选项,您必须在配置文件中设置一个密码:
+%s
+建议您使用下列随机密码:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(您不需要记住这个密码)
+用户名和密码不能相同。
+如果该文件不存在,创建一个文件并设置权限为仅创建者可读。
+此外,还建议您设置 alertnotify 以便您能注意到问题:
+例如 alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>警告:-maxtxfee 设置的太高了!每进行一笔交易时您都要花费这么多费用。</translation>
+ </message>
+ <message>
+ <source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
+ <translation>警告:请检查电脑的日期时间设置是否正确!时间错误可能会导致比特币客户端运行异常。</translation>
+ </message>
+ <message>
+ <source>Whitelisted peers cannot be DoS banned and their transactions are always relayed, even if they are already in the mempool, useful e.g. for a gateway</source>
+ <translation>白名单节点不能被DoS banned ,且转发所有来自他们的交易(即便这些交易已经存在于mempool中),常用于网关 </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>您需要使用 -reindex 重新构建数据库以返回未修剪的模式。这将重新下载整个区块链</translation>
+ </message>
+ <message>
+ <source>(default: %u)</source>
+ <translation>(默认: %u)</translation>
+ </message>
+ <message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>接受公共 REST 请求 (默认: %u)</translation>
+ </message>
+ <message>
+ <source>Activating best chain...</source>
+ <translation>正在激活最佳数据链...</translation>
+ </message>
+ <message>
+ <source>Allow self signed root certificates (default: 0)</source>
+ <translation>允许自签名根证书 (默认: 0)</translation>
+ </message>
+ <message>
+ <source>Can't run with a wallet in prune mode.</source>
+ <translation>不能在修剪模式下运行一个钱包。</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>无法解析 -whitebind 地址: '%s'</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>在启动时选择数据目录(默认:0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>通过 SOCKS5 代理连接</translation>
</message>
@@ -2834,10 +3207,18 @@ rpcpassword=%s
<translation>加载wallet.dat错误:需要新版的比特币核心钱包</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>读取数据库出错,关闭中。</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>错误:发现了不支持的参数 -tor,请使用 -onion。</translation>
</message>
<message>
+ <source>Fee (in BTC/kB) to add to transactions you send (default: %s)</source>
+ <translation>为付款交易添加交易费 (BTC/kb) (默认: %s) </translation>
+ </message>
+ <message>
<source>Information</source>
<translation>信息</translation>
</message>
@@ -2846,6 +3227,10 @@ rpcpassword=%s
<translation>初始化完整性检查失败。Bitcoin Core 即将关闭。</translation>
</message>
<message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>-maxtxfee=&lt;amount&gt;: '%s' 的金额无效</translation>
+ </message>
+ <message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
<translation>-minrelaytxfee=&lt;amount&gt;: '%s' 无效的金额</translation>
</message>
@@ -2870,10 +3255,6 @@ rpcpassword=%s
<translation>节点中继选项:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>如果在搜索区块中找到,请启动打印区块</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>RPC SSL选项:(见有关比特币设置用于SSL说明的维基百科)</translation>
</message>
@@ -2882,6 +3263,10 @@ rpcpassword=%s
<translation>RPC 服务器选项:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>RPC 支持 HTTP 持久连接 (默认: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>随机每1个丢失测试&lt;n&gt;网络信息</translation>
</message>
@@ -2890,14 +3275,34 @@ rpcpassword=%s
<translation>随机每1个模拟测试&lt;n&gt;网络信息</translation>
</message>
<message>
+ <source>Rebuild block chain index from current blk000??.dat files on startup</source>
+ <translation>启动时重新为当前的 blk000??.dat 文件建立索引</translation>
+ </message>
+ <message>
<source>Send trace/debug info to console instead of debug.log file</source>
<translation>跟踪/调试信息输出到控制台,不输出到 debug.log 文件</translation>
</message>
<message>
+ <source>Send transactions as zero-fee transactions if possible (default: %u)</source>
+ <translation>发送时尽可能 不支付交易费用 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>设置SSL根证书的付款请求(默认:-系统-)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>设置语言, 例如“zh-TW”(默认为系统语言)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>显示所有调试选项 (用法: --帮助 -帮助调试)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>启动时显示版权页 (缺省: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>客户端启动时压缩debug.log文件(缺省:no-debug模式时为1)</translation>
</message>
@@ -2906,6 +3311,15 @@ rpcpassword=%s
<translation>签署交易失败</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>启动时最小化
+</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation>交易金额太小,不足以支付交易费</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>这是实验性的软件。</translation>
</message>
@@ -2918,10 +3332,18 @@ rpcpassword=%s
<translation>交易金额必须是积极的</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>费用策略的交易太大</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>交易太大</translation>
</message>
<message>
+ <source>UI Options:</source>
+ <translation>界面选项:</translation>
+ </message>
+ <message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
<translation>无法在此计算机上绑定 %s (绑定返回错误 %s)</translation>
</message>
@@ -2942,10 +3364,6 @@ rpcpassword=%s
<translation>警告</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>警告:该软件版本已过时,请升级!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>警告:不支持的参数 -benchmark 已忽略,请使用 -debug=bench。</translation>
</message>
@@ -3004,14 +3422,170 @@ rpcpassword=%s
<translation>wallet.dat 钱包文件加载出错:钱包损坏</translation>
</message>
<message>
+ <source>(1 = keep tx meta data e.g. account owner and payment request information, 2 = drop tx meta data)</source>
+ <translation>(1 = 保留 tx meta data , 如 account owner 和 payment request information, 2 = 不保留 tx meta data) </translation>
+ </message>
+ <message>
+ <source>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</source>
+ <translation>Flush database activity from memory pool to disk log every &lt;n&gt; megabytes (default: %u)</translation>
+ </message>
+ <message>
+ <source>How thorough the block verification of -checkblocks is (0-4, default: %u)</source>
+ <translation>数据块验证 严密级别 -checkblocks (0-4, 默认: %u) </translation>
+ </message>
+ <message>
+ <source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
+ <translation>挖矿时,记录交易优先级 和 每kb交易费 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Maintain a full transaction index, used by the getrawtransaction rpc call (default: %u)</source>
+ <translation>维护一份完整的交易索引, 用于 getrawtransaction RPC调用 (默认: %u)</translation>
+ </message>
+ <message>
+ <source>Number of seconds to keep misbehaving peers from reconnecting (default: %u)</source>
+ <translation>限制 非礼节点 若干秒内不能连接 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Output debugging information (default: %u, supplying &lt;category&gt; is optional)</source>
+ <translation>输出调试信息 (默认: %u, 提供 &lt;category&gt; 是可选项)</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS5 proxy to reach peers via Tor hidden services (default: %s)</source>
+ <translation>通过Tor隐藏服务连接节点时 使用不同的SOCKS5代理 (默认: %s)</translation>
+ </message>
+ <message>
+ <source>(default: %s)</source>
+ <translation>(默认: %s) </translation>
+ </message>
+ <message>
+ <source>Acceptable ciphers (default: %s)</source>
+ <translation>可接受的密码算法 (默认: %s) </translation>
+ </message>
+ <message>
+ <source>Disable safemode, override a real safe mode event (default: %u)</source>
+ <translation>禁止使用安全模式,重新写入一个真正的安全模式日志(默认: %u)</translation>
+ </message>
+ <message>
<source>Error loading wallet.dat</source>
<translation>wallet.dat 钱包文件加载出错</translation>
</message>
<message>
+ <source>Force safe mode (default: %u)</source>
+ <translation>强制安全模式 (默认: %u)</translation>
+ </message>
+ <message>
+ <source>Generate coins (default: %u)</source>
+ <translation>生成比特币 (默认: %u)</translation>
+ </message>
+ <message>
+ <source>How many blocks to check at startup (default: %u, 0 = all)</source>
+ <translation>启动时检测多少个数据块(默认: %u, 0=所有)</translation>
+ </message>
+ <message>
+ <source>Include IP addresses in debug output (default: %u)</source>
+ <translation>在调试输出中包含IP地址 (默认: %u)</translation>
+ </message>
+ <message>
<source>Invalid -proxy address: '%s'</source>
<translation>无效的代理地址:%s</translation>
</message>
<message>
+ <source>Limit size of signature cache to &lt;n&gt; entries (default: %u)</source>
+ <translation>签名缓冲区大小限制最多 &lt;n&gt; 条 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Listen for JSON-RPC connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>使用 &lt;port&gt;端口监听 JSON-RPC 连接 (默认: %u ; testnet: %u) </translation>
+ </message>
+ <message>
+ <source>Listen for connections on &lt;port&gt; (default: %u or testnet: %u)</source>
+ <translation>使用端口 &lt;port&gt; 监听连接 (默认: %u ; testnet: %u) </translation>
+ </message>
+ <message>
+ <source>Maintain at most &lt;n&gt; connections to peers (default: %u)</source>
+ <translation>保留最多 &lt;n&gt; 条节点连接 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Make the wallet broadcast transactions</source>
+ <translation>钱包广播事务处理</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection receive buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>每个连接的最大接收缓存,&lt;n&gt;*1000 字节 (默认: %u)</translation>
+ </message>
+ <message>
+ <source>Maximum per-connection send buffer, &lt;n&gt;*1000 bytes (default: %u)</source>
+ <translation>每个连接的最大发送缓存,&lt;n&gt;*1000 字节 (默认: %u)</translation>
+ </message>
+ <message>
+ <source>Only accept block chain matching built-in checkpoints (default: %u)</source>
+ <translation>仅接受符合客户端检查点设置 的数据块链 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Prepend debug output with timestamp (default: %u)</source>
+ <translation>输出调试信息时,前面加上时间戳 (默认: %u)</translation>
+ </message>
+ <message>
+ <source>Relay and mine data carrier transactions (default: %u)</source>
+ <translation>Relay and mine data carrier transactions (default: %u)</translation>
+ </message>
+ <message>
+ <source>Relay non-P2SH multisig (default: %u)</source>
+ <translation>是否转发 非P2SH格式的多签名交易 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Run a thread to flush wallet periodically (default: %u)</source>
+ <translation>运行一个线程,定时清理钱包 (默认: %u)</translation>
+ </message>
+ <message>
+ <source>Server certificate file (default: %s)</source>
+ <translation>服务器证书文件 (默认: %s) </translation>
+ </message>
+ <message>
+ <source>Server private key (default: %s)</source>
+ <translation>服务器私钥 (默认: %s) </translation>
+ </message>
+ <message>
+ <source>Set key pool size to &lt;n&gt; (default: %u)</source>
+ <translation>设置私钥池大小为 &lt;n&gt; (默认:%u) </translation>
+ </message>
+ <message>
+ <source>Set minimum block size in bytes (default: %u)</source>
+ <translation>设置数据块 最小字节数 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Set the number of threads to service RPC calls (default: %d)</source>
+ <translation>设置RPC服务线程数 (默认: %d) </translation>
+ </message>
+ <message>
+ <source>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</source>
+ <translation>Sets the DB_PRIVATE flag in the wallet db environment (default: %u)</translation>
+ </message>
+ <message>
+ <source>Specify configuration file (default: %s)</source>
+ <translation>指定配置文件 (默认: %s) </translation>
+ </message>
+ <message>
+ <source>Specify connection timeout in milliseconds (minimum: 1, default: %d)</source>
+ <translation>指定连接超时毫秒数 (最小: 1, 默认: %d) </translation>
+ </message>
+ <message>
+ <source>Specify pid file (default: %s)</source>
+ <translation>指定 pid 文件 (默认: %s) </translation>
+ </message>
+ <message>
+ <source>Spend unconfirmed change when sending transactions (default: %u)</source>
+ <translation>付款时允许使用未确认的零钱 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Stop running after importing blocks from disk (default: %u)</source>
+ <translation>从磁盘导入数据块后退出 (默认: %u) </translation>
+ </message>
+ <message>
+ <source>Threshold for disconnecting misbehaving peers (default: %u)</source>
+ <translation>断开 非礼节点的阀值 (默认: %u) </translation>
+ </message>
+ <message>
<source>Unknown network specified in -onlynet: '%s'</source>
<translation>-onlynet 指定的是未知网络:%s</translation>
</message>
@@ -3028,10 +3602,6 @@ rpcpassword=%s
<translation>非法金额 -paytxfee=&lt;amount&gt;: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>无效金额</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>金额不足</translation>
</message>
@@ -3064,10 +3634,6 @@ rpcpassword=%s
<translation>加载完成</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>使用 %s 选项</translation>
- </message>
- <message>
<source>Error</source>
<translation>错误</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_HK.ts b/src/qt/locale/bitcoin_zh_HK.ts
index 7062377f45..dfdbb7d1da 100644
--- a/src/qt/locale/bitcoin_zh_HK.ts
+++ b/src/qt/locale/bitcoin_zh_HK.ts
@@ -1,4 +1,4 @@
-<TS language="zh_HK" version="2.0">
+<TS language="zh_HK" version="2.1">
<context>
<name>AddressBookPage</name>
</context>
diff --git a/src/qt/locale/bitcoin_zh_TW.ts b/src/qt/locale/bitcoin_zh_TW.ts
index 56d598fc64..3792a76095 100644
--- a/src/qt/locale/bitcoin_zh_TW.ts
+++ b/src/qt/locale/bitcoin_zh_TW.ts
@@ -1,9 +1,9 @@
-<TS language="zh_TW" version="2.0">
+<TS language="zh_TW" version="2.1">
<context>
<name>AddressBookPage</name>
<message>
- <source>Double-click to edit address or label</source>
- <translation>按兩下來編輯位址或標記</translation>
+ <source>Right-click to edit address or label</source>
+ <translation>右鍵點一下來修改位址或標記</translation>
</message>
<message>
<source>Create a new address</source>
@@ -156,10 +156,6 @@
<translation>改變密碼</translation>
</message>
<message>
- <source>Enter the old and new passphrase to the wallet.</source>
- <translation>請輸入錢包的舊密碼及新密碼。</translation>
- </message>
- <message>
<source>Confirm wallet encryption</source>
<translation>確認錢包加密</translation>
</message>
@@ -188,10 +184,6 @@
<translation>輸入錢包的新密碼。&lt;br/&gt;密碼請用&lt;b&gt;10 個以上的字元&lt;/b&gt;,或是&lt;b&gt;8 個以上的字詞&lt;/b&gt;。</translation>
</message>
<message>
- <source>Bitcoin will close now to finish the encryption process. Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation>位元幣軟體現在要關閉,好完成加密程序。請注意,加密錢包不能完全防止入侵你的電腦的惡意程式偷取位元幣。</translation>
- </message>
- <message>
<source>Wallet encryption failed</source>
<translation>錢包加密失敗</translation>
</message>
@@ -311,10 +303,6 @@
<translation>付錢給一個位元幣位址</translation>
</message>
<message>
- <source>Modify configuration options for Bitcoin</source>
- <translation>修改位元幣軟體的設定選項</translation>
- </message>
- <message>
<source>Backup wallet to another location</source>
<translation>把錢包備份到其它地方</translation>
</message>
@@ -344,11 +332,11 @@
</message>
<message>
<source>&amp;Send</source>
- <translation>付款</translation>
+ <translation>已傳送</translation>
</message>
<message>
<source>&amp;Receive</source>
- <translation>收款</translation>
+ <translation>已接收</translation>
</message>
<message>
<source>Show information about Bitcoin Core</source>
@@ -478,10 +466,6 @@
<source>Up to date</source>
<translation>最新狀態</translation>
</message>
- <message numerus="yes">
- <source>Processed %n blocks of transaction history.</source>
- <translation><numerusform>已經處理了 %n 個區塊的交易紀錄。</numerusform></translation>
- </message>
<message>
<source>Catching up...</source>
<translation>正在趕進度...</translation>
@@ -495,18 +479,6 @@
<translation>收款交易</translation>
</message>
<message>
- <source>Date: %1
-Amount: %2
-Type: %3
-Address: %4
-</source>
- <translation>日期: %1
-金額: %2
-種類: %3
-位址: %4
-</translation>
- </message>
- <message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
<translation>錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
@@ -577,6 +549,14 @@ Address: %4
<translation>金額</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation>收款標記</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation>收款位址</translation>
+ </message>
+ <message>
<source>Date</source>
<translation>日期</translation>
</message>
@@ -701,10 +681,6 @@ Address: %4
<translation>否</translation>
</message>
<message>
- <source>This label turns red, if the transaction size is greater than 1000 bytes.</source>
- <translation>當交易大小大於 1000 位元組時,文字會變紅色。</translation>
- </message>
- <message>
<source>This means a fee of at least %1 per kB is required.</source>
<translation>表示每一千位元組(kB)需要至少 %1 的手續費。</translation>
</message>
@@ -717,14 +693,6 @@ Address: %4
<translation>優先度較高的交易比較有可能被接受放進區塊中。</translation>
</message>
<message>
- <source>This label turns red, if the priority is smaller than "medium".</source>
- <translation>當優先度低於「中等」時,文字會變紅色。</translation>
- </message>
- <message>
- <source>This label turns red, if any recipient receives an amount smaller than %1.</source>
- <translation>當任何一個收款金額小於 %1 時,文字會變紅色。</translation>
- </message>
- <message>
<source>(no label)</source>
<translation>(無標記)</translation>
</message>
@@ -796,7 +764,7 @@ Address: %4
<name>FreespaceChecker</name>
<message>
<source>A new data directory will be created.</source>
- <translation>就要造出新的資料目錄。</translation>
+ <translation>就要產生新的資料目錄。</translation>
</message>
<message>
<source>name</source>
@@ -845,30 +813,6 @@ Address: %4
<source>command-line options</source>
<translation>命令列選項</translation>
</message>
- <message>
- <source>UI options</source>
- <translation>使用界面選項</translation>
- </message>
- <message>
- <source>Set language, for example "de_DE" (default: system locale)</source>
- <translation>設定語言,比如說 de_DE (預設值: 系統語系)</translation>
- </message>
- <message>
- <source>Start minimized</source>
- <translation>啓動時縮到最小</translation>
- </message>
- <message>
- <source>Set SSL root certificates for payment request (default: -system-)</source>
- <translation>設定付款請求時所使用的 SSL 根憑證 (預設值: 系統憑證庫)</translation>
- </message>
- <message>
- <source>Show splash screen on startup (default: 1)</source>
- <translation>顯示啓動畫面(預設值: 1)</translation>
- </message>
- <message>
- <source>Choose data directory on startup (default: 0)</source>
- <translation>啓動時選擇資料目錄(預設值: 0)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -951,14 +895,6 @@ Address: %4
<translation>主要</translation>
</message>
<message>
- <source>Automatically start Bitcoin after logging in to the system.</source>
- <translation>在登入系統後自動啓動位元幣軟體。</translation>
- </message>
- <message>
- <source>&amp;Start Bitcoin on system login</source>
- <translation>系統登入時啟動位元幣</translation>
- </message>
- <message>
<source>Size of &amp;database cache</source>
<translation>資料庫快取大小</translation>
</message>
@@ -1071,10 +1007,6 @@ Address: %4
<translation>縮到最小到通知區域而不是工作列</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 Quit in the menu.</source>
- <translation>當視窗關閉時,把應用程式縮到最小,而不是結束。當勾選這個選項時,只能夠用選單中的結束來關掉應用程式。</translation>
- </message>
- <message>
<source>M&amp;inimize on close</source>
<translation>關閉時縮到最小</translation>
</message>
@@ -1087,10 +1019,6 @@ Address: %4
<translation>使用界面語言:</translation>
</message>
<message>
- <source>The user interface language can be set here. This setting will take effect after restarting Bitcoin.</source>
- <translation>可以在這裡設定使用者介面的語言。這個設定在重啓位元幣軟體後才會生效。</translation>
- </message>
- <message>
<source>&amp;Unit to show amounts in:</source>
<translation>金額顯示單位:</translation>
</message>
@@ -1127,10 +1055,6 @@ Address: %4
<translation>需要重新啟動客戶端軟體來讓改變生效。</translation>
</message>
<message>
- <source>Client will be shutdown, do you want to proceed?</source>
- <translation>客戶端軟體就要關掉了,繼續做下去嗎?</translation>
- </message>
- <message>
<source>This change would require a client restart.</source>
<translation>這項改變需要重新啟動客戶端軟體。</translation>
</message>
@@ -1213,10 +1137,6 @@ Address: %4
<source>Current total balance in watch-only addresses</source>
<translation>所有只能看位址的目前全部餘額</translation>
</message>
- <message>
- <source>out of sync</source>
- <translation>還沒同步</translation>
- </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1237,10 +1157,6 @@ Address: %4
<translation>付款要求的網路類型跟客戶端不符。</translation>
</message>
<message>
- <source>Payment request has expired.</source>
- <translation>付款的要求已經過期了。</translation>
- </message>
- <message>
<source>Payment request is not initialized.</source>
<translation>付款的要求沒有完成初始化。</translation>
</message>
@@ -1281,6 +1197,14 @@ Address: %4
<translation>來自 %1 的退款</translation>
</message>
<message>
+ <source>Payment request %1 is too large (%2 bytes, allowed %3 bytes).</source>
+ <translation>付款要求 %1 過大 (%2 位元組, 上限 %3 位元組).</translation>
+ </message>
+ <message>
+ <source>Payment request DoS protection</source>
+ <translation>支付請求的分佈式阻斷服務攻擊DoS保護</translation>
+ </message>
+ <message>
<source>Error communicating with %1: %2</source>
<translation>跟 %1 通訊時發生錯誤: %2</translation>
</message>
@@ -1308,10 +1232,6 @@ Address: %4
<translation>使用者代理</translation>
</message>
<message>
- <source>Address/Hostname</source>
- <translation>位址/主機名稱</translation>
- </message>
- <message>
<source>Ping Time</source>
<translation>Ping 時間</translation>
</message>
@@ -1343,14 +1263,6 @@ Address: %4
<translation>%1 秒</translation>
</message>
<message>
- <source>NETWORK</source>
- <translation>網路</translation>
- </message>
- <message>
- <source>UNKNOWN</source>
- <translation>不明</translation>
- </message>
- <message>
<source>None</source>
<translation>無</translation>
</message>
@@ -1549,18 +1461,10 @@ Address: %4
<translation>除錯紀錄檔</translation>
</message>
<message>
- <source>Open the Bitcoin debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation>從目前的資料目錄下開啓位元幣軟體的除錯紀錄檔。當紀錄檔很大時,可能會花好幾秒的時間。</translation>
- </message>
- <message>
<source>Clear console</source>
<translation>清主控台</translation>
</message>
<message>
- <source>Welcome to the Bitcoin RPC console.</source>
- <translation>歡迎使用位元幣 RPC 主控台。</translation>
- </message>
- <message>
<source>Use up and down arrows to navigate history, and &lt;b&gt;Ctrl-L&lt;/b&gt; to clear screen.</source>
<translation>請用上下游標鍵來瀏覽先前指令的紀錄,並用 &lt;b&gt;Ctrl-L&lt;/b&gt; 來清畫面。</translation>
</message>
@@ -1842,33 +1746,65 @@ Address: %4
</message>
<message>
<source>Choose...</source>
- <translation>選擇...</translation>
+ <translation>選項...</translation>
</message>
<message>
<source>collapse fee-settings</source>
<translation>展開手續費設定</translation>
</message>
<message>
- <source>Minimize</source>
- <translation>最小化</translation>
- </message>
- <message>
<source>per kilobyte</source>
<translation>每千位元組</translation>
</message>
<message>
+ <source>If the custom fee is set to 1000 satoshis and the transaction is only 250 bytes, then "per kilobyte" only pays 250 satoshis in fee, while "total at least" pays 1000 satoshis. For transactions bigger than a kilobyte both pay by kilobyte.</source>
+ <translation>如果自訂手續費設定為 1000 satoshi, 而交易資料大小只有 250 個位元組的話,那麽選擇「每千位元組」就只會付 250 satoshi 的手續費,換做選「總共至少」就會付 1000 satoshi. 但是如果交易資料大小超過一千個位元組,那麽兩者都是每千位元組的費用。</translation>
+ </message>
+ <message>
+ <source>total at least</source>
+ <translation>總共最少</translation>
+ </message>
+ <message>
+ <source>Paying only the minimum fee is just fine as long as there is less transaction volume than space in the blocks. But be aware that this can end up in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation>當交易量少於區塊可容納的空間時,只付最低手續費不會有什麽問題。但是當交易量的需求成長到超過整體網路可以處理的量時,可能會造成一筆一直不會被確認的交易。</translation>
+ </message>
+ <message>
<source>(read the tooltip)</source>
<translation>(請看提示)</translation>
</message>
<message>
+ <source>Recommended:</source>
+ <translation>建議值:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation>自訂:</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks...)</source>
+ <translation>(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
<source>Confirmation time:</source>
<translation>確認時間:</translation>
</message>
<message>
+ <source>normal</source>
+ <translation>正常</translation>
+ </message>
+ <message>
+ <source>fast</source>
+ <translation>快速</translation>
+ </message>
+ <message>
<source>Send as zero-fee transaction if possible</source>
<translation>盡可能送不用付手續費的交易</translation>
</message>
<message>
+ <source>(confirmation may take longer)</source>
+ <translation>(確認時間可能拉長)</translation>
+ </message>
+ <message>
<source>Send to multiple recipients at once</source>
<translation>一次付給多個收款人</translation>
</message>
@@ -1945,10 +1881,6 @@ Address: %4
<translation>或</translation>
</message>
<message>
- <source>The recipient address is not valid, please recheck.</source>
- <translation>收款位址無效,請再檢查看看。</translation>
- </message>
- <message>
<source>The amount to pay must be larger than 0.</source>
<translation>付款金額必須大於零。</translation>
</message>
@@ -1961,10 +1893,6 @@ Address: %4
<translation>包含 %1 的交易手續費後,總金額超過你的餘額了。</translation>
</message>
<message>
- <source>Duplicate address found, can only send to each address once per send operation.</source>
- <translation>發現有重複的位址。每個付款動作中,只能付給個別的位址一次。</translation>
- </message>
- <message>
<source>Transaction creation failed!</source>
<translation>製造交易失敗了!</translation>
</message>
@@ -1973,6 +1901,10 @@ Address: %4
<translation>交易被拒絕了!有時候會發生這種錯誤,是因為你錢包中的一些錢已經被花掉了。比如說你複製了錢包檔 wallet.dat, 然後用複製的錢包花掉了錢,你現在所用的原來的錢包中,卻沒有那筆錢已經花掉的紀錄。</translation>
</message>
<message>
+ <source>Pay only the minimum fee of %1</source>
+ <translation>只付最低手續費 %1</translation>
+ </message>
+ <message>
<source>Warning: Invalid Bitcoin address</source>
<translation>警告: 位元幣位址無效</translation>
</message>
@@ -2048,10 +1980,6 @@ Address: %4
<translation>訊息:</translation>
</message>
<message>
- <source>This is a verified payment request.</source>
- <translation>這是個已驗證的付款要求。</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation>請輸入這個位址的標記,來把它加進去已使用過位址的清單。</translation>
</message>
@@ -2060,10 +1988,6 @@ Address: %4
<translation>附加在位元幣付款協議 URI 中的訊息,會和交易內容一起存起來,給你自己做參考。注意: 這個訊息不會送到位元幣網路上。</translation>
</message>
<message>
- <source>This is an unverified payment request.</source>
- <translation>這是個沒驗證過的付款要求。</translation>
- </message>
- <message>
<source>Pay To:</source>
<translation>付給:</translation>
</message>
@@ -2094,10 +2018,6 @@ Address: %4
<translation>簽署訊息</translation>
</message>
<message>
- <source>You can sign messages with your addresses to prove you own them. Be careful not to sign anything vague, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation>你可以用自己的位址簽署訊息,來證明你對位址的所有權。但是請小心,不要簽署語意含糊不清的內容,因為釣魚式詐騙可能會用騙你簽署的手法來冒充是你。只有在語句中的細節你都同意時才簽署。</translation>
- </message>
- <message>
<source>The Bitcoin address to sign the message with</source>
<translation>用來簽署訊息的位元幣位址</translation>
</message>
@@ -2150,10 +2070,6 @@ Address: %4
<translation>驗證訊息</translation>
</message>
<message>
- <source>Enter the signing address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack.</source>
- <translation>請在下面輸入簽署的位址,訊息(請確定完整複製了所包含的換行,空格,跳位符號等等),以及簽章,來驗證這個訊息。請小心,除了訊息內容以外,不要對簽章本身過度解讀,以避免被用「中間人攻擊法」詐騙。</translation>
- </message>
- <message>
<source>The Bitcoin address the message was signed with</source>
<translation>簽署這個訊息的位元幣位址</translation>
</message>
@@ -2417,10 +2333,6 @@ Address: %4
<translation>種類</translation>
</message>
<message>
- <source>Address</source>
- <translation>位址</translation>
- </message>
- <message>
<source>Immature (%1 confirmations, will be available after %2)</source>
<translation>未成熟(確認 %1 次,會在 %2 次後可用)</translation>
</message>
@@ -2449,6 +2361,10 @@ Address: %4
<translation>離線中</translation>
</message>
<message>
+ <source>Label</source>
+ <translation>標記</translation>
+ </message>
+ <message>
<source>Unconfirmed</source>
<translation>未確認</translation>
</message>
@@ -2505,10 +2421,6 @@ Address: %4
<translation>不論如何有一個只能觀看的地只有參與這次的交易</translation>
</message>
<message>
- <source>Destination address of transaction.</source>
- <translation>交易的目的地位址。</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation>要減掉或加進餘額的金額。</translation>
</message>
@@ -2748,30 +2660,6 @@ Address: %4
<translation>是否接受外來連線(預設值: 當沒有 -proxy 或 -connect 時為 1)</translation>
</message>
<message>
- <source>%s, you must set a rpcpassword in the configuration file:
-%s
-It is recommended you use the following random password:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(you do not need to remember this password)
-The username and password MUST NOT be the same.
-If the file does not exist, create it with owner-readable-only file permissions.
-It is also recommended to set alertnotify so you are notified of problems;
-for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
-</source>
- <translation>%s, 你必須要在以下設定檔中設定 RPC 密碼(rpcpassword):
-%s
-建議你使用以下隨機產生的密碼:
-rpcuser=bitcoinrpc
-rpcpassword=%s
-(你不用記住這個密碼)
-使用者名稱(rpcuser)和密碼(rpcpassword)不可以相同!
-如果還沒有這個設定檔,請在造出來的時候,設定檔案權限成「只有主人才能讀取」。
-也建議你設定警示通知,發生問題時你才會被通知到;
-比如說設定成:
-alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
- </message>
- <message>
<source>Bind to given address and always listen on it. Use [host]:port notation for IPv6</source>
<translation>和指定的位址繫結,並且一直在指定位址聽候連線。IPv6 請用 [主機]:通訊埠 這種格式</translation>
</message>
@@ -2788,14 +2676,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>進入回歸測試模式,使用可以立即解出區塊的特殊區塊鏈。</translation>
</message>
<message>
- <source>Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.</source>
- <translation>錯誤: 交易被拒絕了!有時候會發生這種錯誤,是因為你錢包中的一些錢已經被花掉了。比如說你複製了錢包檔 wallet.dat, 然後用複製的錢包花掉了錢,你現在所用的原來的錢包中,卻沒有那筆錢已經花掉的紀錄。</translation>
- </message>
- <message>
- <source>Error: This transaction requires a transaction fee of at least %s because of its amount, complexity, or use of recently received funds!</source>
- <translation>錯誤: 這筆交易需要至少 %s 的手續費!因為它的金額太大,或複雜度太高,或是使用了最近才剛收到的款項。</translation>
- </message>
- <message>
<source>Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)</source>
<translation>當錢包有交易改變時要執行的指令(指令中的 %s 會被取代成交易識別碼)</translation>
</message>
@@ -2872,10 +2752,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>除錯與測試選項</translation>
</message>
<message>
- <source>Discover own IP address (default: 1 when listening and no -externalip)</source>
- <translation>找出自己的網際網路位址(預設值: 當有聽候連線且沒有 -externalip 時為 1)</translation>
- </message>
- <message>
<source>Do not load the wallet and disable wallet RPC calls</source>
<translation>不要載入錢包,並且拿掉錢包相關的 RPC 功能請求。</translation>
</message>
@@ -2908,10 +2784,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>錯誤: 磁碟空間很少!</translation>
</message>
<message>
- <source>Error: Wallet locked, unable to create transaction!</source>
- <translation>錯誤: 錢包被上鎖了,沒辦法製造新的交易!</translation>
- </message>
- <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation>在任意的通訊埠聽候失敗。如果你希望這樣的話,可以設定 -listen=0.</translation>
</message>
@@ -2940,10 +2812,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>只有連接到網絡節點 &lt;net&gt; (IPv4,IPv6或onion)</translation>
</message>
<message>
- <source>Rebuild block chain index from current blk000??.dat files</source>
- <translation>從目前的區塊檔 blk000??.dat 重建區塊鏈的索引</translation>
- </message>
- <message>
<source>Set database cache size in megabytes (%d to %d, default: %d)</source>
<translation>設定資料庫快取大小是多少百萬位元組(MB,範圍: %d 到 %d,預設值: %d)</translation>
</message>
@@ -3004,10 +2872,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>沒辦法鎖定資料目錄 %s。位元幣核心可能已經在執行了。</translation>
</message>
<message>
- <source>Continuously rate-limit free transactions to &lt;n&gt;*1000 bytes per minute (default:%u)</source>
- <translation>對沒付手續費的交易持續限制每分鐘內最多只能有 &lt;n&gt;*1000 個位元組(預設值: %u)</translation>
- </message>
- <message>
<source>Create new files with system default permissions, instead of umask 077 (only effective with disabled wallet functionality)</source>
<translation>用系統預設權限來造出新的檔案,而不是用使用者權限罩遮(umask)值 077 (只有在關掉錢包功能時才有作用)。</translation>
</message>
@@ -3032,6 +2896,14 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>當製造交易時,如果每千位元組(Kb)的手續費比這個值低,就視為沒付手續費 (預設值: %s)</translation>
</message>
<message>
+ <source>If paytxfee is not set, include enough fee so transactions begin confirmation on average within n blocks (default: %u)</source>
+ <translation>當沒有設定 paytxfee 時,自動包含可以讓交易能在平均 n 個區塊內開始確認的手續費(預設值: %u)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation>-maxtxfee=&lt;amount&gt;: '%s' 的金額無效 (必須大於最低轉發手續費 %s 以避免交易無法確認)</translation>
+ </message>
+ <message>
<source>Maximum size of data in data carrier transactions we relay and mine (default: %u)</source>
<translation>轉發和開採時,對只帶資料的交易的大小上限(預設值: %u)</translation>
</message>
@@ -3052,6 +2924,34 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>此產品也包含了由 OpenSSL Project 所開發的 OpenSSL Toolkit 軟體 &lt;https://www.openssl.org/&gt;, 和由 Eric Young 撰寫的加解密軟體,以及由 Thomas Bernard 所撰寫的 UPnP 軟體。</translation>
</message>
<message>
+ <source>To use bitcoind, or the -server option to bitcoin-qt, you must set an rpcpassword in the configuration file:
+%s
+It is recommended you use the following random password:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(you do not need to remember this password)
+The username and password MUST NOT be the same.
+If the file does not exist, create it with owner-readable-only file permissions.
+It is also recommended to set alertnotify so you are notified of problems;
+for example: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</source>
+ <translation>要使用 bitcoind, 或是對 bitcoin-qt 指定 -server 選項,你必須要在以下設定檔中設定 RPC 密碼(選項: rpcpassword):
+%s
+建議你使用以下隨機產生的密碼:
+rpcuser=bitcoinrpc
+rpcpassword=%s
+(你不用記住這個密碼)
+注意使用者名稱(rpcuser)和密碼(rpcpassword)不可以相同!
+如果設定檔還不存在,請在新增時,設定檔案權限為"只有主人才能讀取"。
+也建議你設定警示通知,這樣發生問題時你才會被通知到;
+比如說設定: alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com
+</translation>
+ </message>
+ <message>
+ <source>Warning: -maxtxfee is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation>警告: -maxtxfee 設定了很高的金額!這可是一次交易就有可能付出的最高手續費。</translation>
+ </message>
+ <message>
<source>Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin Core will not work properly.</source>
<translation>警告: 請檢查電腦日期和時間是否正確!位元幣核心沒辦法在時鐘不準的情況下正常運作。</translation>
</message>
@@ -3060,10 +2960,18 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>在白名單中的節點不會因為偵測到阻斷服務攻擊而被停用。來自這些節點的交易也一定會被轉發,即使說交易本來就在記憶池裡了也一樣。適用於像是閘道伺服器。</translation>
</message>
<message>
+ <source>Accept public REST requests (default: %u)</source>
+ <translation>接受公開的REST請求 (預設值: %u)</translation>
+ </message>
+ <message>
<source>Cannot resolve -whitebind address: '%s'</source>
<translation>沒辦法解析 -whitebind 指定的位址: '%s'</translation>
</message>
<message>
+ <source>Choose data directory on startup (default: 0)</source>
+ <translation>啓動時選擇資料目錄(預設值: 0)</translation>
+ </message>
+ <message>
<source>Connect through SOCKS5 proxy</source>
<translation>透過 SOCKS5 代理伺服器連線</translation>
</message>
@@ -3080,6 +2988,10 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>載入 wallet.dat 檔案時發生錯誤: 這個錢包需要新版的位元幣核心</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation>讀取資料庫時發生錯誤,要關閉了。</translation>
+ </message>
+ <message>
<source>Error: Unsupported argument -tor found, use -onion.</source>
<translation>錯誤: 找到不再支援的 -tor 參數,請改用 -onion 參數。</translation>
</message>
@@ -3093,7 +3005,11 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
</message>
<message>
<source>Initialization sanity check failed. Bitcoin Core is shutting down.</source>
- <translation>初始化時的基本檢查失敗了。位元幣核心將會關閉。</translation>
+ <translation>初始化時的基本檢查失敗了。位元幣核心就要關閉了。</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -maxtxfee=&lt;amount&gt;: '%s'</source>
+ <translation>-maxtxfee=&lt;amount&gt;: '%s' 的金額無效</translation>
</message>
<message>
<source>Invalid amount for -minrelaytxfee=&lt;amount&gt;: '%s'</source>
@@ -3112,10 +3028,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>指定在 -whitelist 的網段無效: '%s'</translation>
</message>
<message>
- <source>Keep at most &lt;n&gt; unconnectable blocks in memory (default: %u)</source>
- <translation>在記憶體中保存最多 &lt;n&gt; 個不和其他區塊相連結的區塊(預設值 : %u)</translation>
- </message>
- <message>
<source>Keep at most &lt;n&gt; unconnectable transactions in memory (default: %u)</source>
<translation>保持最多 &lt;n&gt; 無法連結的交易在記憶體 (預設: %u)</translation>
</message>
@@ -3128,10 +3040,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>節點轉發選項:</translation>
</message>
<message>
- <source>Print block on startup, if found in block index</source>
- <translation>啟動時輸出指定的區塊內容,如果有在區塊索引中找到的話</translation>
- </message>
- <message>
<source>RPC SSL options: (see the Bitcoin Wiki for SSL setup instructions)</source>
<translation>RPC SSL 選項: (SSL 設定程序請見 Bitcoin Wiki)</translation>
</message>
@@ -3140,6 +3048,10 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>RPC 伺服器選項:</translation>
</message>
<message>
+ <source>RPC support for HTTP persistent connections (default: %d)</source>
+ <translation>RPC 是否支援 HTTP 持久連線(預設值: %d)</translation>
+ </message>
+ <message>
<source>Randomly drop 1 of every &lt;n&gt; network messages</source>
<translation>隨機丟掉 &lt;n&gt; 分之一的網路訊息</translation>
</message>
@@ -3156,10 +3068,22 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>盡可能送出不用付手續費的交易(預設值: %u)</translation>
</message>
<message>
+ <source>Set SSL root certificates for payment request (default: -system-)</source>
+ <translation>設定付款請求時所使用的 SSL 根憑證 (預設值: 系統憑證庫)</translation>
+ </message>
+ <message>
+ <source>Set language, for example "de_DE" (default: system locale)</source>
+ <translation>設定語言,比如說 de_DE (預設值: 系統語系)</translation>
+ </message>
+ <message>
<source>Show all debugging options (usage: --help -help-debug)</source>
<translation>顯示所有的除錯選項 (用法: --help --help-debug)</translation>
</message>
<message>
+ <source>Show splash screen on startup (default: 1)</source>
+ <translation>顯示啓動畫面(預設值: 1)</translation>
+ </message>
+ <message>
<source>Shrink debug.log file on client startup (default: 1 when no -debug)</source>
<translation>客戶端軟體啓動時把 debug.log 檔縮小(預設值: 當沒有 -debug 時為 1)</translation>
</message>
@@ -3168,6 +3092,10 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>簽署交易失敗</translation>
</message>
<message>
+ <source>Start minimized</source>
+ <translation>啓動時縮到最小</translation>
+ </message>
+ <message>
<source>This is experimental software.</source>
<translation>這套軟體屬於實驗性質。</translation>
</message>
@@ -3180,6 +3108,10 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>交易金額必須是正的</translation>
</message>
<message>
+ <source>Transaction too large for fee policy</source>
+ <translation>根據交易手續費準則,本交易的位元量過大</translation>
+ </message>
+ <message>
<source>Transaction too large</source>
<translation>交易位元量太大</translation>
</message>
@@ -3204,10 +3136,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>警告</translation>
</message>
<message>
- <source>Warning: This version is obsolete, upgrade required!</source>
- <translation>警告: 這個版本已經被淘汰了,必須要升級!</translation>
- </message>
- <message>
<source>Warning: Unsupported argument -benchmark ignored, use -debug=bench.</source>
<translation>警告: 忽略了不再支援的 -benchmark 參數,請改用 -debug=bench.</translation>
</message>
@@ -3276,10 +3204,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>使用 -checkblocks 檢查區塊的仔細程度(0 到 4,預設值: %u)</translation>
</message>
<message>
- <source>If paytxfee is not set, include enough fee so transactions are confirmed on average within n blocks (default: %u)</source>
- <translation>當沒有設定 paytxfee 時,自動包含可以讓交易能在平均 n 個區塊內確認的手續費(預設值: %u)</translation>
- </message>
- <message>
<source>Log transaction priority and fee per kB when mining blocks (default: %u)</source>
<translation>開採區塊的時候,紀錄交易的優先度以及每千位元組(kB)的手續費(預設值: %u)</translation>
</message>
@@ -3372,10 +3296,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>在除錯輸出內容前附加時間(預設值: %u)</translation>
</message>
<message>
- <source>Print block tree on startup (default: %u)</source>
- <translation>啟動時輸出區塊樹(預設值: %u)</translation>
- </message>
- <message>
<source>Relay and mine data carrier transactions (default: %u)</source>
<translation>允許轉發和開採只帶資料的交易(預設值: %u)</translation>
</message>
@@ -3452,10 +3372,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>設定 -paytxfee=&lt;金額&gt; 的金額無效: '%s'</translation>
</message>
<message>
- <source>Invalid amount</source>
- <translation>無效的金額</translation>
- </message>
- <message>
<source>Insufficient funds</source>
<translation>累積金額不足</translation>
</message>
@@ -3488,10 +3404,6 @@ alertnotify=echo %%s | mail -s "Bitcoin Alert" admin@foo.com</translation>
<translation>載入完成</translation>
</message>
<message>
- <source>To use the %s option</source>
- <translation>為了要使用 %s 選項</translation>
- </message>
- <message>
<source>Error</source>
<translation>錯誤</translation>
</message>
diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp
index a9e4b339e4..efb2bf4158 100644
--- a/src/qt/optionsdialog.cpp
+++ b/src/qt/optionsdialog.cpp
@@ -208,7 +208,7 @@ void OptionsDialog::on_resetButton_clicked()
{
// confirmation dialog
QMessageBox::StandardButton btnRetVal = QMessageBox::question(this, tr("Confirm options reset"),
- tr("Client restart required to activate changes.") + "<br><br>" + tr("Client will be shutdown, do you want to proceed?"),
+ tr("Client restart required to activate changes.") + "<br><br>" + tr("Client will be shut down. Do you want to proceed?"),
QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel);
if(btnRetVal == QMessageBox::Cancel)
diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp
index a169ed6b55..41d6acf358 100644
--- a/src/qt/optionsmodel.cpp
+++ b/src/qt/optionsmodel.cpp
@@ -335,8 +335,8 @@ bool OptionsModel::getProxySettings(QNetworkProxy& proxy) const
proxyType curProxy;
if (GetProxy(NET_IPV4, curProxy)) {
proxy.setType(QNetworkProxy::Socks5Proxy);
- proxy.setHostName(QString::fromStdString(curProxy.ToStringIP()));
- proxy.setPort(curProxy.GetPort());
+ proxy.setHostName(QString::fromStdString(curProxy.proxy.ToStringIP()));
+ proxy.setPort(curProxy.proxy.GetPort());
return true;
}
diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp
index 4fa15db9c6..2e33b9adf8 100644
--- a/src/qt/overviewpage.cpp
+++ b/src/qt/overviewpage.cpp
@@ -18,8 +18,8 @@
#include <QAbstractItemDelegate>
#include <QPainter>
-#define DECORATION_SIZE 64
-#define NUM_ITEMS 3
+#define DECORATION_SIZE 54
+#define NUM_ITEMS 5
class TxViewDelegate : public QAbstractItemDelegate
{
@@ -121,6 +121,12 @@ OverviewPage::OverviewPage(QWidget *parent) :
{
ui->setupUi(this);
+ // use a SingleColorIcon for the "out of sync warning" icon
+ QIcon icon = SingleColorIcon(":/icons/warning");
+ icon.addPixmap(icon.pixmap(QSize(64,64), QIcon::Normal), QIcon::Disabled); // also set the disabled icon because we are using a disabled QPushButton to work around missing HiDPI support of QLabel (https://bugreports.qt.io/browse/QTBUG-42503)
+ ui->labelTransactionsStatus->setIcon(icon);
+ ui->labelWalletStatus->setIcon(icon);
+
// Recent transactions
ui->listTransactions->setItemDelegate(txdelegate);
ui->listTransactions->setIconSize(QSize(DECORATION_SIZE, DECORATION_SIZE));
@@ -129,10 +135,6 @@ OverviewPage::OverviewPage(QWidget *parent) :
connect(ui->listTransactions, SIGNAL(clicked(QModelIndex)), this, SLOT(handleTransactionClicked(QModelIndex)));
- // init "out of sync" warning labels
- ui->labelWalletStatus->setText("(" + tr("out of sync") + ")");
- ui->labelTransactionsStatus->setText("(" + tr("out of sync") + ")");
-
// start with displaying the "out of sync" warnings
showOutOfSyncWarning(true);
}
diff --git a/src/qt/paymentrequestplus.cpp b/src/qt/paymentrequestplus.cpp
index b69461ad9e..7e9729eeb9 100644
--- a/src/qt/paymentrequestplus.cpp
+++ b/src/qt/paymentrequestplus.cpp
@@ -59,12 +59,6 @@ bool PaymentRequestPlus::IsInitialized() const
return paymentRequest.IsInitialized();
}
-QString PaymentRequestPlus::getPKIType() const
-{
- if (!IsInitialized()) return QString("none");
- return QString::fromStdString(paymentRequest.pki_type());
-}
-
bool PaymentRequestPlus::getMerchant(X509_STORE* certStore, QString& merchant) const
{
merchant.clear();
@@ -124,7 +118,7 @@ bool PaymentRequestPlus::getMerchant(X509_STORE* certStore, QString& merchant) c
// The first cert is the signing cert, the rest are untrusted certs that chain
// to a valid root authority. OpenSSL needs them separately.
STACK_OF(X509) *chain = sk_X509_new_null();
- for (int i = certs.size()-1; i > 0; i--) {
+ for (int i = certs.size() - 1; i > 0; i--) {
sk_X509_push(chain, certs[i]);
}
X509 *signing_cert = certs[0];
@@ -172,9 +166,8 @@ bool PaymentRequestPlus::getMerchant(X509_STORE* certStore, QString& merchant) c
EVP_MD_CTX_init(&ctx);
if (!EVP_VerifyInit_ex(&ctx, digestAlgorithm, NULL) ||
!EVP_VerifyUpdate(&ctx, data_to_verify.data(), data_to_verify.size()) ||
- !EVP_VerifyFinal(&ctx, (const unsigned char*)paymentRequest.signature().data(), paymentRequest.signature().size(), pubkey)) {
-
- throw SSLVerifyError("Bad signature, invalid PaymentRequest.");
+ !EVP_VerifyFinal(&ctx, (const unsigned char*)paymentRequest.signature().data(), (unsigned int)paymentRequest.signature().size(), pubkey)) {
+ throw SSLVerifyError("Bad signature, invalid payment request.");
}
// OpenSSL API for getting human printable strings from certs is baroque.
diff --git a/src/qt/paymentrequestplus.h b/src/qt/paymentrequestplus.h
index 61f8a3415d..99a7186b85 100644
--- a/src/qt/paymentrequestplus.h
+++ b/src/qt/paymentrequestplus.h
@@ -29,7 +29,6 @@ public:
bool SerializeToString(std::string* output) const;
bool IsInitialized() const;
- QString getPKIType() const;
// Returns true if merchant's identity is authenticated, and
// returns human-readable merchant identity in merchant
bool getMerchant(X509_STORE* certStore, QString& merchant) const;
diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp
index ad489de343..09e9949b10 100644
--- a/src/qt/paymentserver.cpp
+++ b/src/qt/paymentserver.cpp
@@ -97,7 +97,11 @@ static QList<QString> savedPaymentRequests;
static void ReportInvalidCertificate(const QSslCertificate& cert)
{
- qDebug() << "ReportInvalidCertificate: Payment server found an invalid certificate: " << cert.subjectInfo(QSslCertificate::CommonName);
+#if QT_VERSION < 0x050000
+ qDebug() << QString("%1: Payment server found an invalid certificate: ").arg(__func__) << cert.serialNumber() << cert.subjectInfo(QSslCertificate::CommonName) << cert.subjectInfo(QSslCertificate::OrganizationalUnitName);
+#else
+ qDebug() << QString("%1: Payment server found an invalid certificate: ").arg(__func__) << cert.serialNumber() << cert.subjectInfo(QSslCertificate::CommonName) << cert.subjectInfo(QSslCertificate::DistinguishedNameQualifier) << cert.subjectInfo(QSslCertificate::OrganizationalUnitName);
+#endif
}
//
@@ -143,13 +147,20 @@ void PaymentServer::LoadRootCAs(X509_STORE* _store)
int nRootCerts = 0;
const QDateTime currentTime = QDateTime::currentDateTime();
- foreach (const QSslCertificate& cert, certList)
- {
+
+ foreach (const QSslCertificate& cert, certList) {
+ // Don't log NULL certificates
+ if (cert.isNull())
+ continue;
+
+ // Not yet active/valid, or expired certificate
if (currentTime < cert.effectiveDate() || currentTime > cert.expiryDate()) {
ReportInvalidCertificate(cert);
continue;
}
+
#if QT_VERSION >= 0x050000
+ // Blacklisted certificate
if (cert.isBlacklisted()) {
ReportInvalidCertificate(cert);
continue;
@@ -301,7 +312,7 @@ PaymentServer::PaymentServer(QObject* parent, bool startLocalServer) :
// Install global event filter to catch QFileOpenEvents
// on Mac: sent when you click bitcoin: links
- // other OSes: helpful when dealing with payment request files (in the future)
+ // other OSes: helpful when dealing with payment request files
if (parent)
parent->installEventFilter(this);
@@ -332,14 +343,13 @@ PaymentServer::~PaymentServer()
}
//
-// OSX-specific way of handling bitcoin: URIs and
-// PaymentRequest mime types
+// OSX-specific way of handling bitcoin: URIs and PaymentRequest mime types.
+// Also used by paymentservertests.cpp and when opening a payment request file
+// via "Open URI..." menu entry.
//
bool PaymentServer::eventFilter(QObject *object, QEvent *event)
{
- // clicking on bitcoin: URIs creates FileOpen events on the Mac
- if (event->type() == QEvent::FileOpen)
- {
+ if (event->type() == QEvent::FileOpen) {
QFileOpenEvent *fileEvent = static_cast<QFileOpenEvent*>(event);
if (!fileEvent->file().isEmpty())
handleURIOrFile(fileEvent->file());
@@ -515,7 +525,7 @@ bool PaymentServer::readPaymentRequestFromFile(const QString& filename, PaymentR
return request.parse(data);
}
-bool PaymentServer::processPaymentRequest(PaymentRequestPlus& request, SendCoinsRecipient& recipient)
+bool PaymentServer::processPaymentRequest(const PaymentRequestPlus& request, SendCoinsRecipient& recipient)
{
if (!optionsModel)
return false;
@@ -560,9 +570,9 @@ bool PaymentServer::processPaymentRequest(PaymentRequestPlus& request, SendCoins
addresses.append(QString::fromStdString(CBitcoinAddress(dest).ToString()));
}
else if (!recipient.authenticatedMerchant.isEmpty()) {
- // Insecure payments to custom bitcoin addresses are not supported
- // (there is no good way to tell the user where they are paying in a way
- // they'd have a chance of understanding).
+ // Unauthenticated payment requests to custom bitcoin addresses are not supported
+ // (there is no good way to tell the user where they are paying in a way they'd
+ // have a chance of understanding).
emit message(tr("Payment request rejected"),
tr("Unverified payment requests to custom payment scripts are unsupported."),
CClientUIInterface::MSG_ERROR);
diff --git a/src/qt/paymentserver.h b/src/qt/paymentserver.h
index 6bf5ac2eea..32ed27983e 100644
--- a/src/qt/paymentserver.h
+++ b/src/qt/paymentserver.h
@@ -131,7 +131,7 @@ protected:
bool eventFilter(QObject *object, QEvent *event);
private:
- bool processPaymentRequest(PaymentRequestPlus& request, SendCoinsRecipient& recipient);
+ bool processPaymentRequest(const PaymentRequestPlus& request, SendCoinsRecipient& recipient);
void fetchRequest(const QUrl& url);
// Setup networking
diff --git a/src/qt/peertablemodel.cpp b/src/qt/peertablemodel.cpp
index 220f273d02..f5904a4d8e 100644
--- a/src/qt/peertablemodel.cpp
+++ b/src/qt/peertablemodel.cpp
@@ -63,11 +63,12 @@ public:
#if QT_VERSION >= 0x040700
cachedNodeStats.reserve(vNodes.size());
#endif
- BOOST_FOREACH(CNode* pnode, vNodes)
+ foreach (CNode* pnode, vNodes)
{
CNodeCombinedStats stats;
stats.nodeStateStats.nMisbehavior = 0;
stats.nodeStateStats.nSyncHeight = -1;
+ stats.nodeStateStats.nCommonHeight = -1;
stats.fNodeStateStatsAvailable = false;
pnode->copyStats(stats.nodeStats);
cachedNodeStats.append(stats);
@@ -91,7 +92,7 @@ public:
// build index map
mapNodeRows.clear();
int row = 0;
- BOOST_FOREACH(CNodeCombinedStats &stats, cachedNodeStats)
+ foreach (const CNodeCombinedStats& stats, cachedNodeStats)
mapNodeRows.insert(std::pair<NodeId, int>(stats.nodeStats.nodeid, row++));
}
diff --git a/src/qt/recentrequeststablemodel.cpp b/src/qt/recentrequeststablemodel.cpp
index 5221ec3e24..543b977d8f 100644
--- a/src/qt/recentrequeststablemodel.cpp
+++ b/src/qt/recentrequeststablemodel.cpp
@@ -5,9 +5,10 @@
#include "recentrequeststablemodel.h"
#include "bitcoinunits.h"
-#include "clientversion.h"
#include "guiutil.h"
#include "optionsmodel.h"
+
+#include "clientversion.h"
#include "streams.h"
#include <boost/foreach.hpp>
diff --git a/src/qt/res/bitcoin-qt-res.rc b/src/qt/res/bitcoin-qt-res.rc
index c0f3e2fb39..9f66d0af79 100644
--- a/src/qt/res/bitcoin-qt-res.rc
+++ b/src/qt/res/bitcoin-qt-res.rc
@@ -19,7 +19,7 @@ BEGIN
BLOCK "040904E4" // U.S. English - multilingual (hex)
BEGIN
VALUE "CompanyName", "Bitcoin"
- VALUE "FileDescription", "Bitcoin Core (OSS GUI client for Bitcoin)"
+ VALUE "FileDescription", "Bitcoin Core (GUI node for Bitcoin)"
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", "bitcoin-qt"
VALUE "LegalCopyright", COPYRIGHT_STR
diff --git a/src/qt/res/icons/warning.png b/src/qt/res/icons/warning.png
new file mode 100644
index 0000000000..723a30a658
--- /dev/null
+++ b/src/qt/res/icons/warning.png
Binary files differ
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index 29c971ec79..f828ce2534 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -16,15 +16,16 @@
#include "rpcclient.h"
#include "util.h"
-#include "json/json_spirit_value.h"
-
#include <openssl/crypto.h>
+#include "univalue/univalue.h"
+
#ifdef ENABLE_WALLET
#include <db_cxx.h>
#endif
#include <QKeyEvent>
+#include <QMenu>
#include <QScrollBar>
#include <QThread>
#include <QTime>
@@ -167,21 +168,21 @@ void RPCExecutor::request(const QString &command)
std::string strPrint;
// Convert argument list to JSON objects in method-dependent way,
// and pass it along with the method name to the dispatcher.
- json_spirit::Value result = tableRPC.execute(
+ UniValue result = tableRPC.execute(
args[0],
RPCConvertValues(args[0], std::vector<std::string>(args.begin() + 1, args.end())));
// Format result reply
- if (result.type() == json_spirit::null_type)
+ if (result.isNull())
strPrint = "";
- else if (result.type() == json_spirit::str_type)
+ else if (result.isStr())
strPrint = result.get_str();
else
- strPrint = write_string(result, true);
+ strPrint = result.write(2);
emit reply(RPCConsole::CMD_REPLY, QString::fromStdString(strPrint));
}
- catch (const json_spirit::Object& objError)
+ catch (UniValue& objError)
{
try // Nice formatting for standard-format error
{
@@ -191,7 +192,7 @@ void RPCExecutor::request(const QString &command)
}
catch (const std::runtime_error&) // raised when converting to invalid type, i.e. missing code or message
{ // Show raw JSON object
- emit reply(RPCConsole::CMD_ERROR, QString::fromStdString(write_string(json_spirit::Value(objError), false)));
+ emit reply(RPCConsole::CMD_ERROR, QString::fromStdString(objError.write()));
}
}
catch (const std::exception& e)
@@ -205,7 +206,8 @@ RPCConsole::RPCConsole(QWidget *parent) :
ui(new Ui::RPCConsole),
clientModel(0),
historyPtr(0),
- cachedNodeid(-1)
+ cachedNodeid(-1),
+ contextMenu(0)
{
ui->setupUi(this);
GUIUtil::restoreWindowGeometry("nRPCConsoleWindow", this->size(), this);
@@ -305,10 +307,22 @@ void RPCConsole::setClientModel(ClientModel *model)
ui->peerWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->peerWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->peerWidget->setSelectionMode(QAbstractItemView::SingleSelection);
+ ui->peerWidget->setContextMenuPolicy(Qt::CustomContextMenu);
ui->peerWidget->setColumnWidth(PeerTableModel::Address, ADDRESS_COLUMN_WIDTH);
ui->peerWidget->setColumnWidth(PeerTableModel::Subversion, SUBVERSION_COLUMN_WIDTH);
ui->peerWidget->setColumnWidth(PeerTableModel::Ping, PING_COLUMN_WIDTH);
+ // create context menu actions
+ QAction* disconnectAction = new QAction(tr("&Disconnect Node"), this);
+
+ // create context menu
+ contextMenu = new QMenu();
+ contextMenu->addAction(disconnectAction);
+
+ // context menu signals
+ connect(ui->peerWidget, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showMenu(const QPoint&)));
+ connect(disconnectAction, SIGNAL(triggered()), this, SLOT(disconnectSelectedNode()));
+
// connect the peerWidget selection model to our peerSelected() handler
connect(ui->peerWidget->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)),
this, SLOT(peerSelected(const QItemSelection &, const QItemSelection &)));
@@ -471,10 +485,10 @@ void RPCConsole::startExecutor()
void RPCConsole::on_tabWidget_currentChanged(int index)
{
- if(ui->tabWidget->widget(index) == ui->tab_console)
- {
+ if (ui->tabWidget->widget(index) == ui->tab_console)
ui->lineEdit->setFocus();
- }
+ else if (ui->tabWidget->widget(index) != ui->tab_peers)
+ clearSelectedNode();
}
void RPCConsole::on_openDebugLogfileButton_clicked()
@@ -544,12 +558,11 @@ void RPCConsole::peerLayoutChanged()
return;
// find the currently selected row
- int selectedRow;
+ int selectedRow = -1;
QModelIndexList selectedModelIndex = ui->peerWidget->selectionModel()->selectedIndexes();
- if (selectedModelIndex.isEmpty())
- selectedRow = -1;
- else
+ if (!selectedModelIndex.isEmpty()) {
selectedRow = selectedModelIndex.first().row();
+ }
// check if our detail node has a row in the table (it may not necessarily
// be at selectedRow since its position can change after a layout change)
@@ -559,9 +572,6 @@ void RPCConsole::peerLayoutChanged()
{
// detail node dissapeared from table (node disconnected)
fUnselect = true;
- cachedNodeid = -1;
- ui->detailWidget->hide();
- ui->peerHeading->setText(tr("Select a peer to view detailed information."));
}
else
{
@@ -576,10 +586,8 @@ void RPCConsole::peerLayoutChanged()
stats = clientModel->getPeerTableModel()->getNodeStats(detailNodeRow);
}
- if (fUnselect && selectedRow >= 0)
- {
- ui->peerWidget->selectionModel()->select(QItemSelection(selectedModelIndex.first(), selectedModelIndex.last()),
- QItemSelectionModel::Deselect);
+ if (fUnselect && selectedRow >= 0) {
+ clearSelectedNode();
}
if (fReselect)
@@ -597,7 +605,8 @@ void RPCConsole::updateNodeDetail(const CNodeCombinedStats *stats)
cachedNodeid = stats->nodeStats.nodeid;
// update the detail ui with latest node information
- QString peerAddrDetails(QString::fromStdString(stats->nodeStats.addrName));
+ QString peerAddrDetails(QString::fromStdString(stats->nodeStats.addrName) + " ");
+ peerAddrDetails += tr("(node id: %1)").arg(QString::number(stats->nodeStats.nodeid));
if (!stats->nodeStats.addrLocal.empty())
peerAddrDetails += "<br />" + tr("via %1").arg(QString::fromStdString(stats->nodeStats.addrLocal));
ui->peerHeading->setText(peerAddrDetails);
@@ -608,11 +617,13 @@ void RPCConsole::updateNodeDetail(const CNodeCombinedStats *stats)
ui->peerBytesRecv->setText(FormatBytes(stats->nodeStats.nRecvBytes));
ui->peerConnTime->setText(GUIUtil::formatDurationStr(GetTime() - stats->nodeStats.nTimeConnected));
ui->peerPingTime->setText(GUIUtil::formatPingTime(stats->nodeStats.dPingTime));
+ ui->peerPingWait->setText(GUIUtil::formatPingTime(stats->nodeStats.dPingWait));
ui->timeoffset->setText(GUIUtil::formatTimeOffset(stats->nodeStats.nTimeOffset));
- ui->peerVersion->setText(QString("%1").arg(stats->nodeStats.nVersion));
+ ui->peerVersion->setText(QString("%1").arg(QString::number(stats->nodeStats.nVersion)));
ui->peerSubversion->setText(QString::fromStdString(stats->nodeStats.cleanSubVer));
ui->peerDirection->setText(stats->nodeStats.fInbound ? tr("Inbound") : tr("Outbound"));
- ui->peerHeight->setText(QString("%1").arg(stats->nodeStats.nStartingHeight));
+ ui->peerHeight->setText(QString("%1").arg(QString::number(stats->nodeStats.nStartingHeight)));
+ ui->peerWhitelisted->setText(stats->nodeStats.fWhitelisted ? tr("Yes") : tr("No"));
// This check fails for example if the lock was busy and
// nodeStateStats couldn't be fetched.
@@ -625,9 +636,12 @@ void RPCConsole::updateNodeDetail(const CNodeCombinedStats *stats)
ui->peerSyncHeight->setText(QString("%1").arg(stats->nodeStateStats.nSyncHeight));
else
ui->peerSyncHeight->setText(tr("Unknown"));
- } else {
- ui->peerBanScore->setText(tr("Fetching..."));
- ui->peerSyncHeight->setText(tr("Fetching..."));
+
+ // Common height is init to -1
+ if (stats->nodeStateStats.nCommonHeight > -1)
+ ui->peerCommonHeight->setText(QString("%1").arg(stats->nodeStateStats.nCommonHeight));
+ else
+ ui->peerCommonHeight->setText(tr("Unknown"));
}
ui->detailWidget->show();
@@ -659,3 +673,29 @@ void RPCConsole::hideEvent(QHideEvent *event)
// stop PeerTableModel auto refresh
clientModel->getPeerTableModel()->stopAutoRefresh();
}
+
+void RPCConsole::showMenu(const QPoint& point)
+{
+ QModelIndex index = ui->peerWidget->indexAt(point);
+ if (index.isValid())
+ contextMenu->exec(QCursor::pos());
+}
+
+void RPCConsole::disconnectSelectedNode()
+{
+ // Get currently selected peer address
+ QString strNode = GUIUtil::getEntryData(ui->peerWidget, 0, PeerTableModel::Address);
+ // Find the node, disconnect it and clear the selected node
+ if (CNode *bannedNode = FindNode(strNode.toStdString())) {
+ bannedNode->fDisconnect = true;
+ clearSelectedNode();
+ }
+}
+
+void RPCConsole::clearSelectedNode()
+{
+ ui->peerWidget->selectionModel()->clearSelection();
+ cachedNodeid = -1;
+ ui->detailWidget->hide();
+ ui->peerHeading->setText(tr("Select a peer to view detailed information."));
+}
diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h
index 8737be35d1..a309df7ba7 100644
--- a/src/qt/rpcconsole.h
+++ b/src/qt/rpcconsole.h
@@ -19,6 +19,7 @@ namespace Ui {
}
QT_BEGIN_NAMESPACE
+class QMenu;
class QItemSelection;
QT_END_NAMESPACE
@@ -57,6 +58,8 @@ private slots:
void resizeEvent(QResizeEvent *event);
void showEvent(QShowEvent *event);
void hideEvent(QHideEvent *event);
+ /** Show custom context menu on Peers tab */
+ void showMenu(const QPoint& point);
public slots:
void clear();
@@ -73,6 +76,8 @@ public slots:
void peerSelected(const QItemSelection &selected, const QItemSelection &deselected);
/** Handle updated peer information */
void peerLayoutChanged();
+ /** Disconnect a selected node on the Peers tab */
+ void disconnectSelectedNode();
signals:
// For RPC command executor
@@ -85,6 +90,8 @@ private:
void setTrafficGraphRange(int mins);
/** show detailed information on ui about selected node */
void updateNodeDetail(const CNodeCombinedStats *stats);
+ /** clear the selected node */
+ void clearSelectedNode();
enum ColumnWidths
{
@@ -98,6 +105,7 @@ private:
QStringList history;
int historyPtr;
NodeId cachedNodeid;
+ QMenu *contextMenu;
};
#endif // BITCOIN_QT_RPCCONSOLE_H
diff --git a/src/qt/scicon.cpp b/src/qt/scicon.cpp
index a0ffcd82a9..c493b5569e 100644
--- a/src/qt/scicon.cpp
+++ b/src/qt/scicon.cpp
@@ -11,7 +11,9 @@
#include <QPalette>
#include <QPixmap>
-static void MakeSingleColorImage(QImage& img, const QColor& colorbase)
+namespace {
+
+void MakeSingleColorImage(QImage& img, const QColor& colorbase)
{
img = img.convertToFormat(QImage::Format_ARGB32);
for (int x = img.width(); x--; )
@@ -24,15 +26,22 @@ static void MakeSingleColorImage(QImage& img, const QColor& colorbase)
}
}
+}
+
QImage SingleColorImage(const QString& filename, const QColor& colorbase)
{
QImage img(filename);
+#if !defined(WIN32) && !defined(MAC_OSX)
MakeSingleColorImage(img, colorbase);
+#endif
return img;
}
QIcon SingleColorIcon(const QIcon& ico, const QColor& colorbase)
{
+#if defined(WIN32) || defined(MAC_OSX)
+ return ico;
+#else
QIcon new_ico;
QSize sz;
Q_FOREACH(sz, ico.availableSizes())
@@ -42,6 +51,7 @@ QIcon SingleColorIcon(const QIcon& ico, const QColor& colorbase)
new_ico.addPixmap(QPixmap::fromImage(img));
}
return new_ico;
+#endif
}
QIcon SingleColorIcon(const QString& filename, const QColor& colorbase)
@@ -51,6 +61,9 @@ QIcon SingleColorIcon(const QString& filename, const QColor& colorbase)
QColor SingleColor()
{
+#if defined(WIN32) || defined(MAC_OSX)
+ return QColor(0,0,0);
+#else
const QColor colorHighlightBg(QApplication::palette().color(QPalette::Highlight));
const QColor colorHighlightFg(QApplication::palette().color(QPalette::HighlightedText));
const QColor colorText(QApplication::palette().color(QPalette::WindowText));
@@ -61,6 +74,7 @@ QColor SingleColor()
else
colorbase = colorHighlightFg;
return colorbase;
+#endif
}
QIcon SingleColorIcon(const QString& filename)
diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp
index 774667d4ac..3d57711568 100644
--- a/src/qt/sendcoinsdialog.cpp
+++ b/src/qt/sendcoinsdialog.cpp
@@ -274,11 +274,11 @@ void SendCoinsDialog::on_sendButton_clicked()
recipientElement = tr("%1 to %2").arg(amount, address);
}
}
- else if(!rcp.authenticatedMerchant.isEmpty()) // secure payment request
+ else if(!rcp.authenticatedMerchant.isEmpty()) // authenticated payment request
{
recipientElement = tr("%1 to %2").arg(amount, GUIUtil::HtmlEscape(rcp.authenticatedMerchant));
}
- else // insecure payment request
+ else // unauthenticated payment request
{
recipientElement = tr("%1 to %2").arg(amount, address);
}
@@ -505,7 +505,7 @@ void SendCoinsDialog::processSendCoinsReturn(const WalletModel::SendCoinsReturn
switch(sendCoinsReturn.status)
{
case WalletModel::InvalidAddress:
- msgParams.first = tr("The recipient address is not valid, please recheck.");
+ msgParams.first = tr("The recipient address is not valid. Please recheck.");
break;
case WalletModel::InvalidAmount:
msgParams.first = tr("The amount to pay must be larger than 0.");
@@ -517,7 +517,7 @@ void SendCoinsDialog::processSendCoinsReturn(const WalletModel::SendCoinsReturn
msgParams.first = tr("The total exceeds your balance when the %1 transaction fee is included.").arg(msgArg);
break;
case WalletModel::DuplicateAddress:
- msgParams.first = tr("Duplicate address found, can only send to each address once per send operation.");
+ msgParams.first = tr("Duplicate address found: addresses should only be used once each.");
break;
case WalletModel::TransactionCreationFailed:
msgParams.first = tr("Transaction creation failed!");
@@ -531,7 +531,7 @@ void SendCoinsDialog::processSendCoinsReturn(const WalletModel::SendCoinsReturn
msgParams.first = tr("A fee higher than %1 is considered an absurdly high fee.").arg(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), 10000000));
break;
case WalletModel::PaymentRequestExpired:
- msgParams.first = tr("Payment request expired!");
+ msgParams.first = tr("Payment request expired.");
msgParams.second = CClientUIInterface::MSG_ERROR;
break;
// included to prevent a compiler warning.
@@ -590,12 +590,12 @@ void SendCoinsDialog::updateGlobalFeeVariables()
{
if (ui->radioSmartFee->isChecked())
{
- nTxConfirmTarget = (int)25 - (int)std::max(0, std::min(24, ui->sliderSmartFee->value()));
+ nTxConfirmTarget = defaultConfirmTarget - ui->sliderSmartFee->value();
payTxFee = CFeeRate(0);
}
else
{
- nTxConfirmTarget = 25;
+ nTxConfirmTarget = defaultConfirmTarget;
payTxFee = CFeeRate(ui->customFee->value());
fPayAtLeastCustomFee = ui->radioCustomAtLeast->isChecked();
}
@@ -629,7 +629,7 @@ void SendCoinsDialog::updateSmartFeeLabel()
if(!model || !model->getOptionsModel())
return;
- int nBlocksToConfirm = (int)25 - (int)std::max(0, std::min(24, ui->sliderSmartFee->value()));
+ int nBlocksToConfirm = defaultConfirmTarget - ui->sliderSmartFee->value();
CFeeRate feeRate = mempool.estimateFee(nBlocksToConfirm);
if (feeRate <= CFeeRate(0)) // not enough data => minfee
{
diff --git a/src/qt/sendcoinsdialog.h b/src/qt/sendcoinsdialog.h
index 14adb02573..fc513bf2ba 100644
--- a/src/qt/sendcoinsdialog.h
+++ b/src/qt/sendcoinsdialog.h
@@ -23,6 +23,8 @@ QT_BEGIN_NAMESPACE
class QUrl;
QT_END_NAMESPACE
+const int defaultConfirmTarget = 25;
+
/** Dialog for sending bitcoins */
class SendCoinsDialog : public QDialog
{
diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp
index 6ac650e74f..6eec33ffd4 100644
--- a/src/qt/sendcoinsentry.cpp
+++ b/src/qt/sendcoinsentry.cpp
@@ -99,11 +99,11 @@ void SendCoinsEntry::clear()
ui->messageTextLabel->clear();
ui->messageTextLabel->hide();
ui->messageLabel->hide();
- // clear UI elements for insecure payment request
+ // clear UI elements for unauthenticated payment request
ui->payTo_is->clear();
ui->memoTextLabel_is->clear();
ui->payAmount_is->clear();
- // clear UI elements for secure payment request
+ // clear UI elements for authenticated payment request
ui->payTo_s->clear();
ui->memoTextLabel_s->clear();
ui->payAmount_s->clear();
@@ -190,21 +190,21 @@ void SendCoinsEntry::setValue(const SendCoinsRecipient &value)
if (recipient.paymentRequest.IsInitialized()) // payment request
{
- if (recipient.authenticatedMerchant.isEmpty()) // insecure
+ if (recipient.authenticatedMerchant.isEmpty()) // unauthenticated
{
ui->payTo_is->setText(recipient.address);
ui->memoTextLabel_is->setText(recipient.message);
ui->payAmount_is->setValue(recipient.amount);
ui->payAmount_is->setReadOnly(true);
- setCurrentWidget(ui->SendCoins_InsecurePaymentRequest);
+ setCurrentWidget(ui->SendCoins_UnauthenticatedPaymentRequest);
}
- else // secure
+ else // authenticated
{
ui->payTo_s->setText(recipient.authenticatedMerchant);
ui->memoTextLabel_s->setText(recipient.message);
ui->payAmount_s->setValue(recipient.amount);
ui->payAmount_s->setReadOnly(true);
- setCurrentWidget(ui->SendCoins_SecurePaymentRequest);
+ setCurrentWidget(ui->SendCoins_AuthenticatedPaymentRequest);
}
}
else // normal payment
@@ -216,7 +216,7 @@ void SendCoinsEntry::setValue(const SendCoinsRecipient &value)
ui->addAsLabel->clear();
ui->payTo->setText(recipient.address); // this may set a label from addressbook
- if (!recipient.label.isEmpty()) // if a label had been set from the addressbook, dont overwrite with an empty label
+ if (!recipient.label.isEmpty()) // if a label had been set from the addressbook, don't overwrite with an empty label
ui->addAsLabel->setText(recipient.label);
ui->payAmount->setValue(recipient.amount);
}
diff --git a/src/qt/splashscreen.cpp b/src/qt/splashscreen.cpp
index 414fe02ff9..8430e017c1 100644
--- a/src/qt/splashscreen.cpp
+++ b/src/qt/splashscreen.cpp
@@ -4,11 +4,12 @@
#include "splashscreen.h"
+#include "networkstyle.h"
+
#include "clientversion.h"
#include "init.h"
-#include "networkstyle.h"
-#include "ui_interface.h"
#include "util.h"
+#include "ui_interface.h"
#include "version.h"
#ifdef ENABLE_WALLET
diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp
index 9b235f9130..5662b16657 100644
--- a/src/qt/transactiondesc.cpp
+++ b/src/qt/transactiondesc.cpp
@@ -10,12 +10,12 @@
#include "transactionrecord.h"
#include "base58.h"
-#include "wallet/db.h"
+#include "consensus/consensus.h"
#include "main.h"
#include "script/script.h"
#include "timedata.h"
-#include "ui_interface.h"
#include "util.h"
+#include "wallet/db.h"
#include "wallet/wallet.h"
#include <stdint.h>
@@ -26,7 +26,7 @@ using namespace std;
QString TransactionDesc::FormatTxStatus(const CWalletTx& wtx)
{
AssertLockHeld(cs_main);
- if (!IsFinalTx(wtx, chainActive.Height() + 1))
+ if (!CheckFinalTx(wtx))
{
if (wtx.nLockTime < LOCKTIME_THRESHOLD)
return tr("Open for %n more block(s)", "", wtx.nLockTime - chainActive.Height());
diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp
index 9db5ad0fd4..15d13e9fc9 100644
--- a/src/qt/transactionrecord.cpp
+++ b/src/qt/transactionrecord.cpp
@@ -5,6 +5,7 @@
#include "transactionrecord.h"
#include "base58.h"
+#include "consensus/consensus.h"
#include "main.h"
#include "timedata.h"
#include "wallet/wallet.h"
@@ -187,7 +188,7 @@ void TransactionRecord::updateStatus(const CWalletTx &wtx)
status.depth = wtx.GetDepthInMainChain();
status.cur_num_blocks = chainActive.Height();
- if (!IsFinalTx(wtx, chainActive.Height() + 1))
+ if (!CheckFinalTx(wtx))
{
if (wtx.nLockTime < LOCKTIME_THRESHOLD)
{
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index 09ed8ce9fd..9b8be76beb 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -12,7 +12,6 @@
#include "transactiontablemodel.h"
#include "base58.h"
-#include "wallet/db.h"
#include "keystore.h"
#include "main.h"
#include "sync.h"
diff --git a/src/rest.cpp b/src/rest.cpp
index adc2d56284..a1bd893bec 100644
--- a/src/rest.cpp
+++ b/src/rest.cpp
@@ -9,13 +9,18 @@
#include "rpcserver.h"
#include "streams.h"
#include "sync.h"
+#include "txmempool.h"
#include "utilstrencodings.h"
#include "version.h"
#include <boost/algorithm/string.hpp>
+#include <boost/dynamic_bitset.hpp>
+
+#include "univalue/univalue.h"
using namespace std;
-using namespace json_spirit;
+
+static const size_t MAX_GETUTXOS_OUTPOINTS = 15; //allow a max of 15 outpoints to be queried at once
enum RetFormat {
RF_UNDEF,
@@ -34,6 +39,22 @@ static const struct {
{RF_JSON, "json"},
};
+struct CCoin {
+ uint32_t nTxVer; // Don't call this nVersion, that name has a special meaning inside IMPLEMENT_SERIALIZE
+ uint32_t nHeight;
+ CTxOut out;
+
+ ADD_SERIALIZE_METHODS;
+
+ template <typename Stream, typename Operation>
+ inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion)
+ {
+ READWRITE(nTxVer);
+ READWRITE(nHeight);
+ READWRITE(out);
+ }
+};
+
class RestErr
{
public:
@@ -41,8 +62,9 @@ public:
string message;
};
-extern void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry);
-extern Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDetails = false);
+extern void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry);
+extern UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDetails = false);
+extern void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex);
static RestErr RESTERR(enum HTTPStatusCode status, string message)
{
@@ -90,12 +112,13 @@ static bool ParseHashStr(const string& strReq, uint256& v)
}
static bool rest_headers(AcceptedConnection* conn,
- const std::string& strReq,
+ const std::string& strURIPart,
+ const std::string& strRequest,
const std::map<std::string, std::string>& mapHeaders,
bool fRun)
{
vector<string> params;
- const RetFormat rf = ParseDataFormat(params, strReq);
+ const RetFormat rf = ParseDataFormat(params, strURIPart);
vector<string> path;
boost::split(path, params[0], boost::is_any_of("/"));
@@ -153,13 +176,14 @@ static bool rest_headers(AcceptedConnection* conn,
}
static bool rest_block(AcceptedConnection* conn,
- const std::string& strReq,
+ const std::string& strURIPart,
+ const std::string& strRequest,
const std::map<std::string, std::string>& mapHeaders,
bool fRun,
bool showTxDetails)
{
vector<string> params;
- const RetFormat rf = ParseDataFormat(params, strReq);
+ const RetFormat rf = ParseDataFormat(params, strURIPart);
string hashStr = params[0];
uint256 hash;
@@ -174,6 +198,9 @@ static bool rest_block(AcceptedConnection* conn,
throw RESTERR(HTTP_NOT_FOUND, hashStr + " not found");
pblockindex = mapBlockIndex[hash];
+ if (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0)
+ throw RESTERR(HTTP_NOT_FOUND, hashStr + " not available (pruned data)");
+
if (!ReadBlockFromDisk(block, pblockindex))
throw RESTERR(HTTP_NOT_FOUND, hashStr + " not found");
}
@@ -195,8 +222,8 @@ static bool rest_block(AcceptedConnection* conn,
}
case RF_JSON: {
- Object objBlock = blockToJSON(block, pblockindex, showTxDetails);
- string strJSON = write_string(Value(objBlock), false) + "\n";
+ UniValue objBlock = blockToJSON(block, pblockindex, showTxDetails);
+ string strJSON = objBlock.write() + "\n";
conn->stream() << HTTPReply(HTTP_OK, strJSON, fRun) << std::flush;
return true;
}
@@ -211,35 +238,37 @@ static bool rest_block(AcceptedConnection* conn,
}
static bool rest_block_extended(AcceptedConnection* conn,
- const std::string& strReq,
+ const std::string& strURIPart,
+ const std::string& strRequest,
const std::map<std::string, std::string>& mapHeaders,
bool fRun)
{
- return rest_block(conn, strReq, mapHeaders, fRun, true);
+ return rest_block(conn, strURIPart, strRequest, mapHeaders, fRun, true);
}
static bool rest_block_notxdetails(AcceptedConnection* conn,
- const std::string& strReq,
+ const std::string& strURIPart,
+ const std::string& strRequest,
const std::map<std::string, std::string>& mapHeaders,
bool fRun)
{
- return rest_block(conn, strReq, mapHeaders, fRun, false);
+ return rest_block(conn, strURIPart, strRequest, mapHeaders, fRun, false);
}
static bool rest_chaininfo(AcceptedConnection* conn,
- const std::string& strReq,
- const std::map<std::string, std::string>& mapHeaders,
- bool fRun)
+ const std::string& strURIPart,
+ const std::string& strRequest,
+ const std::map<std::string, std::string>& mapHeaders,
+ bool fRun)
{
vector<string> params;
- const RetFormat rf = ParseDataFormat(params, strReq);
-
+ const RetFormat rf = ParseDataFormat(params, strURIPart);
+
switch (rf) {
case RF_JSON: {
- Array rpcParams;
- Value chainInfoObject = getblockchaininfo(rpcParams, false);
-
- string strJSON = write_string(chainInfoObject, false) + "\n";
+ UniValue rpcParams(UniValue::VARR);
+ UniValue chainInfoObject = getblockchaininfo(rpcParams, false);
+ string strJSON = chainInfoObject.write() + "\n";
conn->stream() << HTTPReply(HTTP_OK, strJSON, fRun) << std::flush;
return true;
}
@@ -247,18 +276,19 @@ static bool rest_chaininfo(AcceptedConnection* conn,
throw RESTERR(HTTP_NOT_FOUND, "output format not found (available: json)");
}
}
-
+
// not reached
return true; // continue to process further HTTP reqs on this cxn
}
static bool rest_tx(AcceptedConnection* conn,
- const std::string& strReq,
+ const std::string& strURIPart,
+ const std::string& strRequest,
const std::map<std::string, std::string>& mapHeaders,
bool fRun)
{
vector<string> params;
- const RetFormat rf = ParseDataFormat(params, strReq);
+ const RetFormat rf = ParseDataFormat(params, strURIPart);
string hashStr = params[0];
uint256 hash;
@@ -287,9 +317,9 @@ static bool rest_tx(AcceptedConnection* conn,
}
case RF_JSON: {
- Object objTx;
+ UniValue objTx(UniValue::VOBJ);
TxToJSON(tx, hashBlock, objTx);
- string strJSON = write_string(Value(objTx), false) + "\n";
+ string strJSON = objTx.write() + "\n";
conn->stream() << HTTPReply(HTTP_OK, strJSON, fRun) << std::flush;
return true;
}
@@ -303,10 +333,207 @@ static bool rest_tx(AcceptedConnection* conn,
return true; // continue to process further HTTP reqs on this cxn
}
+static bool rest_getutxos(AcceptedConnection* conn,
+ const std::string& strURIPart,
+ const std::string& strRequest,
+ const std::map<std::string, std::string>& mapHeaders,
+ bool fRun)
+{
+ vector<string> params;
+ enum RetFormat rf = ParseDataFormat(params, strURIPart);
+
+ vector<string> uriParts;
+ if (params.size() > 0 && params[0].length() > 1)
+ {
+ std::string strUriParams = params[0].substr(1);
+ boost::split(uriParts, strUriParams, boost::is_any_of("/"));
+ }
+
+ // throw exception in case of a empty request
+ if (strRequest.length() == 0 && uriParts.size() == 0)
+ throw RESTERR(HTTP_INTERNAL_SERVER_ERROR, "Error: empty request");
+
+ bool fInputParsed = false;
+ bool fCheckMemPool = false;
+ vector<COutPoint> vOutPoints;
+
+ // parse/deserialize input
+ // input-format = output-format, rest/getutxos/bin requires binary input, gives binary output, ...
+
+ if (uriParts.size() > 0)
+ {
+
+ //inputs is sent over URI scheme (/rest/getutxos/checkmempool/txid1-n/txid2-n/...)
+ if (uriParts.size() > 0 && uriParts[0] == "checkmempool")
+ fCheckMemPool = true;
+
+ for (size_t i = (fCheckMemPool) ? 1 : 0; i < uriParts.size(); i++)
+ {
+ uint256 txid;
+ int32_t nOutput;
+ std::string strTxid = uriParts[i].substr(0, uriParts[i].find("-"));
+ std::string strOutput = uriParts[i].substr(uriParts[i].find("-")+1);
+
+ if (!ParseInt32(strOutput, &nOutput) || !IsHex(strTxid))
+ throw RESTERR(HTTP_INTERNAL_SERVER_ERROR, "Parse error");
+
+ txid.SetHex(strTxid);
+ vOutPoints.push_back(COutPoint(txid, (uint32_t)nOutput));
+ }
+
+ if (vOutPoints.size() > 0)
+ fInputParsed = true;
+ else
+ throw RESTERR(HTTP_INTERNAL_SERVER_ERROR, "Error: empty request");
+ }
+
+ string strRequestMutable = strRequest; //convert const string to string for allowing hex to bin converting
+
+ switch (rf) {
+ case RF_HEX: {
+ // convert hex to bin, continue then with bin part
+ std::vector<unsigned char> strRequestV = ParseHex(strRequest);
+ strRequestMutable.assign(strRequestV.begin(), strRequestV.end());
+ }
+
+ case RF_BINARY: {
+ try {
+ //deserialize only if user sent a request
+ if (strRequestMutable.size() > 0)
+ {
+ if (fInputParsed) //don't allow sending input over URI and HTTP RAW DATA
+ throw RESTERR(HTTP_INTERNAL_SERVER_ERROR, "Combination of URI scheme inputs and raw post data is not allowed");
+
+ CDataStream oss(SER_NETWORK, PROTOCOL_VERSION);
+ oss << strRequestMutable;
+ oss >> fCheckMemPool;
+ oss >> vOutPoints;
+ }
+ } catch (const std::ios_base::failure& e) {
+ // abort in case of unreadable binary data
+ throw RESTERR(HTTP_INTERNAL_SERVER_ERROR, "Parse error");
+ }
+ break;
+ }
+
+ case RF_JSON: {
+ if (!fInputParsed)
+ throw RESTERR(HTTP_INTERNAL_SERVER_ERROR, "Error: empty request");
+ break;
+ }
+ default: {
+ throw RESTERR(HTTP_NOT_FOUND, "output format not found (available: " + AvailableDataFormatsString() + ")");
+ }
+ }
+
+ // limit max outpoints
+ if (vOutPoints.size() > MAX_GETUTXOS_OUTPOINTS)
+ throw RESTERR(HTTP_INTERNAL_SERVER_ERROR, strprintf("Error: max outpoints exceeded (max: %d, tried: %d)", MAX_GETUTXOS_OUTPOINTS, vOutPoints.size()));
+
+ // check spentness and form a bitmap (as well as a JSON capable human-readble string representation)
+ vector<unsigned char> bitmap;
+ vector<CCoin> outs;
+ std::string bitmapStringRepresentation;
+ boost::dynamic_bitset<unsigned char> hits(vOutPoints.size());
+ {
+ LOCK2(cs_main, mempool.cs);
+
+ CCoinsView viewDummy;
+ CCoinsViewCache view(&viewDummy);
+
+ CCoinsViewCache& viewChain = *pcoinsTip;
+ CCoinsViewMemPool viewMempool(&viewChain, mempool);
+
+ if (fCheckMemPool)
+ view.SetBackend(viewMempool); // switch cache backend to db+mempool in case user likes to query mempool
+
+ for (size_t i = 0; i < vOutPoints.size(); i++) {
+ CCoins coins;
+ uint256 hash = vOutPoints[i].hash;
+ if (view.GetCoins(hash, coins)) {
+ mempool.pruneSpent(hash, coins);
+ if (coins.IsAvailable(vOutPoints[i].n)) {
+ hits[i] = true;
+ // Safe to index into vout here because IsAvailable checked if it's off the end of the array, or if
+ // n is valid but points to an already spent output (IsNull).
+ CCoin coin;
+ coin.nTxVer = coins.nVersion;
+ coin.nHeight = coins.nHeight;
+ coin.out = coins.vout.at(vOutPoints[i].n);
+ assert(!coin.out.IsNull());
+ outs.push_back(coin);
+ }
+ }
+
+ bitmapStringRepresentation.append(hits[i] ? "1" : "0"); // form a binary string representation (human-readable for json output)
+ }
+ }
+ boost::to_block_range(hits, std::back_inserter(bitmap));
+
+ switch (rf) {
+ case RF_BINARY: {
+ // serialize data
+ // use exact same output as mentioned in Bip64
+ CDataStream ssGetUTXOResponse(SER_NETWORK, PROTOCOL_VERSION);
+ ssGetUTXOResponse << chainActive.Height() << chainActive.Tip()->GetBlockHash() << bitmap << outs;
+ string ssGetUTXOResponseString = ssGetUTXOResponse.str();
+
+ conn->stream() << HTTPReplyHeader(HTTP_OK, fRun, ssGetUTXOResponseString.size(), "application/octet-stream") << ssGetUTXOResponseString << std::flush;
+ return true;
+ }
+
+ case RF_HEX: {
+ CDataStream ssGetUTXOResponse(SER_NETWORK, PROTOCOL_VERSION);
+ ssGetUTXOResponse << chainActive.Height() << chainActive.Tip()->GetBlockHash() << bitmap << outs;
+ string strHex = HexStr(ssGetUTXOResponse.begin(), ssGetUTXOResponse.end()) + "\n";
+
+ conn->stream() << HTTPReply(HTTP_OK, strHex, fRun, false, "text/plain") << std::flush;
+ return true;
+ }
+
+ case RF_JSON: {
+ UniValue objGetUTXOResponse(UniValue::VOBJ);
+
+ // pack in some essentials
+ // use more or less the same output as mentioned in Bip64
+ objGetUTXOResponse.push_back(Pair("chainHeight", chainActive.Height()));
+ objGetUTXOResponse.push_back(Pair("chaintipHash", chainActive.Tip()->GetBlockHash().GetHex()));
+ objGetUTXOResponse.push_back(Pair("bitmap", bitmapStringRepresentation));
+
+ UniValue utxos(UniValue::VARR);
+ BOOST_FOREACH (const CCoin& coin, outs) {
+ UniValue utxo(UniValue::VOBJ);
+ utxo.push_back(Pair("txvers", (int32_t)coin.nTxVer));
+ utxo.push_back(Pair("height", (int32_t)coin.nHeight));
+ utxo.push_back(Pair("value", ValueFromAmount(coin.out.nValue)));
+
+ // include the script in a json output
+ UniValue o(UniValue::VOBJ);
+ ScriptPubKeyToJSON(coin.out.scriptPubKey, o, true);
+ utxo.push_back(Pair("scriptPubKey", o));
+ utxos.push_back(utxo);
+ }
+ objGetUTXOResponse.push_back(Pair("utxos", utxos));
+
+ // return json string
+ string strJSON = objGetUTXOResponse.write() + "\n";
+ conn->stream() << HTTPReply(HTTP_OK, strJSON, fRun) << std::flush;
+ return true;
+ }
+ default: {
+ throw RESTERR(HTTP_NOT_FOUND, "output format not found (available: " + AvailableDataFormatsString() + ")");
+ }
+ }
+
+ // not reached
+ return true; // continue to process further HTTP reqs on this cxn
+}
+
static const struct {
const char* prefix;
bool (*handler)(AcceptedConnection* conn,
- const std::string& strURI,
+ const std::string& strURIPart,
+ const std::string& strRequest,
const std::map<std::string, std::string>& mapHeaders,
bool fRun);
} uri_prefixes[] = {
@@ -315,10 +542,12 @@ static const struct {
{"/rest/block/", rest_block_extended},
{"/rest/chaininfo", rest_chaininfo},
{"/rest/headers/", rest_headers},
+ {"/rest/getutxos", rest_getutxos},
};
bool HTTPReq_REST(AcceptedConnection* conn,
const std::string& strURI,
+ const string& strRequest,
const std::map<std::string, std::string>& mapHeaders,
bool fRun)
{
@@ -330,8 +559,8 @@ bool HTTPReq_REST(AcceptedConnection* conn,
for (unsigned int i = 0; i < ARRAYLEN(uri_prefixes); i++) {
unsigned int plen = strlen(uri_prefixes[i].prefix);
if (strURI.substr(0, plen) == uri_prefixes[i].prefix) {
- string strReq = strURI.substr(plen);
- return uri_prefixes[i].handler(conn, strReq, mapHeaders, fRun);
+ string strURIPart = strURI.substr(plen);
+ return uri_prefixes[i].handler(conn, strURIPart, strRequest, mapHeaders, fRun);
}
}
} catch (const RestErr& re) {
diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp
index 293d6d5619..b7c3eb1724 100644
--- a/src/rpcblockchain.cpp
+++ b/src/rpcblockchain.cpp
@@ -4,20 +4,21 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include "checkpoints.h"
+#include "consensus/validation.h"
#include "main.h"
+#include "primitives/transaction.h"
#include "rpcserver.h"
#include "sync.h"
#include "util.h"
#include <stdint.h>
-#include "json/json_spirit_value.h"
+#include "univalue/univalue.h"
-using namespace json_spirit;
using namespace std;
-extern void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry);
-void ScriptPubKeyToJSON(const CScript& scriptPubKey, Object& out, bool fIncludeHex);
+extern void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry);
+void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex);
double GetDifficulty(const CBlockIndex* blockindex)
{
@@ -50,10 +51,36 @@ double GetDifficulty(const CBlockIndex* blockindex)
return dDiff;
}
+UniValue blockheaderToJSON(const CBlockIndex* blockindex)
+{
+ UniValue result(UniValue::VOBJ);
+ result.push_back(Pair("hash", blockindex->GetBlockHash().GetHex()));
+ int confirmations = -1;
+ // Only report confirmations if the block is on the main chain
+ if (chainActive.Contains(blockindex))
+ confirmations = chainActive.Height() - blockindex->nHeight + 1;
+ result.push_back(Pair("confirmations", confirmations));
+ result.push_back(Pair("height", blockindex->nHeight));
+ result.push_back(Pair("version", blockindex->nVersion));
+ result.push_back(Pair("merkleroot", blockindex->hashMerkleRoot.GetHex()));
+ result.push_back(Pair("time", (int64_t)blockindex->nTime));
+ result.push_back(Pair("nonce", (uint64_t)blockindex->nNonce));
+ result.push_back(Pair("bits", strprintf("%08x", blockindex->nBits)));
+ result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
+ result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex()));
-Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDetails = false)
+ if (blockindex->pprev)
+ result.push_back(Pair("previousblockhash", blockindex->pprev->GetBlockHash().GetHex()));
+ CBlockIndex *pnext = chainActive.Next(blockindex);
+ if (pnext)
+ result.push_back(Pair("nextblockhash", pnext->GetBlockHash().GetHex()));
+ return result;
+}
+
+
+UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDetails = false)
{
- Object result;
+ UniValue result(UniValue::VOBJ);
result.push_back(Pair("hash", block.GetHash().GetHex()));
int confirmations = -1;
// Only report confirmations if the block is on the main chain
@@ -64,12 +91,12 @@ Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDe
result.push_back(Pair("height", blockindex->nHeight));
result.push_back(Pair("version", block.nVersion));
result.push_back(Pair("merkleroot", block.hashMerkleRoot.GetHex()));
- Array txs;
+ UniValue txs(UniValue::VARR);
BOOST_FOREACH(const CTransaction&tx, block.vtx)
{
if(txDetails)
{
- Object objTx;
+ UniValue objTx(UniValue::VOBJ);
TxToJSON(tx, uint256(), objTx);
txs.push_back(objTx);
}
@@ -92,7 +119,7 @@ Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool txDe
}
-Value getblockcount(const Array& params, bool fHelp)
+UniValue getblockcount(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -109,7 +136,7 @@ Value getblockcount(const Array& params, bool fHelp)
return chainActive.Height();
}
-Value getbestblockhash(const Array& params, bool fHelp)
+UniValue getbestblockhash(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -126,7 +153,7 @@ Value getbestblockhash(const Array& params, bool fHelp)
return chainActive.Tip()->GetBlockHash().GetHex();
}
-Value getdifficulty(const Array& params, bool fHelp)
+UniValue getdifficulty(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -144,7 +171,7 @@ Value getdifficulty(const Array& params, bool fHelp)
}
-Value getrawmempool(const Array& params, bool fHelp)
+UniValue getrawmempool(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() > 1)
throw runtime_error(
@@ -170,7 +197,7 @@ Value getrawmempool(const Array& params, bool fHelp)
" \"transactionid\", (string) parent transaction id\n"
" ... ]\n"
" }, ...\n"
- "]\n"
+ "}\n"
"\nExamples\n"
+ HelpExampleCli("getrawmempool", "true")
+ HelpExampleRpc("getrawmempool", "true")
@@ -185,12 +212,12 @@ Value getrawmempool(const Array& params, bool fHelp)
if (fVerbose)
{
LOCK(mempool.cs);
- Object o;
+ UniValue o(UniValue::VOBJ);
BOOST_FOREACH(const PAIRTYPE(uint256, CTxMemPoolEntry)& entry, mempool.mapTx)
{
const uint256& hash = entry.first;
const CTxMemPoolEntry& e = entry.second;
- Object info;
+ UniValue info(UniValue::VOBJ);
info.push_back(Pair("size", (int)e.GetTxSize()));
info.push_back(Pair("fee", ValueFromAmount(e.GetFee())));
info.push_back(Pair("time", e.GetTime()));
@@ -204,7 +231,13 @@ Value getrawmempool(const Array& params, bool fHelp)
if (mempool.exists(txin.prevout.hash))
setDepends.insert(txin.prevout.hash.ToString());
}
- Array depends(setDepends.begin(), setDepends.end());
+
+ UniValue depends(UniValue::VARR);
+ BOOST_FOREACH(const string& dep, setDepends)
+ {
+ depends.push_back(dep);
+ }
+
info.push_back(Pair("depends", depends));
o.push_back(Pair(hash.ToString(), info));
}
@@ -215,7 +248,7 @@ Value getrawmempool(const Array& params, bool fHelp)
vector<uint256> vtxid;
mempool.queryHashes(vtxid);
- Array a;
+ UniValue a(UniValue::VARR);
BOOST_FOREACH(const uint256& hash, vtxid)
a.push_back(hash.ToString());
@@ -223,7 +256,7 @@ Value getrawmempool(const Array& params, bool fHelp)
}
}
-Value getblockhash(const Array& params, bool fHelp)
+UniValue getblockhash(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
throw runtime_error(
@@ -248,7 +281,63 @@ Value getblockhash(const Array& params, bool fHelp)
return pblockindex->GetBlockHash().GetHex();
}
-Value getblock(const Array& params, bool fHelp)
+UniValue getblockheader(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() < 1 || params.size() > 2)
+ throw runtime_error(
+ "getblockheader \"hash\" ( verbose )\n"
+ "\nIf verbose is false, returns a string that is serialized, hex-encoded data for blockheader 'hash'.\n"
+ "If verbose is true, returns an Object with information about blockheader <hash>.\n"
+ "\nArguments:\n"
+ "1. \"hash\" (string, required) The block hash\n"
+ "2. verbose (boolean, optional, default=true) true for a json object, false for the hex encoded data\n"
+ "\nResult (for verbose = true):\n"
+ "{\n"
+ " \"hash\" : \"hash\", (string) the block hash (same as provided)\n"
+ " \"confirmations\" : n, (numeric) The number of confirmations, or -1 if the block is not on the main chain\n"
+ " \"height\" : n, (numeric) The block height or index\n"
+ " \"version\" : n, (numeric) The block version\n"
+ " \"merkleroot\" : \"xxxx\", (string) The merkle root\n"
+ " \"time\" : ttt, (numeric) The block time in seconds since epoch (Jan 1 1970 GMT)\n"
+ " \"nonce\" : n, (numeric) The nonce\n"
+ " \"bits\" : \"1d00ffff\", (string) The bits\n"
+ " \"difficulty\" : x.xxx, (numeric) The difficulty\n"
+ " \"previousblockhash\" : \"hash\", (string) The hash of the previous block\n"
+ " \"nextblockhash\" : \"hash\" (string) The hash of the next block\n"
+ "}\n"
+ "\nResult (for verbose=false):\n"
+ "\"data\" (string) A string that is serialized, hex-encoded data for block 'hash'.\n"
+ "\nExamples:\n"
+ + HelpExampleCli("getblockheader", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
+ + HelpExampleRpc("getblockheader", "\"00000000c937983704a73af28acdec37b049d214adbda81d7e2a3dd146f6ed09\"")
+ );
+
+ LOCK(cs_main);
+
+ std::string strHash = params[0].get_str();
+ uint256 hash(uint256S(strHash));
+
+ bool fVerbose = true;
+ if (params.size() > 1)
+ fVerbose = params[1].get_bool();
+
+ if (mapBlockIndex.count(hash) == 0)
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
+
+ CBlockIndex* pblockindex = mapBlockIndex[hash];
+
+ if (!fVerbose)
+ {
+ CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION);
+ ssBlock << pblockindex->GetBlockHeader();
+ std::string strHex = HexStr(ssBlock.begin(), ssBlock.end());
+ return strHex;
+ }
+
+ return blockheaderToJSON(pblockindex);
+}
+
+UniValue getblock(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
@@ -299,6 +388,9 @@ Value getblock(const Array& params, bool fHelp)
CBlock block;
CBlockIndex* pblockindex = mapBlockIndex[hash];
+ if (fHavePruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0)
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Block not available (pruned data)");
+
if(!ReadBlockFromDisk(block, pblockindex))
throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
@@ -313,7 +405,7 @@ Value getblock(const Array& params, bool fHelp)
return blockToJSON(block, pblockindex);
}
-Value gettxoutsetinfo(const Array& params, bool fHelp)
+UniValue gettxoutsetinfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -335,9 +427,7 @@ Value gettxoutsetinfo(const Array& params, bool fHelp)
+ HelpExampleRpc("gettxoutsetinfo", "")
);
- LOCK(cs_main);
-
- Object ret;
+ UniValue ret(UniValue::VOBJ);
CCoinsStats stats;
FlushStateToDisk();
@@ -353,7 +443,7 @@ Value gettxoutsetinfo(const Array& params, bool fHelp)
return ret;
}
-Value gettxout(const Array& params, bool fHelp)
+UniValue gettxout(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 2 || params.size() > 3)
throw runtime_error(
@@ -393,7 +483,7 @@ Value gettxout(const Array& params, bool fHelp)
LOCK(cs_main);
- Object ret;
+ UniValue ret(UniValue::VOBJ);
std::string strHash = params[0].get_str();
uint256 hash(uint256S(strHash));
@@ -407,14 +497,14 @@ Value gettxout(const Array& params, bool fHelp)
LOCK(mempool.cs);
CCoinsViewMemPool view(pcoinsTip, mempool);
if (!view.GetCoins(hash, coins))
- return Value::null;
+ return NullUniValue;
mempool.pruneSpent(hash, coins); // TODO: this should be done by the CCoinsViewMemPool
} else {
if (!pcoinsTip->GetCoins(hash, coins))
- return Value::null;
+ return NullUniValue;
}
if (n<0 || (unsigned int)n>=coins.vout.size() || coins.vout[n].IsNull())
- return Value::null;
+ return NullUniValue;
BlockMap::iterator it = mapBlockIndex.find(pcoinsTip->GetBestBlock());
CBlockIndex *pindex = it->second;
@@ -424,7 +514,7 @@ Value gettxout(const Array& params, bool fHelp)
else
ret.push_back(Pair("confirmations", pindex->nHeight - coins.nHeight + 1));
ret.push_back(Pair("value", ValueFromAmount(coins.vout[n].nValue)));
- Object o;
+ UniValue o(UniValue::VOBJ);
ScriptPubKeyToJSON(coins.vout[n].scriptPubKey, o, true);
ret.push_back(Pair("scriptPubKey", o));
ret.push_back(Pair("version", coins.nVersion));
@@ -433,7 +523,7 @@ Value gettxout(const Array& params, bool fHelp)
return ret;
}
-Value verifychain(const Array& params, bool fHelp)
+UniValue verifychain(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() > 2)
throw runtime_error(
@@ -461,7 +551,37 @@ Value verifychain(const Array& params, bool fHelp)
return CVerifyDB().VerifyDB(pcoinsTip, nCheckLevel, nCheckDepth);
}
-Value getblockchaininfo(const Array& params, bool fHelp)
+/** Implementation of IsSuperMajority with better feedback */
+static UniValue SoftForkMajorityDesc(int minVersion, CBlockIndex* pindex, int nRequired, const Consensus::Params& consensusParams)
+{
+ int nFound = 0;
+ CBlockIndex* pstart = pindex;
+ for (int i = 0; i < consensusParams.nMajorityWindow && pstart != NULL; i++)
+ {
+ if (pstart->nVersion >= minVersion)
+ ++nFound;
+ pstart = pstart->pprev;
+ }
+
+ UniValue rv(UniValue::VOBJ);
+ rv.push_back(Pair("status", nFound >= nRequired));
+ rv.push_back(Pair("found", nFound));
+ rv.push_back(Pair("required", nRequired));
+ rv.push_back(Pair("window", consensusParams.nMajorityWindow));
+ return rv;
+}
+
+static UniValue SoftForkDesc(const std::string &name, int version, CBlockIndex* pindex, const Consensus::Params& consensusParams)
+{
+ UniValue rv(UniValue::VOBJ);
+ rv.push_back(Pair("id", name));
+ rv.push_back(Pair("version", version));
+ rv.push_back(Pair("enforce", SoftForkMajorityDesc(version, pindex, consensusParams.nMajorityEnforceBlockUpgrade, consensusParams)));
+ rv.push_back(Pair("reject", SoftForkMajorityDesc(version, pindex, consensusParams.nMajorityRejectBlockOutdated, consensusParams)));
+ return rv;
+}
+
+UniValue getblockchaininfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -476,6 +596,19 @@ Value getblockchaininfo(const Array& params, bool fHelp)
" \"difficulty\": xxxxxx, (numeric) the current difficulty\n"
" \"verificationprogress\": xxxx, (numeric) estimate of verification progress [0..1]\n"
" \"chainwork\": \"xxxx\" (string) total amount of work in active chain, in hexadecimal\n"
+ " \"softforks\": [ (array) status of softforks in progress\n"
+ " {\n"
+ " \"id\": \"xxxx\", (string) name of softfork\n"
+ " \"version\": xx, (numeric) block version\n"
+ " \"enforce\": { (object) progress toward enforcing the softfork rules for new-version blocks\n"
+ " \"status\": xx, (boolean) true if threshold reached\n"
+ " \"found\": xx, (numeric) number of blocks with the new version found\n"
+ " \"required\": xx, (numeric) number of blocks required to trigger\n"
+ " \"window\": xx, (numeric) maximum size of examined window of recent blocks\n"
+ " },\n"
+ " \"reject\": { ... } (object) progress toward rejecting pre-softfork blocks (same fields as \"enforce\")\n"
+ " }, ...\n"
+ " ]\n"
"}\n"
"\nExamples:\n"
+ HelpExampleCli("getblockchaininfo", "")
@@ -484,14 +617,31 @@ Value getblockchaininfo(const Array& params, bool fHelp)
LOCK(cs_main);
- Object obj;
+ UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("chain", Params().NetworkIDString()));
obj.push_back(Pair("blocks", (int)chainActive.Height()));
obj.push_back(Pair("headers", pindexBestHeader ? pindexBestHeader->nHeight : -1));
obj.push_back(Pair("bestblockhash", chainActive.Tip()->GetBlockHash().GetHex()));
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
- obj.push_back(Pair("verificationprogress", Checkpoints::GuessVerificationProgress(chainActive.Tip())));
+ obj.push_back(Pair("verificationprogress", Checkpoints::GuessVerificationProgress(Params().Checkpoints(), chainActive.Tip())));
obj.push_back(Pair("chainwork", chainActive.Tip()->nChainWork.GetHex()));
+ obj.push_back(Pair("pruned", fPruneMode));
+
+ const Consensus::Params& consensusParams = Params().GetConsensus();
+ CBlockIndex* tip = chainActive.Tip();
+ UniValue softforks(UniValue::VARR);
+ softforks.push_back(SoftForkDesc("bip34", 2, tip, consensusParams));
+ softforks.push_back(SoftForkDesc("bip66", 3, tip, consensusParams));
+ obj.push_back(Pair("softforks", softforks));
+
+ if (fPruneMode)
+ {
+ CBlockIndex *block = chainActive.Tip();
+ while (block && block->pprev && (block->pprev->nStatus & BLOCK_HAVE_DATA))
+ block = block->pprev;
+
+ obj.push_back(Pair("pruneheight", block->nHeight));
+ }
return obj;
}
@@ -510,7 +660,7 @@ struct CompareBlocksByHeight
}
};
-Value getchaintips(const Array& params, bool fHelp)
+UniValue getchaintips(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -562,10 +712,10 @@ Value getchaintips(const Array& params, bool fHelp)
setTips.insert(chainActive.Tip());
/* Construct the output array. */
- Array res;
+ UniValue res(UniValue::VARR);
BOOST_FOREACH(const CBlockIndex* block, setTips)
{
- Object obj;
+ UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("height", block->nHeight));
obj.push_back(Pair("hash", block->phashBlock->GetHex()));
@@ -600,7 +750,7 @@ Value getchaintips(const Array& params, bool fHelp)
return res;
}
-Value getmempoolinfo(const Array& params, bool fHelp)
+UniValue getmempoolinfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -616,14 +766,14 @@ Value getmempoolinfo(const Array& params, bool fHelp)
+ HelpExampleRpc("getmempoolinfo", "")
);
- Object ret;
+ UniValue ret(UniValue::VOBJ);
ret.push_back(Pair("size", (int64_t) mempool.size()));
ret.push_back(Pair("bytes", (int64_t) mempool.GetTotalTxSize()));
return ret;
}
-Value invalidateblock(const Array& params, bool fHelp)
+UniValue invalidateblock(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
throw runtime_error(
@@ -658,10 +808,10 @@ Value invalidateblock(const Array& params, bool fHelp)
throw JSONRPCError(RPC_DATABASE_ERROR, state.GetRejectReason());
}
- return Value::null;
+ return NullUniValue;
}
-Value reconsiderblock(const Array& params, bool fHelp)
+UniValue reconsiderblock(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
throw runtime_error(
@@ -697,5 +847,5 @@ Value reconsiderblock(const Array& params, bool fHelp)
throw JSONRPCError(RPC_DATABASE_ERROR, state.GetRejectReason());
}
- return Value::null;
+ return NullUniValue;
}
diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp
index 428e1049dc..b41e960e8a 100644
--- a/src/rpcclient.cpp
+++ b/src/rpcclient.cpp
@@ -7,13 +7,14 @@
#include "rpcprotocol.h"
#include "util.h"
-#include "ui_interface.h"
#include <set>
#include <stdint.h>
+#include <boost/algorithm/string/case_conv.hpp> // for to_lower()
+#include "univalue/univalue.h"
+
using namespace std;
-using namespace json_spirit;
class CRPCConvertParam
{
@@ -70,6 +71,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "listunspent", 1 },
{ "listunspent", 2 },
{ "getblock", 1 },
+ { "getblockheader", 1 },
{ "gettransaction", 1 },
{ "getrawtransaction", 1 },
{ "createrawtransaction", 0 },
@@ -77,8 +79,10 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "signrawtransaction", 1 },
{ "signrawtransaction", 2 },
{ "sendrawtransaction", 1 },
+ { "fundrawtransaction", 1 },
{ "gettxout", 1 },
{ "gettxout", 2 },
+ { "gettxoutproof", 0 },
{ "lockunspent", 0 },
{ "lockunspent", 1 },
{ "importprivkey", 2 },
@@ -91,6 +95,8 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "estimatepriority", 0 },
{ "prioritisetransaction", 1 },
{ "prioritisetransaction", 2 },
+ { "setban", 2 },
+ { "setban", 3 },
};
class CRPCConvertTable
@@ -119,25 +125,32 @@ CRPCConvertTable::CRPCConvertTable()
static CRPCConvertTable rpcCvtTable;
+/** Non-RFC4627 JSON parser, accepts internal values (such as numbers, true, false, null)
+ * as well as objects and arrays.
+ */
+UniValue ParseNonRFCJSONValue(const std::string& strVal)
+{
+ UniValue jVal;
+ if (!jVal.read(std::string("[")+strVal+std::string("]")) ||
+ !jVal.isArray() || jVal.size()!=1)
+ throw runtime_error(string("Error parsing JSON:")+strVal);
+ return jVal[0];
+}
+
/** Convert strings to command-specific RPC representation */
-Array RPCConvertValues(const std::string &strMethod, const std::vector<std::string> &strParams)
+UniValue RPCConvertValues(const std::string &strMethod, const std::vector<std::string> &strParams)
{
- Array params;
+ UniValue params(UniValue::VARR);
for (unsigned int idx = 0; idx < strParams.size(); idx++) {
const std::string& strVal = strParams[idx];
- // insert string value directly
if (!rpcCvtTable.convert(strMethod, idx)) {
+ // insert string value directly
params.push_back(strVal);
- }
-
- // parse string as JSON, insert bool/number/object/etc. value
- else {
- Value jVal;
- if (!read_string(strVal, jVal))
- throw runtime_error(string("Error parsing JSON:")+strVal);
- params.push_back(jVal);
+ } else {
+ // parse string as JSON, insert bool/number/object/etc. value
+ params.push_back(ParseNonRFCJSONValue(strVal));
}
}
diff --git a/src/rpcclient.h b/src/rpcclient.h
index 42fa2d06fe..d68b4ed6ae 100644
--- a/src/rpcclient.h
+++ b/src/rpcclient.h
@@ -6,10 +6,12 @@
#ifndef BITCOIN_RPCCLIENT_H
#define BITCOIN_RPCCLIENT_H
-#include "json/json_spirit_reader_template.h"
-#include "json/json_spirit_utils.h"
-#include "json/json_spirit_writer_template.h"
+#include "univalue/univalue.h"
-json_spirit::Array RPCConvertValues(const std::string& strMethod, const std::vector<std::string>& strParams);
+UniValue RPCConvertValues(const std::string& strMethod, const std::vector<std::string>& strParams);
+/** Non-RFC4627 JSON parser, accepts internal values (such as numbers, true, false, null)
+ * as well as objects and arrays.
+ */
+UniValue ParseNonRFCJSONValue(const std::string& strVal);
#endif // BITCOIN_RPCCLIENT_H
diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp
index 1e6531f68a..9c6fb10af0 100644
--- a/src/rpcmining.cpp
+++ b/src/rpcmining.cpp
@@ -5,28 +5,25 @@
#include "amount.h"
#include "chainparams.h"
+#include "consensus/consensus.h"
+#include "consensus/validation.h"
#include "core_io.h"
#include "init.h"
-#include "net.h"
#include "main.h"
#include "miner.h"
+#include "net.h"
#include "pow.h"
#include "rpcserver.h"
#include "util.h"
#include "validationinterface.h"
-#ifdef ENABLE_WALLET
-#include "wallet/db.h"
-#include "wallet/wallet.h"
-#endif
#include <stdint.h>
#include <boost/assign/list_of.hpp>
+#include <boost/shared_ptr.hpp>
-#include "json/json_spirit_utils.h"
-#include "json/json_spirit_value.h"
+#include "univalue/univalue.h"
-using namespace json_spirit;
using namespace std;
/**
@@ -34,7 +31,7 @@ using namespace std;
* or from the last difficulty change if 'lookup' is nonpositive.
* If 'height' is nonnegative, compute the estimate at the time when a given block was found.
*/
-Value GetNetworkHashPS(int lookup, int height) {
+UniValue GetNetworkHashPS(int lookup, int height) {
CBlockIndex *pb = chainActive.Tip();
if (height >= 0 && height < chainActive.Height())
@@ -45,7 +42,7 @@ Value GetNetworkHashPS(int lookup, int height) {
// If lookup is -1, then use blocks since last difficulty change.
if (lookup <= 0)
- lookup = pb->nHeight % Params().DifficultyAdjustmentInterval() + 1;
+ lookup = pb->nHeight % Params().GetConsensus().DifficultyAdjustmentInterval() + 1;
// If lookup is larger than chain, then set it to chain length.
if (lookup > pb->nHeight)
@@ -71,7 +68,7 @@ Value GetNetworkHashPS(int lookup, int height) {
return (int64_t)(workDiff.getdouble() / timeDiff);
}
-Value getnetworkhashps(const Array& params, bool fHelp)
+UniValue getnetworkhashps(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() > 2)
throw runtime_error(
@@ -93,8 +90,7 @@ Value getnetworkhashps(const Array& params, bool fHelp)
return GetNetworkHashPS(params.size() > 0 ? params[0].get_int() : 120, params.size() > 1 ? params[1].get_int() : -1);
}
-#ifdef ENABLE_WALLET
-Value getgenerate(const Array& params, bool fHelp)
+UniValue getgenerate(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -113,7 +109,7 @@ Value getgenerate(const Array& params, bool fHelp)
return GetBoolArg("-gen", false);
}
-Value generate(const Array& params, bool fHelp)
+UniValue generate(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 1)
throw runtime_error(
@@ -128,8 +124,6 @@ Value generate(const Array& params, bool fHelp)
+ HelpExampleCli("generate", "11")
);
- if (pwalletMain == NULL)
- throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
if (!Params().MineBlocksOnDemand())
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "This method can only be used on regtest");
@@ -137,7 +131,13 @@ Value generate(const Array& params, bool fHelp)
int nHeightEnd = 0;
int nHeight = 0;
int nGenerate = params[0].get_int();
- CReserveKey reservekey(pwalletMain);
+
+ boost::shared_ptr<CReserveScript> coinbaseScript;
+ GetMainSignals().ScriptForMining(coinbaseScript);
+
+ //throw an error if no script was provided
+ if (!coinbaseScript->reserveScript.size())
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "No coinbase script available (mining requires a wallet)");
{ // Don't keep cs_main locked
LOCK(cs_main);
@@ -146,12 +146,12 @@ Value generate(const Array& params, bool fHelp)
nHeightEnd = nHeightStart+nGenerate;
}
unsigned int nExtraNonce = 0;
- Array blockHashes;
+ UniValue blockHashes(UniValue::VARR);
while (nHeight < nHeightEnd)
{
- auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlockWithKey(reservekey));
+ auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlock(coinbaseScript->reserveScript));
if (!pblocktemplate.get())
- throw JSONRPCError(RPC_INTERNAL_ERROR, "Wallet keypool empty");
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
CBlock *pblock = &pblocktemplate->block;
{
LOCK(cs_main);
@@ -163,16 +163,18 @@ Value generate(const Array& params, bool fHelp)
++pblock->nNonce;
}
CValidationState state;
- if (!ProcessNewBlock(state, NULL, pblock))
+ if (!ProcessNewBlock(state, NULL, pblock, true, NULL))
throw JSONRPCError(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted");
++nHeight;
blockHashes.push_back(pblock->GetHash().GetHex());
+
+ //mark script as important because it was used at least for one coinbase output
+ coinbaseScript->KeepScript();
}
return blockHashes;
}
-
-Value setgenerate(const Array& params, bool fHelp)
+UniValue setgenerate(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
@@ -194,8 +196,8 @@ Value setgenerate(const Array& params, bool fHelp)
+ HelpExampleRpc("setgenerate", "true, 1")
);
- if (pwalletMain == NULL)
- throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
+ if (Params().MineBlocksOnDemand())
+ throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Use the generate method instead of setgenerate on this network");
bool fGenerate = true;
if (params.size() > 0)
@@ -211,14 +213,12 @@ Value setgenerate(const Array& params, bool fHelp)
mapArgs["-gen"] = (fGenerate ? "1" : "0");
mapArgs ["-genproclimit"] = itostr(nGenProcLimit);
- GenerateBitcoins(fGenerate, pwalletMain, nGenProcLimit);
+ GenerateBitcoins(fGenerate, nGenProcLimit, Params());
- return Value::null;
+ return NullUniValue;
}
-#endif
-
-Value getmininginfo(const Array& params, bool fHelp)
+UniValue getmininginfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -245,7 +245,7 @@ Value getmininginfo(const Array& params, bool fHelp)
LOCK(cs_main);
- Object obj;
+ UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("blocks", (int)chainActive.Height()));
obj.push_back(Pair("currentblocksize", (uint64_t)nLastBlockSize));
obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
@@ -256,15 +256,13 @@ Value getmininginfo(const Array& params, bool fHelp)
obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
obj.push_back(Pair("testnet", Params().TestnetToBeDeprecatedFieldRPC()));
obj.push_back(Pair("chain", Params().NetworkIDString()));
-#ifdef ENABLE_WALLET
obj.push_back(Pair("generate", getgenerate(params, false)));
-#endif
return obj;
}
// NOTE: Unlike wallet RPC (which use BTC values), mining RPCs follow GBT (BIP 22) in using satoshi amounts
-Value prioritisetransaction(const Array& params, bool fHelp)
+UniValue prioritisetransaction(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 3)
throw runtime_error(
@@ -296,10 +294,10 @@ Value prioritisetransaction(const Array& params, bool fHelp)
// NOTE: Assumes a conclusive result; if result is inconclusive, it must be handled by caller
-static Value BIP22ValidationResult(const CValidationState& state)
+static UniValue BIP22ValidationResult(const CValidationState& state)
{
if (state.IsValid())
- return Value::null;
+ return NullUniValue;
std::string strRejectReason = state.GetRejectReason();
if (state.IsError())
@@ -314,7 +312,7 @@ static Value BIP22ValidationResult(const CValidationState& state)
return "valid?";
}
-Value getblocktemplate(const Array& params, bool fHelp)
+UniValue getblocktemplate(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() > 1)
throw runtime_error(
@@ -379,14 +377,14 @@ Value getblocktemplate(const Array& params, bool fHelp)
LOCK(cs_main);
std::string strMode = "template";
- Value lpval = Value::null;
+ UniValue lpval = NullUniValue;
if (params.size() > 0)
{
- const Object& oparam = params[0].get_obj();
- const Value& modeval = find_value(oparam, "mode");
- if (modeval.type() == str_type)
+ const UniValue& oparam = params[0].get_obj();
+ const UniValue& modeval = find_value(oparam, "mode");
+ if (modeval.isStr())
strMode = modeval.get_str();
- else if (modeval.type() == null_type)
+ else if (modeval.isNull())
{
/* Do nothing */
}
@@ -396,8 +394,8 @@ Value getblocktemplate(const Array& params, bool fHelp)
if (strMode == "proposal")
{
- const Value& dataval = find_value(oparam, "data");
- if (dataval.type() != str_type)
+ const UniValue& dataval = find_value(oparam, "data");
+ if (!dataval.isStr())
throw JSONRPCError(RPC_TYPE_ERROR, "Missing data String key for proposal");
CBlock block;
@@ -436,14 +434,14 @@ Value getblocktemplate(const Array& params, bool fHelp)
static unsigned int nTransactionsUpdatedLast;
- if (lpval.type() != null_type)
+ if (!lpval.isNull())
{
// Wait to respond until either the best block changes, OR a minute has passed and there are more transactions
uint256 hashWatchedChain;
boost::system_time checktxtime;
unsigned int nTransactionsUpdatedLastLP;
- if (lpval.type() == str_type)
+ if (lpval.isStr())
{
// Format: <hashBestChain><nTransactionsUpdatedLast>
std::string lpstr = lpval.get_str();
@@ -514,29 +512,28 @@ Value getblocktemplate(const Array& params, bool fHelp)
CBlock* pblock = &pblocktemplate->block; // pointer for convenience
// Update nTime
- UpdateTime(pblock, pindexPrev);
+ UpdateTime(pblock, Params().GetConsensus(), pindexPrev);
pblock->nNonce = 0;
- static const Array aCaps = boost::assign::list_of("proposal");
+ UniValue aCaps(UniValue::VARR); aCaps.push_back("proposal");
- Array transactions;
+ UniValue transactions(UniValue::VARR);
map<uint256, int64_t> setTxIndex;
int i = 0;
- BOOST_FOREACH (CTransaction& tx, pblock->vtx)
- {
+ BOOST_FOREACH (const CTransaction& tx, pblock->vtx) {
uint256 txHash = tx.GetHash();
setTxIndex[txHash] = i++;
if (tx.IsCoinBase())
continue;
- Object entry;
+ UniValue entry(UniValue::VOBJ);
entry.push_back(Pair("data", EncodeHexTx(tx)));
entry.push_back(Pair("hash", txHash.GetHex()));
- Array deps;
+ UniValue deps(UniValue::VARR);
BOOST_FOREACH (const CTxIn &in, tx.vin)
{
if (setTxIndex.count(in.prevout.hash))
@@ -551,12 +548,12 @@ Value getblocktemplate(const Array& params, bool fHelp)
transactions.push_back(entry);
}
- Object aux;
+ UniValue aux(UniValue::VOBJ);
aux.push_back(Pair("flags", HexStr(COINBASE_FLAGS.begin(), COINBASE_FLAGS.end())));
arith_uint256 hashTarget = arith_uint256().SetCompact(pblock->nBits);
- static Array aMutable;
+ static UniValue aMutable(UniValue::VARR);
if (aMutable.empty())
{
aMutable.push_back("time");
@@ -564,7 +561,7 @@ Value getblocktemplate(const Array& params, bool fHelp)
aMutable.push_back("prevblock");
}
- Object result;
+ UniValue result(UniValue::VOBJ);
result.push_back(Pair("capabilities", aCaps));
result.push_back(Pair("version", pblock->nVersion));
result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex()));
@@ -603,7 +600,7 @@ protected:
};
};
-Value submitblock(const Array& params, bool fHelp)
+UniValue submitblock(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
@@ -629,22 +626,27 @@ Value submitblock(const Array& params, bool fHelp)
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
uint256 hash = block.GetHash();
- BlockMap::iterator mi = mapBlockIndex.find(hash);
- if (mi != mapBlockIndex.end()) {
- CBlockIndex *pindex = mi->second;
- if (pindex->IsValid(BLOCK_VALID_SCRIPTS))
- return "duplicate";
- if (pindex->nStatus & BLOCK_FAILED_MASK)
- return "duplicate-invalid";
- // Otherwise, we might only have the header - process the block before returning
+ bool fBlockPresent = false;
+ {
+ LOCK(cs_main);
+ BlockMap::iterator mi = mapBlockIndex.find(hash);
+ if (mi != mapBlockIndex.end()) {
+ CBlockIndex *pindex = mi->second;
+ if (pindex->IsValid(BLOCK_VALID_SCRIPTS))
+ return "duplicate";
+ if (pindex->nStatus & BLOCK_FAILED_MASK)
+ return "duplicate-invalid";
+ // Otherwise, we might only have the header - process the block before returning
+ fBlockPresent = true;
+ }
}
CValidationState state;
submitblock_StateCatcher sc(block.GetHash());
RegisterValidationInterface(&sc);
- bool fAccepted = ProcessNewBlock(state, NULL, &block);
+ bool fAccepted = ProcessNewBlock(state, NULL, &block, true, NULL);
UnregisterValidationInterface(&sc);
- if (mi != mapBlockIndex.end())
+ if (fBlockPresent)
{
if (fAccepted && !sc.found)
return "duplicate-inconclusive";
@@ -659,7 +661,7 @@ Value submitblock(const Array& params, bool fHelp)
return BIP22ValidationResult(state);
}
-Value estimatefee(const Array& params, bool fHelp)
+UniValue estimatefee(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
throw runtime_error(
@@ -678,7 +680,7 @@ Value estimatefee(const Array& params, bool fHelp)
+ HelpExampleCli("estimatefee", "6")
);
- RPCTypeCheck(params, boost::assign::list_of(int_type));
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VNUM));
int nBlocks = params[0].get_int();
if (nBlocks < 1)
@@ -691,7 +693,7 @@ Value estimatefee(const Array& params, bool fHelp)
return ValueFromAmount(feeRate.GetFeePerK());
}
-Value estimatepriority(const Array& params, bool fHelp)
+UniValue estimatepriority(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
throw runtime_error(
@@ -710,7 +712,7 @@ Value estimatepriority(const Array& params, bool fHelp)
+ HelpExampleCli("estimatepriority", "6")
);
- RPCTypeCheck(params, boost::assign::list_of(int_type));
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VNUM));
int nBlocks = params[0].get_int();
if (nBlocks < 1)
diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp
index 938d79513f..cab57d7027 100644
--- a/src/rpcmisc.cpp
+++ b/src/rpcmisc.cpp
@@ -20,10 +20,9 @@
#include <stdint.h>
#include <boost/assign/list_of.hpp>
-#include "json/json_spirit_utils.h"
-#include "json/json_spirit_value.h"
-using namespace json_spirit;
+#include "univalue/univalue.h"
+
using namespace std;
/**
@@ -39,7 +38,7 @@ using namespace std;
*
* Or alternatively, create a specific query method for the information.
**/
-Value getinfo(const Array& params, bool fHelp)
+UniValue getinfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -78,7 +77,7 @@ Value getinfo(const Array& params, bool fHelp)
proxyType proxy;
GetProxy(NET_IPV4, proxy);
- Object obj;
+ UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("version", CLIENT_VERSION));
obj.push_back(Pair("protocolversion", PROTOCOL_VERSION));
#ifdef ENABLE_WALLET
@@ -90,7 +89,7 @@ Value getinfo(const Array& params, bool fHelp)
obj.push_back(Pair("blocks", (int)chainActive.Height()));
obj.push_back(Pair("timeoffset", GetTimeOffset()));
obj.push_back(Pair("connections", (int)vNodes.size()));
- obj.push_back(Pair("proxy", (proxy.IsValid() ? proxy.ToStringIPPort() : string())));
+ obj.push_back(Pair("proxy", (proxy.IsValid() ? proxy.proxy.ToStringIPPort() : string())));
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
obj.push_back(Pair("testnet", Params().TestnetToBeDeprecatedFieldRPC()));
#ifdef ENABLE_WALLET
@@ -108,41 +107,34 @@ Value getinfo(const Array& params, bool fHelp)
}
#ifdef ENABLE_WALLET
-class DescribeAddressVisitor : public boost::static_visitor<Object>
+class DescribeAddressVisitor : public boost::static_visitor<UniValue>
{
-private:
- isminetype mine;
-
public:
- DescribeAddressVisitor(isminetype mineIn) : mine(mineIn) {}
+ UniValue operator()(const CNoDestination &dest) const { return UniValue(UniValue::VOBJ); }
- Object operator()(const CNoDestination &dest) const { return Object(); }
-
- Object operator()(const CKeyID &keyID) const {
- Object obj;
+ UniValue operator()(const CKeyID &keyID) const {
+ UniValue obj(UniValue::VOBJ);
CPubKey vchPubKey;
obj.push_back(Pair("isscript", false));
- if (mine == ISMINE_SPENDABLE) {
- pwalletMain->GetPubKey(keyID, vchPubKey);
+ if (pwalletMain->GetPubKey(keyID, vchPubKey)) {
obj.push_back(Pair("pubkey", HexStr(vchPubKey)));
obj.push_back(Pair("iscompressed", vchPubKey.IsCompressed()));
}
return obj;
}
- Object operator()(const CScriptID &scriptID) const {
- Object obj;
+ UniValue operator()(const CScriptID &scriptID) const {
+ UniValue obj(UniValue::VOBJ);
+ CScript subscript;
obj.push_back(Pair("isscript", true));
- if (mine != ISMINE_NO) {
- CScript subscript;
- pwalletMain->GetCScript(scriptID, subscript);
+ if (pwalletMain->GetCScript(scriptID, subscript)) {
std::vector<CTxDestination> addresses;
txnouttype whichType;
int nRequired;
ExtractDestinations(subscript, whichType, addresses, nRequired);
obj.push_back(Pair("script", GetTxnOutputType(whichType)));
obj.push_back(Pair("hex", HexStr(subscript.begin(), subscript.end())));
- Array a;
+ UniValue a(UniValue::VARR);
BOOST_FOREACH(const CTxDestination& addr, addresses)
a.push_back(CBitcoinAddress(addr).ToString());
obj.push_back(Pair("addresses", a));
@@ -154,7 +146,7 @@ public:
};
#endif
-Value validateaddress(const Array& params, bool fHelp)
+UniValue validateaddress(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
throw runtime_error(
@@ -187,7 +179,7 @@ Value validateaddress(const Array& params, bool fHelp)
CBitcoinAddress address(params[0].get_str());
bool isValid = address.IsValid();
- Object ret;
+ UniValue ret(UniValue::VOBJ);
ret.push_back(Pair("isvalid", isValid));
if (isValid)
{
@@ -201,11 +193,9 @@ Value validateaddress(const Array& params, bool fHelp)
#ifdef ENABLE_WALLET
isminetype mine = pwalletMain ? IsMine(*pwalletMain, dest) : ISMINE_NO;
ret.push_back(Pair("ismine", (mine & ISMINE_SPENDABLE) ? true : false));
- if (mine != ISMINE_NO) {
- ret.push_back(Pair("iswatchonly", (mine & ISMINE_WATCH_ONLY) ? true: false));
- Object detail = boost::apply_visitor(DescribeAddressVisitor(mine), dest);
- ret.insert(ret.end(), detail.begin(), detail.end());
- }
+ ret.push_back(Pair("iswatchonly", (mine & ISMINE_WATCH_ONLY) ? true: false));
+ UniValue detail = boost::apply_visitor(DescribeAddressVisitor(), dest);
+ ret.pushKVs(detail);
if (pwalletMain && pwalletMain->mapAddressBook.count(dest))
ret.push_back(Pair("account", pwalletMain->mapAddressBook[dest].name));
#endif
@@ -216,10 +206,10 @@ Value validateaddress(const Array& params, bool fHelp)
/**
* Used by addmultisigaddress / createmultisig:
*/
-CScript _createmultisig_redeemScript(const Array& params)
+CScript _createmultisig_redeemScript(const UniValue& params)
{
int nRequired = params[0].get_int();
- const Array& keys = params[1].get_array();
+ const UniValue& keys = params[1].get_array();
// Gather public keys
if (nRequired < 1)
@@ -277,7 +267,7 @@ CScript _createmultisig_redeemScript(const Array& params)
return result;
}
-Value createmultisig(const Array& params, bool fHelp)
+UniValue createmultisig(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 2 || params.size() > 2)
{
@@ -313,14 +303,14 @@ Value createmultisig(const Array& params, bool fHelp)
CScriptID innerID(inner);
CBitcoinAddress address(innerID);
- Object result;
+ UniValue result(UniValue::VOBJ);
result.push_back(Pair("address", address.ToString()));
result.push_back(Pair("redeemScript", HexStr(inner.begin(), inner.end())));
return result;
}
-Value verifymessage(const Array& params, bool fHelp)
+UniValue verifymessage(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 3)
throw runtime_error(
@@ -374,7 +364,7 @@ Value verifymessage(const Array& params, bool fHelp)
return (pubkey.GetID() == keyID);
}
-Value setmocktime(const Array& params, bool fHelp)
+UniValue setmocktime(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
throw runtime_error(
@@ -388,10 +378,19 @@ Value setmocktime(const Array& params, bool fHelp)
if (!Params().MineBlocksOnDemand())
throw runtime_error("setmocktime for regression testing (-regtest mode) only");
- LOCK(cs_main);
+ // cs_vNodes is locked and node send/receive times are updated
+ // atomically with the time change to prevent peers from being
+ // disconnected because we think we haven't communicated with them
+ // in a long time.
+ LOCK2(cs_main, cs_vNodes);
- RPCTypeCheck(params, boost::assign::list_of(int_type));
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VNUM));
SetMockTime(params[0].get_int64());
- return Value::null;
+ uint64_t t = GetTime();
+ BOOST_FOREACH(CNode* pnode, vNodes) {
+ pnode->nLastSend = pnode->nLastRecv = t;
+ }
+
+ return NullUniValue;
}
diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp
index 6306fd4406..1572b16687 100644
--- a/src/rpcnet.cpp
+++ b/src/rpcnet.cpp
@@ -16,12 +16,11 @@
#include <boost/foreach.hpp>
-#include "json/json_spirit_value.h"
+#include "univalue/univalue.h"
-using namespace json_spirit;
using namespace std;
-Value getconnectioncount(const Array& params, bool fHelp)
+UniValue getconnectioncount(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -39,7 +38,7 @@ Value getconnectioncount(const Array& params, bool fHelp)
return (int)vNodes.size();
}
-Value ping(const Array& params, bool fHelp)
+UniValue ping(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -59,7 +58,7 @@ Value ping(const Array& params, bool fHelp)
pNode->fPingQueued = true;
}
- return Value::null;
+ return NullUniValue;
}
static void CopyNodeStats(std::vector<CNodeStats>& vstats)
@@ -75,7 +74,7 @@ static void CopyNodeStats(std::vector<CNodeStats>& vstats)
}
}
-Value getpeerinfo(const Array& params, bool fHelp)
+UniValue getpeerinfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -120,10 +119,10 @@ Value getpeerinfo(const Array& params, bool fHelp)
vector<CNodeStats> vstats;
CopyNodeStats(vstats);
- Array ret;
+ UniValue ret(UniValue::VARR);
BOOST_FOREACH(const CNodeStats& stats, vstats) {
- Object obj;
+ UniValue obj(UniValue::VOBJ);
CNodeStateStats statestats;
bool fStateStats = GetNodeStateStats(stats.nodeid, statestats);
obj.push_back(Pair("id", stats.nodeid));
@@ -151,7 +150,7 @@ Value getpeerinfo(const Array& params, bool fHelp)
obj.push_back(Pair("banscore", statestats.nMisbehavior));
obj.push_back(Pair("synced_headers", statestats.nSyncHeight));
obj.push_back(Pair("synced_blocks", statestats.nCommonHeight));
- Array heights;
+ UniValue heights(UniValue::VARR);
BOOST_FOREACH(int height, statestats.vHeightInFlight) {
heights.push_back(height);
}
@@ -165,7 +164,7 @@ Value getpeerinfo(const Array& params, bool fHelp)
return ret;
}
-Value addnode(const Array& params, bool fHelp)
+UniValue addnode(const UniValue& params, bool fHelp)
{
string strCommand;
if (params.size() == 2)
@@ -190,7 +189,7 @@ Value addnode(const Array& params, bool fHelp)
{
CAddress addr;
OpenNetworkConnection(addr, NULL, strNode.c_str());
- return Value::null;
+ return NullUniValue;
}
LOCK(cs_vAddedNodes);
@@ -212,10 +211,32 @@ Value addnode(const Array& params, bool fHelp)
vAddedNodes.erase(it);
}
- return Value::null;
+ return NullUniValue;
}
-Value getaddednodeinfo(const Array& params, bool fHelp)
+UniValue disconnectnode(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() != 1)
+ throw runtime_error(
+ "disconnectnode \"node\" \n"
+ "\nImmediately disconnects from the specified node.\n"
+ "\nArguments:\n"
+ "1. \"node\" (string, required) The node (see getpeerinfo for nodes)\n"
+ "\nExamples:\n"
+ + HelpExampleCli("disconnectnode", "\"192.168.0.6:8333\"")
+ + HelpExampleRpc("disconnectnode", "\"192.168.0.6:8333\"")
+ );
+
+ CNode* pNode = FindNode(params[0].get_str());
+ if (pNode == NULL)
+ throw JSONRPCError(RPC_CLIENT_NODE_NOT_CONNECTED, "Node not found in connected nodes");
+
+ pNode->fDisconnect = true;
+
+ return NullUniValue;
+}
+
+UniValue getaddednodeinfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
@@ -254,29 +275,29 @@ Value getaddednodeinfo(const Array& params, bool fHelp)
if (params.size() == 1)
{
LOCK(cs_vAddedNodes);
- BOOST_FOREACH(string& strAddNode, vAddedNodes)
+ BOOST_FOREACH(const std::string& strAddNode, vAddedNodes)
laddedNodes.push_back(strAddNode);
}
else
{
string strNode = params[1].get_str();
LOCK(cs_vAddedNodes);
- BOOST_FOREACH(string& strAddNode, vAddedNodes)
+ BOOST_FOREACH(const std::string& strAddNode, vAddedNodes) {
if (strAddNode == strNode)
{
laddedNodes.push_back(strAddNode);
break;
}
+ }
if (laddedNodes.size() == 0)
throw JSONRPCError(RPC_CLIENT_NODE_NOT_ADDED, "Error: Node has not been added.");
}
- Array ret;
+ UniValue ret(UniValue::VARR);
if (!fDns)
{
- BOOST_FOREACH(string& strAddNode, laddedNodes)
- {
- Object obj;
+ BOOST_FOREACH (const std::string& strAddNode, laddedNodes) {
+ UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("addednode", strAddNode));
ret.push_back(obj);
}
@@ -284,17 +305,16 @@ Value getaddednodeinfo(const Array& params, bool fHelp)
}
list<pair<string, vector<CService> > > laddedAddreses(0);
- BOOST_FOREACH(string& strAddNode, laddedNodes)
- {
+ BOOST_FOREACH(const std::string& strAddNode, laddedNodes) {
vector<CService> vservNode(0);
if(Lookup(strAddNode.c_str(), vservNode, Params().GetDefaultPort(), fNameLookup, 0))
laddedAddreses.push_back(make_pair(strAddNode, vservNode));
else
{
- Object obj;
+ UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("addednode", strAddNode));
obj.push_back(Pair("connected", false));
- Array addresses;
+ UniValue addresses(UniValue::VARR);
obj.push_back(Pair("addresses", addresses));
}
}
@@ -302,17 +322,16 @@ Value getaddednodeinfo(const Array& params, bool fHelp)
LOCK(cs_vNodes);
for (list<pair<string, vector<CService> > >::iterator it = laddedAddreses.begin(); it != laddedAddreses.end(); it++)
{
- Object obj;
+ UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("addednode", it->first));
- Array addresses;
+ UniValue addresses(UniValue::VARR);
bool fConnected = false;
- BOOST_FOREACH(CService& addrNode, it->second)
- {
+ BOOST_FOREACH(const CService& addrNode, it->second) {
bool fFound = false;
- Object node;
+ UniValue node(UniValue::VOBJ);
node.push_back(Pair("address", addrNode.ToString()));
- BOOST_FOREACH(CNode* pnode, vNodes)
+ BOOST_FOREACH(CNode* pnode, vNodes) {
if (pnode->addr == addrNode)
{
fFound = true;
@@ -320,6 +339,7 @@ Value getaddednodeinfo(const Array& params, bool fHelp)
node.push_back(Pair("connected", pnode->fInbound ? "inbound" : "outbound"));
break;
}
+ }
if (!fFound)
node.push_back(Pair("connected", "false"));
addresses.push_back(node);
@@ -332,7 +352,7 @@ Value getaddednodeinfo(const Array& params, bool fHelp)
return ret;
}
-Value getnettotals(const Array& params, bool fHelp)
+UniValue getnettotals(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() > 0)
throw runtime_error(
@@ -350,34 +370,35 @@ Value getnettotals(const Array& params, bool fHelp)
+ HelpExampleRpc("getnettotals", "")
);
- Object obj;
+ UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("totalbytesrecv", CNode::GetTotalBytesRecv()));
obj.push_back(Pair("totalbytessent", CNode::GetTotalBytesSent()));
obj.push_back(Pair("timemillis", GetTimeMillis()));
return obj;
}
-static Array GetNetworksInfo()
+static UniValue GetNetworksInfo()
{
- Array networks;
+ UniValue networks(UniValue::VARR);
for(int n=0; n<NET_MAX; ++n)
{
enum Network network = static_cast<enum Network>(n);
if(network == NET_UNROUTABLE)
continue;
proxyType proxy;
- Object obj;
+ UniValue obj(UniValue::VOBJ);
GetProxy(network, proxy);
obj.push_back(Pair("name", GetNetworkName(network)));
obj.push_back(Pair("limited", IsLimited(network)));
obj.push_back(Pair("reachable", IsReachable(network)));
- obj.push_back(Pair("proxy", proxy.IsValid() ? proxy.ToStringIPPort() : string()));
+ obj.push_back(Pair("proxy", proxy.IsValid() ? proxy.proxy.ToStringIPPort() : string()));
+ obj.push_back(Pair("proxy_randomize_credentials", proxy.randomize_credentials));
networks.push_back(obj);
}
return networks;
}
-Value getnetworkinfo(const Array& params, bool fHelp)
+UniValue getnetworkinfo(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
@@ -409,6 +430,7 @@ Value getnetworkinfo(const Array& params, bool fHelp)
" }\n"
" ,...\n"
" ]\n"
+ " \"warnings\": \"...\" (string) any network warnings (such as alert messages) \n"
"}\n"
"\nExamples:\n"
+ HelpExampleCli("getnetworkinfo", "")
@@ -417,7 +439,7 @@ Value getnetworkinfo(const Array& params, bool fHelp)
LOCK(cs_main);
- Object obj;
+ UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("version", CLIENT_VERSION));
obj.push_back(Pair("subversion",
FormatSubVersion(CLIENT_NAME, CLIENT_VERSION, std::vector<string>())));
@@ -427,12 +449,12 @@ Value getnetworkinfo(const Array& params, bool fHelp)
obj.push_back(Pair("connections", (int)vNodes.size()));
obj.push_back(Pair("networks", GetNetworksInfo()));
obj.push_back(Pair("relayfee", ValueFromAmount(::minRelayTxFee.GetFeePerK())));
- Array localAddresses;
+ UniValue localAddresses(UniValue::VARR);
{
LOCK(cs_mapLocalHost);
BOOST_FOREACH(const PAIRTYPE(CNetAddr, LocalServiceInfo) &item, mapLocalHost)
{
- Object rec;
+ UniValue rec(UniValue::VOBJ);
rec.push_back(Pair("address", item.first.ToString()));
rec.push_back(Pair("port", item.second.nPort));
rec.push_back(Pair("score", item.second.nScore));
@@ -440,5 +462,112 @@ Value getnetworkinfo(const Array& params, bool fHelp)
}
}
obj.push_back(Pair("localaddresses", localAddresses));
+ obj.push_back(Pair("warnings", GetWarnings("statusbar")));
return obj;
}
+
+UniValue setban(const UniValue& params, bool fHelp)
+{
+ string strCommand;
+ if (params.size() >= 2)
+ strCommand = params[1].get_str();
+ if (fHelp || params.size() < 2 ||
+ (strCommand != "add" && strCommand != "remove"))
+ throw runtime_error(
+ "setban \"ip(/netmask)\" \"add|remove\" (bantime) (absolute)\n"
+ "\nAttempts add or remove a IP/Subnet from the banned list.\n"
+ "\nArguments:\n"
+ "1. \"ip(/netmask)\" (string, required) The IP/Subnet (see getpeerinfo for nodes ip) with a optional netmask (default is /32 = single ip)\n"
+ "2. \"command\" (string, required) 'add' to add a IP/Subnet to the list, 'remove' to remove a IP/Subnet from the list\n"
+ "3. \"bantime\" (numeric, optional) time in seconds how long (or until when if [absolute] is set) the ip is banned (0 or empty means using the default time of 24h which can also be overwritten by the -bantime startup argument)\n"
+ "4. \"absolute\" (boolean, optional) If set, the bantime must be a absolute timestamp in seconds since epoch (Jan 1 1970 GMT)\n"
+ "\nExamples:\n"
+ + HelpExampleCli("setban", "\"192.168.0.6\" \"add\" 86400")
+ + HelpExampleCli("setban", "\"192.168.0.0/24\" \"add\"")
+ + HelpExampleRpc("setban", "\"192.168.0.6\", \"add\" 86400")
+ );
+
+ CSubNet subNet;
+ CNetAddr netAddr;
+ bool isSubnet = false;
+
+ if (params[0].get_str().find("/") != string::npos)
+ isSubnet = true;
+
+ if (!isSubnet)
+ netAddr = CNetAddr(params[0].get_str());
+ else
+ subNet = CSubNet(params[0].get_str());
+
+ if (! (isSubnet ? subNet.IsValid() : netAddr.IsValid()) )
+ throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: Invalid IP/Subnet");
+
+ if (strCommand == "add")
+ {
+ if (isSubnet ? CNode::IsBanned(subNet) : CNode::IsBanned(netAddr))
+ throw JSONRPCError(RPC_CLIENT_NODE_ALREADY_ADDED, "Error: IP/Subnet already banned");
+
+ int64_t banTime = 0; //use standard bantime if not specified
+ if (params.size() >= 3 && !params[2].isNull())
+ banTime = params[2].get_int64();
+
+ bool absolute = false;
+ if (params.size() == 4 && params[3].isTrue())
+ absolute = true;
+
+ isSubnet ? CNode::Ban(subNet, banTime, absolute) : CNode::Ban(netAddr, banTime, absolute);
+
+ //disconnect possible nodes
+ while(CNode *bannedNode = (isSubnet ? FindNode(subNet) : FindNode(netAddr)))
+ bannedNode->fDisconnect = true;
+ }
+ else if(strCommand == "remove")
+ {
+ if (!( isSubnet ? CNode::Unban(subNet) : CNode::Unban(netAddr) ))
+ throw JSONRPCError(RPC_MISC_ERROR, "Error: Unban failed");
+ }
+
+ return NullUniValue;
+}
+
+UniValue listbanned(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() != 0)
+ throw runtime_error(
+ "listbanned\n"
+ "\nList all banned IPs/Subnets.\n"
+ "\nExamples:\n"
+ + HelpExampleCli("listbanned", "")
+ + HelpExampleRpc("listbanned", "")
+ );
+
+ std::map<CSubNet, int64_t> banMap;
+ CNode::GetBanned(banMap);
+
+ UniValue bannedAddresses(UniValue::VARR);
+ for (std::map<CSubNet, int64_t>::iterator it = banMap.begin(); it != banMap.end(); it++)
+ {
+ UniValue rec(UniValue::VOBJ);
+ rec.push_back(Pair("address", (*it).first.ToString()));
+ rec.push_back(Pair("banned_untill", (*it).second));
+ bannedAddresses.push_back(rec);
+ }
+
+ return bannedAddresses;
+}
+
+UniValue clearbanned(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() != 0)
+ throw runtime_error(
+ "clearbanned\n"
+ "\nClear all banned IPs.\n"
+ "\nExamples:\n"
+ + HelpExampleCli("clearbanned", "")
+ + HelpExampleRpc("clearbanned", "")
+ );
+
+ CNode::ClearBanned();
+
+ return NullUniValue;
+}
diff --git a/src/rpcprotocol.cpp b/src/rpcprotocol.cpp
index 95d6b9e531..89dec2977e 100644
--- a/src/rpcprotocol.cpp
+++ b/src/rpcprotocol.cpp
@@ -23,10 +23,10 @@
#include <boost/iostreams/concepts.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/shared_ptr.hpp>
-#include "json/json_spirit_writer_template.h"
+
+#include "univalue/univalue.h"
using namespace std;
-using namespace json_spirit;
//! Number of bytes to allocate and read at most at once in post data
const size_t POST_READ_SIZE = 256 * 1024;
@@ -251,23 +251,22 @@ int ReadHTTPMessage(std::basic_istream<char>& stream, map<string,
*
* 1.0 spec: http://json-rpc.org/wiki/specification
* 1.2 spec: http://jsonrpc.org/historical/json-rpc-over-http.html
- * http://www.codeproject.com/KB/recipes/JSON_Spirit.aspx
*/
-string JSONRPCRequest(const string& strMethod, const Array& params, const Value& id)
+string JSONRPCRequest(const string& strMethod, const UniValue& params, const UniValue& id)
{
- Object request;
+ UniValue request(UniValue::VOBJ);
request.push_back(Pair("method", strMethod));
request.push_back(Pair("params", params));
request.push_back(Pair("id", id));
- return write_string(Value(request), false) + "\n";
+ return request.write() + "\n";
}
-Object JSONRPCReplyObj(const Value& result, const Value& error, const Value& id)
+UniValue JSONRPCReplyObj(const UniValue& result, const UniValue& error, const UniValue& id)
{
- Object reply;
- if (error.type() != null_type)
- reply.push_back(Pair("result", Value::null));
+ UniValue reply(UniValue::VOBJ);
+ if (!error.isNull())
+ reply.push_back(Pair("result", NullUniValue));
else
reply.push_back(Pair("result", result));
reply.push_back(Pair("error", error));
@@ -275,15 +274,15 @@ Object JSONRPCReplyObj(const Value& result, const Value& error, const Value& id)
return reply;
}
-string JSONRPCReply(const Value& result, const Value& error, const Value& id)
+string JSONRPCReply(const UniValue& result, const UniValue& error, const UniValue& id)
{
- Object reply = JSONRPCReplyObj(result, error, id);
- return write_string(Value(reply), false) + "\n";
+ UniValue reply = JSONRPCReplyObj(result, error, id);
+ return reply.write() + "\n";
}
-Object JSONRPCError(int code, const string& message)
+UniValue JSONRPCError(int code, const string& message)
{
- Object error;
+ UniValue error(UniValue::VOBJ);
error.push_back(Pair("code", code));
error.push_back(Pair("message", message));
return error;
diff --git a/src/rpcprotocol.h b/src/rpcprotocol.h
index 4f3f70fb37..ccd2439c9f 100644
--- a/src/rpcprotocol.h
+++ b/src/rpcprotocol.h
@@ -15,9 +15,7 @@
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
-#include "json/json_spirit_reader_template.h"
-#include "json/json_spirit_utils.h"
-#include "json/json_spirit_writer_template.h"
+#include "univalue/univalue.h"
//! HTTP status codes
enum HTTPStatusCode
@@ -65,6 +63,8 @@ enum RPCErrorCode
RPC_CLIENT_IN_INITIAL_DOWNLOAD = -10, //! Still downloading initial blocks
RPC_CLIENT_NODE_ALREADY_ADDED = -23, //! Node is already added
RPC_CLIENT_NODE_NOT_ADDED = -24, //! Node has not been added before
+ RPC_CLIENT_NODE_NOT_CONNECTED = -29, //! Node to disconnect not found in connected nodes
+ RPC_CLIENT_INVALID_IP_OR_SUBNET = -30, //! Invalid IP/Subnet
//! Wallet errors
RPC_WALLET_ERROR = -4, //! Unspecified problem with wallet (key not found etc.)
@@ -160,9 +160,9 @@ int ReadHTTPStatus(std::basic_istream<char>& stream, int &proto);
int ReadHTTPHeaders(std::basic_istream<char>& stream, std::map<std::string, std::string>& mapHeadersRet);
int ReadHTTPMessage(std::basic_istream<char>& stream, std::map<std::string, std::string>& mapHeadersRet,
std::string& strMessageRet, int nProto, size_t max_size);
-std::string JSONRPCRequest(const std::string& strMethod, const json_spirit::Array& params, const json_spirit::Value& id);
-json_spirit::Object JSONRPCReplyObj(const json_spirit::Value& result, const json_spirit::Value& error, const json_spirit::Value& id);
-std::string JSONRPCReply(const json_spirit::Value& result, const json_spirit::Value& error, const json_spirit::Value& id);
-json_spirit::Object JSONRPCError(int code, const std::string& message);
+std::string JSONRPCRequest(const std::string& strMethod, const UniValue& params, const UniValue& id);
+UniValue JSONRPCReplyObj(const UniValue& result, const UniValue& error, const UniValue& id);
+std::string JSONRPCReply(const UniValue& result, const UniValue& error, const UniValue& id);
+UniValue JSONRPCError(int code, const std::string& message);
#endif // BITCOIN_RPCPROTOCOL_H
diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp
index a79b4e3394..20394fc2c1 100644
--- a/src/rpcrawtransaction.cpp
+++ b/src/rpcrawtransaction.cpp
@@ -1,17 +1,20 @@
// Copyright (c) 2010 Satoshi Nakamoto
-// Copyright (c) 2009-2014 The Bitcoin Core developers
+// Copyright (c) 2009-2015 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 "base58.h"
-#include "primitives/transaction.h"
+#include "consensus/validation.h"
#include "core_io.h"
#include "init.h"
#include "keystore.h"
#include "main.h"
+#include "merkleblock.h"
#include "net.h"
+#include "primitives/transaction.h"
#include "rpcserver.h"
#include "script/script.h"
+#include "script/script_error.h"
#include "script/sign.h"
#include "script/standard.h"
#include "uint256.h"
@@ -22,13 +25,12 @@
#include <stdint.h>
#include <boost/assign/list_of.hpp>
-#include "json/json_spirit_utils.h"
-#include "json/json_spirit_value.h"
-using namespace json_spirit;
+#include "univalue/univalue.h"
+
using namespace std;
-void ScriptPubKeyToJSON(const CScript& scriptPubKey, Object& out, bool fIncludeHex)
+void ScriptPubKeyToJSON(const CScript& scriptPubKey, UniValue& out, bool fIncludeHex)
{
txnouttype type;
vector<CTxDestination> addresses;
@@ -46,26 +48,26 @@ void ScriptPubKeyToJSON(const CScript& scriptPubKey, Object& out, bool fIncludeH
out.push_back(Pair("reqSigs", nRequired));
out.push_back(Pair("type", GetTxnOutputType(type)));
- Array a;
+ UniValue a(UniValue::VARR);
BOOST_FOREACH(const CTxDestination& addr, addresses)
a.push_back(CBitcoinAddress(addr).ToString());
out.push_back(Pair("addresses", a));
}
-void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry)
+void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry)
{
entry.push_back(Pair("txid", tx.GetHash().GetHex()));
entry.push_back(Pair("version", tx.nVersion));
entry.push_back(Pair("locktime", (int64_t)tx.nLockTime));
- Array vin;
+ UniValue vin(UniValue::VARR);
BOOST_FOREACH(const CTxIn& txin, tx.vin) {
- Object in;
+ UniValue in(UniValue::VOBJ);
if (tx.IsCoinBase())
in.push_back(Pair("coinbase", HexStr(txin.scriptSig.begin(), txin.scriptSig.end())));
else {
in.push_back(Pair("txid", txin.prevout.hash.GetHex()));
in.push_back(Pair("vout", (int64_t)txin.prevout.n));
- Object o;
+ UniValue o(UniValue::VOBJ);
o.push_back(Pair("asm", txin.scriptSig.ToString()));
o.push_back(Pair("hex", HexStr(txin.scriptSig.begin(), txin.scriptSig.end())));
in.push_back(Pair("scriptSig", o));
@@ -74,13 +76,13 @@ void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry)
vin.push_back(in);
}
entry.push_back(Pair("vin", vin));
- Array vout;
+ UniValue vout(UniValue::VARR);
for (unsigned int i = 0; i < tx.vout.size(); i++) {
const CTxOut& txout = tx.vout[i];
- Object out;
+ UniValue out(UniValue::VOBJ);
out.push_back(Pair("value", ValueFromAmount(txout.nValue)));
out.push_back(Pair("n", (int64_t)i));
- Object o;
+ UniValue o(UniValue::VOBJ);
ScriptPubKeyToJSON(txout.scriptPubKey, o, true);
out.push_back(Pair("scriptPubKey", o));
vout.push_back(out);
@@ -103,7 +105,7 @@ void TxToJSON(const CTransaction& tx, const uint256 hashBlock, Object& entry)
}
}
-Value getrawtransaction(const Array& params, bool fHelp)
+UniValue getrawtransaction(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
@@ -187,124 +189,127 @@ Value getrawtransaction(const Array& params, bool fHelp)
if (!fVerbose)
return strHex;
- Object result;
+ UniValue result(UniValue::VOBJ);
result.push_back(Pair("hex", strHex));
TxToJSON(tx, hashBlock, result);
return result;
}
-#ifdef ENABLE_WALLET
-Value listunspent(const Array& params, bool fHelp)
+UniValue gettxoutproof(const UniValue& params, bool fHelp)
{
- if (fHelp || params.size() > 3)
+ if (fHelp || (params.size() != 1 && params.size() != 2))
throw runtime_error(
- "listunspent ( minconf maxconf [\"address\",...] )\n"
- "\nReturns array of unspent transaction outputs\n"
- "with between minconf and maxconf (inclusive) confirmations.\n"
- "Optionally filter to only include txouts paid to specified addresses.\n"
- "Results are an array of Objects, each of which has:\n"
- "{txid, vout, scriptPubKey, amount, confirmations}\n"
+ "gettxoutproof [\"txid\",...] ( blockhash )\n"
+ "\nReturns a hex-encoded proof that \"txid\" was included in a block.\n"
+ "\nNOTE: By default this function only works sometimes. This is when there is an\n"
+ "unspent output in the utxo for this transaction. To make it always work,\n"
+ "you need to maintain a transaction index, using the -txindex command line option or\n"
+ "specify the block in which the transaction is included in manually (by blockhash).\n"
+ "\nReturn the raw transaction data.\n"
"\nArguments:\n"
- "1. minconf (numeric, optional, default=1) The minimum confirmations to filter\n"
- "2. maxconf (numeric, optional, default=9999999) The maximum confirmations to filter\n"
- "3. \"addresses\" (string) A json array of bitcoin addresses to filter\n"
+ "1. \"txids\" (string) A json array of txids to filter\n"
" [\n"
- " \"address\" (string) bitcoin address\n"
+ " \"txid\" (string) A transaction hash\n"
" ,...\n"
" ]\n"
- "\nResult\n"
- "[ (array of json object)\n"
- " {\n"
- " \"txid\" : \"txid\", (string) the transaction id \n"
- " \"vout\" : n, (numeric) the vout value\n"
- " \"address\" : \"address\", (string) the bitcoin address\n"
- " \"account\" : \"account\", (string) DEPRECATED. The associated account, or \"\" for the default account\n"
- " \"scriptPubKey\" : \"key\", (string) the script key\n"
- " \"amount\" : x.xxx, (numeric) the transaction amount in btc\n"
- " \"confirmations\" : n (numeric) The number of confirmations\n"
- " }\n"
- " ,...\n"
- "]\n"
-
- "\nExamples\n"
- + HelpExampleCli("listunspent", "")
- + HelpExampleCli("listunspent", "6 9999999 \"[\\\"1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"")
- + HelpExampleRpc("listunspent", "6, 9999999 \"[\\\"1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"")
+ "2. \"block hash\" (string, optional) If specified, looks for txid in the block with this hash\n"
+ "\nResult:\n"
+ "\"data\" (string) A string that is a serialized, hex-encoded data for the proof.\n"
);
- RPCTypeCheck(params, boost::assign::list_of(int_type)(int_type)(array_type));
+ set<uint256> setTxids;
+ uint256 oneTxid;
+ UniValue txids = params[0].get_array();
+ for (unsigned int idx = 0; idx < txids.size(); idx++) {
+ const UniValue& txid = txids[idx];
+ if (txid.get_str().length() != 64 || !IsHex(txid.get_str()))
+ throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid txid ")+txid.get_str());
+ uint256 hash(uint256S(txid.get_str()));
+ if (setTxids.count(hash))
+ throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated txid: ")+txid.get_str());
+ setTxids.insert(hash);
+ oneTxid = hash;
+ }
+
+ LOCK(cs_main);
- int nMinDepth = 1;
- if (params.size() > 0)
- nMinDepth = params[0].get_int();
+ CBlockIndex* pblockindex = NULL;
- int nMaxDepth = 9999999;
+ uint256 hashBlock;
if (params.size() > 1)
- nMaxDepth = params[1].get_int();
+ {
+ hashBlock = uint256S(params[1].get_str());
+ if (!mapBlockIndex.count(hashBlock))
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found");
+ pblockindex = mapBlockIndex[hashBlock];
+ } else {
+ CCoins coins;
+ if (pcoinsTip->GetCoins(oneTxid, coins) && coins.nHeight > 0 && coins.nHeight <= chainActive.Height())
+ pblockindex = chainActive[coins.nHeight];
+ }
- set<CBitcoinAddress> setAddress;
- if (params.size() > 2) {
- Array inputs = params[2].get_array();
- BOOST_FOREACH(Value& input, inputs) {
- CBitcoinAddress address(input.get_str());
- if (!address.IsValid())
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+input.get_str());
- if (setAddress.count(address))
- throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+input.get_str());
- setAddress.insert(address);
- }
+ if (pblockindex == NULL)
+ {
+ CTransaction tx;
+ if (!GetTransaction(oneTxid, tx, hashBlock, false) || hashBlock.IsNull())
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Transaction not yet in block");
+ if (!mapBlockIndex.count(hashBlock))
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Transaction index corrupt");
+ pblockindex = mapBlockIndex[hashBlock];
}
- Array results;
- vector<COutput> vecOutputs;
- assert(pwalletMain != NULL);
- LOCK2(cs_main, pwalletMain->cs_wallet);
- pwalletMain->AvailableCoins(vecOutputs, false);
- BOOST_FOREACH(const COutput& out, vecOutputs) {
- if (out.nDepth < nMinDepth || out.nDepth > nMaxDepth)
- continue;
+ CBlock block;
+ if(!ReadBlockFromDisk(block, pblockindex))
+ throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
+
+ unsigned int ntxFound = 0;
+ BOOST_FOREACH(const CTransaction&tx, block.vtx)
+ if (setTxids.count(tx.GetHash()))
+ ntxFound++;
+ if (ntxFound != setTxids.size())
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "(Not all) transactions not found in specified block");
+
+ CDataStream ssMB(SER_NETWORK, PROTOCOL_VERSION);
+ CMerkleBlock mb(block, setTxids);
+ ssMB << mb;
+ std::string strHex = HexStr(ssMB.begin(), ssMB.end());
+ return strHex;
+}
- if (setAddress.size()) {
- CTxDestination address;
- if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address))
- continue;
+UniValue verifytxoutproof(const UniValue& params, bool fHelp)
+{
+ if (fHelp || params.size() != 1)
+ throw runtime_error(
+ "verifytxoutproof \"proof\"\n"
+ "\nVerifies that a proof points to a transaction in a block, returning the transaction it commits to\n"
+ "and throwing an RPC error if the block is not in our best chain\n"
+ "\nArguments:\n"
+ "1. \"proof\" (string, required) The hex-encoded proof generated by gettxoutproof\n"
+ "\nResult:\n"
+ "[\"txid\"] (array, strings) The txid(s) which the proof commits to, or empty array if the proof is invalid\n"
+ );
- if (!setAddress.count(address))
- continue;
- }
+ CDataStream ssMB(ParseHexV(params[0], "proof"), SER_NETWORK, PROTOCOL_VERSION);
+ CMerkleBlock merkleBlock;
+ ssMB >> merkleBlock;
- CAmount nValue = out.tx->vout[out.i].nValue;
- const CScript& pk = out.tx->vout[out.i].scriptPubKey;
- Object entry;
- entry.push_back(Pair("txid", out.tx->GetHash().GetHex()));
- entry.push_back(Pair("vout", out.i));
- CTxDestination address;
- if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) {
- entry.push_back(Pair("address", CBitcoinAddress(address).ToString()));
- if (pwalletMain->mapAddressBook.count(address))
- entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name));
- }
- entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end())));
- if (pk.IsPayToScriptHash()) {
- CTxDestination address;
- if (ExtractDestination(pk, address)) {
- const CScriptID& hash = boost::get<const CScriptID&>(address);
- CScript redeemScript;
- if (pwalletMain->GetCScript(hash, redeemScript))
- entry.push_back(Pair("redeemScript", HexStr(redeemScript.begin(), redeemScript.end())));
- }
- }
- entry.push_back(Pair("amount",ValueFromAmount(nValue)));
- entry.push_back(Pair("confirmations",out.nDepth));
- entry.push_back(Pair("spendable", out.fSpendable));
- results.push_back(entry);
- }
+ UniValue res(UniValue::VARR);
+
+ vector<uint256> vMatch;
+ if (merkleBlock.txn.ExtractMatches(vMatch) != merkleBlock.header.hashMerkleRoot)
+ return res;
+
+ LOCK(cs_main);
+
+ if (!mapBlockIndex.count(merkleBlock.header.GetHash()) || !chainActive.Contains(mapBlockIndex[merkleBlock.header.GetHash()]))
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found in chain");
- return results;
+ BOOST_FOREACH(const uint256& hash, vMatch)
+ res.push_back(hash.GetHex());
+ return res;
}
-#endif
-Value createrawtransaction(const Array& params, bool fHelp)
+UniValue createrawtransaction(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 2)
throw runtime_error(
@@ -338,20 +343,21 @@ Value createrawtransaction(const Array& params, bool fHelp)
);
LOCK(cs_main);
- RPCTypeCheck(params, boost::assign::list_of(array_type)(obj_type));
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VARR)(UniValue::VOBJ));
- Array inputs = params[0].get_array();
- Object sendTo = params[1].get_obj();
+ UniValue inputs = params[0].get_array();
+ UniValue sendTo = params[1].get_obj();
CMutableTransaction rawTx;
- BOOST_FOREACH(const Value& input, inputs) {
- const Object& o = input.get_obj();
+ for (unsigned int idx = 0; idx < inputs.size(); idx++) {
+ const UniValue& input = inputs[idx];
+ const UniValue& o = input.get_obj();
uint256 txid = ParseHashO(o, "txid");
- const Value& vout_v = find_value(o, "vout");
- if (vout_v.type() != int_type)
+ const UniValue& vout_v = find_value(o, "vout");
+ if (!vout_v.isNum())
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, missing vout key");
int nOutput = vout_v.get_int();
if (nOutput < 0)
@@ -362,17 +368,18 @@ Value createrawtransaction(const Array& params, bool fHelp)
}
set<CBitcoinAddress> setAddress;
- BOOST_FOREACH(const Pair& s, sendTo) {
- CBitcoinAddress address(s.name_);
+ vector<string> addrList = sendTo.getKeys();
+ BOOST_FOREACH(const string& name_, addrList) {
+ CBitcoinAddress address(name_);
if (!address.IsValid())
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+s.name_);
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+name_);
if (setAddress.count(address))
- throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+s.name_);
+ throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+name_);
setAddress.insert(address);
CScript scriptPubKey = GetScriptForDestination(address.Get());
- CAmount nAmount = AmountFromValue(s.value_);
+ CAmount nAmount = AmountFromValue(sendTo[name_]);
CTxOut out(nAmount, scriptPubKey);
rawTx.vout.push_back(out);
@@ -381,7 +388,7 @@ Value createrawtransaction(const Array& params, bool fHelp)
return EncodeHexTx(rawTx);
}
-Value decoderawtransaction(const Array& params, bool fHelp)
+UniValue decoderawtransaction(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
throw runtime_error(
@@ -433,20 +440,20 @@ Value decoderawtransaction(const Array& params, bool fHelp)
);
LOCK(cs_main);
- RPCTypeCheck(params, boost::assign::list_of(str_type));
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR));
CTransaction tx;
if (!DecodeHexTx(tx, params[0].get_str()))
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
- Object result;
+ UniValue result(UniValue::VOBJ);
TxToJSON(tx, uint256(), result);
return result;
}
-Value decodescript(const Array& params, bool fHelp)
+UniValue decodescript(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() != 1)
throw runtime_error(
@@ -472,9 +479,9 @@ Value decodescript(const Array& params, bool fHelp)
);
LOCK(cs_main);
- RPCTypeCheck(params, boost::assign::list_of(str_type));
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR));
- Object r;
+ UniValue r(UniValue::VOBJ);
CScript script;
if (params[0].get_str().size() > 0){
vector<unsigned char> scriptData(ParseHexV(params[0], "argument"));
@@ -488,7 +495,19 @@ Value decodescript(const Array& params, bool fHelp)
return r;
}
-Value signrawtransaction(const Array& params, bool fHelp)
+/** Pushes a JSON object for script verification or signing errors to vErrorsRet. */
+static void TxInErrorToJSON(const CTxIn& txin, UniValue& vErrorsRet, const std::string& strMessage)
+{
+ UniValue entry(UniValue::VOBJ);
+ entry.push_back(Pair("txid", txin.prevout.hash.ToString()));
+ entry.push_back(Pair("vout", (uint64_t)txin.prevout.n));
+ entry.push_back(Pair("scriptSig", HexStr(txin.scriptSig.begin(), txin.scriptSig.end())));
+ entry.push_back(Pair("sequence", (uint64_t)txin.nSequence));
+ entry.push_back(Pair("error", strMessage));
+ vErrorsRet.push_back(entry);
+}
+
+UniValue signrawtransaction(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 4)
throw runtime_error(
@@ -529,8 +548,18 @@ Value signrawtransaction(const Array& params, bool fHelp)
"\nResult:\n"
"{\n"
- " \"hex\": \"value\", (string) The raw transaction with signature(s) (hex-encoded string)\n"
- " \"complete\": n (numeric) if transaction has a complete set of signature (0 if not)\n"
+ " \"hex\" : \"value\", (string) The hex-encoded raw transaction with signature(s)\n"
+ " \"complete\" : true|false, (boolean) If the transaction has a complete set of signatures\n"
+ " \"errors\" : [ (json array of objects) Script verification errors (if there are any)\n"
+ " {\n"
+ " \"txid\" : \"hash\", (string) The hash of the referenced, previous transaction\n"
+ " \"vout\" : n, (numeric) The index of the output to spent and used as input\n"
+ " \"scriptSig\" : \"hex\", (string) The hex-encoded signature script\n"
+ " \"sequence\" : n, (numeric) Script sequence number\n"
+ " \"error\" : \"text\" (string) Verification or signing error related to the input\n"
+ " }\n"
+ " ,...\n"
+ " ]\n"
"}\n"
"\nExamples:\n"
@@ -543,7 +572,7 @@ Value signrawtransaction(const Array& params, bool fHelp)
#else
LOCK(cs_main);
#endif
- RPCTypeCheck(params, boost::assign::list_of(str_type)(array_type)(array_type)(str_type), true);
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VARR)(UniValue::VARR)(UniValue::VSTR), true);
vector<unsigned char> txData(ParseHexV(params[0], "argument 1"));
CDataStream ssData(txData, SER_NETWORK, PROTOCOL_VERSION);
@@ -565,7 +594,6 @@ Value signrawtransaction(const Array& params, bool fHelp)
// mergedTx will end up with all the signatures; it
// starts as a clone of the rawtx:
CMutableTransaction mergedTx(txVariants[0]);
- bool fComplete = true;
// Fetch previous transactions (inputs):
CCoinsView viewDummy;
@@ -587,10 +615,11 @@ Value signrawtransaction(const Array& params, bool fHelp)
bool fGivenKeys = false;
CBasicKeyStore tempKeystore;
- if (params.size() > 2 && params[2].type() != null_type) {
+ if (params.size() > 2 && !params[2].isNull()) {
fGivenKeys = true;
- Array keys = params[2].get_array();
- BOOST_FOREACH(Value k, keys) {
+ UniValue keys = params[2].get_array();
+ for (unsigned int idx = 0; idx < keys.size(); idx++) {
+ UniValue k = keys[idx];
CBitcoinSecret vchSecret;
bool fGood = vchSecret.SetString(k.get_str());
if (!fGood)
@@ -607,15 +636,16 @@ Value signrawtransaction(const Array& params, bool fHelp)
#endif
// Add previous txouts given in the RPC call:
- if (params.size() > 1 && params[1].type() != null_type) {
- Array prevTxs = params[1].get_array();
- BOOST_FOREACH(Value& p, prevTxs) {
- if (p.type() != obj_type)
+ if (params.size() > 1 && !params[1].isNull()) {
+ UniValue prevTxs = params[1].get_array();
+ for (unsigned int idx = 0; idx < prevTxs.size(); idx++) {
+ const UniValue& p = prevTxs[idx];
+ if (!p.isObject())
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "expected object with {\"txid'\",\"vout\",\"scriptPubKey\"}");
- Object prevOut = p.get_obj();
+ UniValue prevOut = p.get_obj();
- RPCTypeCheck(prevOut, boost::assign::map_list_of("txid", str_type)("vout", int_type)("scriptPubKey", str_type));
+ RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR));
uint256 txid = ParseHashO(prevOut, "txid");
@@ -643,9 +673,9 @@ Value signrawtransaction(const Array& params, bool fHelp)
// if redeemScript given and not using the local wallet (private keys
// given), add redeemScript to the tempKeystore so it can be signed:
if (fGivenKeys && scriptPubKey.IsPayToScriptHash()) {
- RPCTypeCheck(prevOut, boost::assign::map_list_of("txid", str_type)("vout", int_type)("scriptPubKey", str_type)("redeemScript",str_type));
- Value v = find_value(prevOut, "redeemScript");
- if (!(v == Value::null)) {
+ RPCTypeCheckObj(prevOut, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM)("scriptPubKey", UniValue::VSTR)("redeemScript",UniValue::VSTR));
+ UniValue v = find_value(prevOut, "redeemScript");
+ if (!v.isNull()) {
vector<unsigned char> rsData(ParseHexV(v, "redeemScript"));
CScript redeemScript(rsData.begin(), rsData.end());
tempKeystore.AddCScript(redeemScript);
@@ -661,7 +691,7 @@ Value signrawtransaction(const Array& params, bool fHelp)
#endif
int nHashType = SIGHASH_ALL;
- if (params.size() > 3 && params[3].type() != null_type) {
+ if (params.size() > 3 && !params[3].isNull()) {
static map<string, int> mapSigHashValues =
boost::assign::map_list_of
(string("ALL"), int(SIGHASH_ALL))
@@ -680,12 +710,15 @@ Value signrawtransaction(const Array& params, bool fHelp)
bool fHashSingle = ((nHashType & ~SIGHASH_ANYONECANPAY) == SIGHASH_SINGLE);
+ // Script verification errors
+ UniValue vErrors(UniValue::VARR);
+
// Sign what we can:
for (unsigned int i = 0; i < mergedTx.vin.size(); i++) {
CTxIn& txin = mergedTx.vin[i];
const CCoins* coins = view.AccessCoins(txin.prevout.hash);
if (coins == NULL || !coins->IsAvailable(txin.prevout.n)) {
- fComplete = false;
+ TxInErrorToJSON(txin, vErrors, "Input not found or already spent");
continue;
}
const CScript& prevPubKey = coins->vout[txin.prevout.n].scriptPubKey;
@@ -699,18 +732,24 @@ Value signrawtransaction(const Array& params, bool fHelp)
BOOST_FOREACH(const CMutableTransaction& txv, txVariants) {
txin.scriptSig = CombineSignatures(prevPubKey, mergedTx, i, txin.scriptSig, txv.vin[i].scriptSig);
}
- if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i)))
- fComplete = false;
+ ScriptError serror = SCRIPT_ERR_OK;
+ if (!VerifyScript(txin.scriptSig, prevPubKey, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker(&mergedTx, i), &serror)) {
+ TxInErrorToJSON(txin, vErrors, ScriptErrorString(serror));
+ }
}
+ bool fComplete = vErrors.empty();
- Object result;
+ UniValue result(UniValue::VOBJ);
result.push_back(Pair("hex", EncodeHexTx(mergedTx)));
result.push_back(Pair("complete", fComplete));
+ if (!vErrors.empty()) {
+ result.push_back(Pair("errors", vErrors));
+ }
return result;
}
-Value sendrawtransaction(const Array& params, bool fHelp)
+UniValue sendrawtransaction(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
@@ -734,7 +773,7 @@ Value sendrawtransaction(const Array& params, bool fHelp)
);
LOCK(cs_main);
- RPCTypeCheck(params, boost::assign::list_of(str_type)(bool_type));
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR)(UniValue::VBOOL));
// parse hex string from parameter
CTransaction tx;
@@ -753,11 +792,16 @@ Value sendrawtransaction(const Array& params, bool fHelp)
if (!fHaveMempool && !fHaveChain) {
// push to local node and sync with wallets
CValidationState state;
- if (!AcceptToMemoryPool(mempool, state, tx, false, NULL, !fOverrideFees)) {
- if(state.IsInvalid())
+ bool fMissingInputs;
+ if (!AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees)) {
+ if (state.IsInvalid()) {
throw JSONRPCError(RPC_TRANSACTION_REJECTED, strprintf("%i: %s", state.GetRejectCode(), state.GetRejectReason()));
- else
+ } else {
+ if (fMissingInputs) {
+ throw JSONRPCError(RPC_TRANSACTION_ERROR, "Missing inputs");
+ }
throw JSONRPCError(RPC_TRANSACTION_ERROR, state.GetRejectReason());
+ }
}
} else if (fHaveChain) {
throw JSONRPCError(RPC_TRANSACTION_ALREADY_IN_CHAIN, "transaction already in block chain");
diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp
index 0fd7769a19..13b8661c65 100644
--- a/src/rpcserver.cpp
+++ b/src/rpcserver.cpp
@@ -11,6 +11,7 @@
#include "sync.h"
#include "ui_interface.h"
#include "util.h"
+#include "utilmoneystr.h"
#include "utilstrencodings.h"
#ifdef ENABLE_WALLET
#include "wallet/wallet.h"
@@ -27,10 +28,10 @@
#include <boost/shared_ptr.hpp>
#include <boost/signals2/signal.hpp>
#include <boost/thread.hpp>
-#include "json/json_spirit_writer_template.h"
+
+#include "univalue/univalue.h"
using namespace boost::asio;
-using namespace json_spirit;
using namespace RPCServer;
using namespace std;
@@ -78,71 +79,67 @@ void RPCServer::OnPostCommand(boost::function<void (const CRPCCommand&)> slot)
g_rpcSignals.PostCommand.connect(boost::bind(slot, _1));
}
-void RPCTypeCheck(const Array& params,
- const list<Value_type>& typesExpected,
+void RPCTypeCheck(const UniValue& params,
+ const list<UniValue::VType>& typesExpected,
bool fAllowNull)
{
unsigned int i = 0;
- BOOST_FOREACH(Value_type t, typesExpected)
+ BOOST_FOREACH(UniValue::VType t, typesExpected)
{
if (params.size() <= i)
break;
- const Value& v = params[i];
- if (!((v.type() == t) || (fAllowNull && (v.type() == null_type))))
+ const UniValue& v = params[i];
+ if (!((v.type() == t) || (fAllowNull && (v.isNull()))))
{
string err = strprintf("Expected type %s, got %s",
- Value_type_name[t], Value_type_name[v.type()]);
+ uvTypeName(t), uvTypeName(v.type()));
throw JSONRPCError(RPC_TYPE_ERROR, err);
}
i++;
}
}
-void RPCTypeCheck(const Object& o,
- const map<string, Value_type>& typesExpected,
+void RPCTypeCheckObj(const UniValue& o,
+ const map<string, UniValue::VType>& typesExpected,
bool fAllowNull)
{
- BOOST_FOREACH(const PAIRTYPE(string, Value_type)& t, typesExpected)
+ BOOST_FOREACH(const PAIRTYPE(string, UniValue::VType)& t, typesExpected)
{
- const Value& v = find_value(o, t.first);
- if (!fAllowNull && v.type() == null_type)
+ const UniValue& v = find_value(o, t.first);
+ if (!fAllowNull && v.isNull())
throw JSONRPCError(RPC_TYPE_ERROR, strprintf("Missing %s", t.first));
- if (!((v.type() == t.second) || (fAllowNull && (v.type() == null_type))))
+ if (!((v.type() == t.second) || (fAllowNull && (v.isNull()))))
{
string err = strprintf("Expected type %s for %s, got %s",
- Value_type_name[t.second], t.first, Value_type_name[v.type()]);
+ uvTypeName(t.second), t.first, uvTypeName(v.type()));
throw JSONRPCError(RPC_TYPE_ERROR, err);
}
}
}
-static inline int64_t roundint64(double d)
-{
- return (int64_t)(d > 0 ? d + 0.5 : d - 0.5);
-}
-
-CAmount AmountFromValue(const Value& value)
+CAmount AmountFromValue(const UniValue& value)
{
- double dAmount = value.get_real();
- if (dAmount <= 0.0 || dAmount > 21000000.0)
+ if (!value.isReal() && !value.isNum())
+ throw JSONRPCError(RPC_TYPE_ERROR, "Amount is not a number");
+ CAmount amount;
+ if (!ParseMoney(value.getValStr(), amount))
throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount");
- CAmount nAmount = roundint64(dAmount * COIN);
- if (!MoneyRange(nAmount))
- throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount");
- return nAmount;
+ if (!MoneyRange(amount))
+ throw JSONRPCError(RPC_TYPE_ERROR, "Amount out of range");
+ return amount;
}
-Value ValueFromAmount(const CAmount& amount)
+UniValue ValueFromAmount(const CAmount& amount)
{
- return (double)amount / (double)COIN;
+ return UniValue(UniValue::VREAL, FormatMoney(amount));
}
-uint256 ParseHashV(const Value& v, string strName)
+uint256 ParseHashV(const UniValue& v, string strName)
{
string strHex;
- if (v.type() == str_type)
+ if (v.isStr())
strHex = v.get_str();
if (!IsHex(strHex)) // Note: IsHex("") is false
throw JSONRPCError(RPC_INVALID_PARAMETER, strName+" must be hexadecimal string (not '"+strHex+"')");
@@ -150,20 +147,20 @@ uint256 ParseHashV(const Value& v, string strName)
result.SetHex(strHex);
return result;
}
-uint256 ParseHashO(const Object& o, string strKey)
+uint256 ParseHashO(const UniValue& o, string strKey)
{
return ParseHashV(find_value(o, strKey), strKey);
}
-vector<unsigned char> ParseHexV(const Value& v, string strName)
+vector<unsigned char> ParseHexV(const UniValue& v, string strName)
{
string strHex;
- if (v.type() == str_type)
+ if (v.isStr())
strHex = v.get_str();
if (!IsHex(strHex))
throw JSONRPCError(RPC_INVALID_PARAMETER, strName+" must be hexadecimal string (not '"+strHex+"')");
return ParseHex(strHex);
}
-vector<unsigned char> ParseHexO(const Object& o, string strKey)
+vector<unsigned char> ParseHexO(const UniValue& o, string strKey)
{
return ParseHexV(find_value(o, strKey), strKey);
}
@@ -173,7 +170,7 @@ vector<unsigned char> ParseHexO(const Object& o, string strKey)
* Note: This interface may still be subject to change.
*/
-string CRPCTable::help(string strCommand) const
+std::string CRPCTable::help(const std::string& strCommand) const
{
string strRet;
string category;
@@ -193,14 +190,9 @@ string CRPCTable::help(string strCommand) const
continue;
if ((strCommand != "" || pcmd->category == "hidden") && strMethod != strCommand)
continue;
-#ifdef ENABLE_WALLET
- if (pcmd->reqWallet && !pwalletMain)
- continue;
-#endif
-
try
{
- Array params;
+ UniValue params;
rpcfn_type pfn = pcmd->actor;
if (setDone.insert(pfn).second)
(*pfn)(params, true);
@@ -233,7 +225,7 @@ string CRPCTable::help(string strCommand) const
return strRet;
}
-Value help(const Array& params, bool fHelp)
+UniValue help(const UniValue& params, bool fHelp)
{
if (fHelp || params.size() > 1)
throw runtime_error(
@@ -253,7 +245,7 @@ Value help(const Array& params, bool fHelp)
}
-Value stop(const Array& params, bool fHelp)
+UniValue stop(const UniValue& params, bool fHelp)
{
// Accept the deprecated and ignored 'detach' boolean argument
if (fHelp || params.size() > 1)
@@ -271,114 +263,122 @@ Value stop(const Array& params, bool fHelp)
* Call Table
*/
static const CRPCCommand vRPCCommands[] =
-{ // category name actor (function) okSafeMode reqWallet
- // --------------------- ------------------------ ----------------------- ---------- ---------
+{ // category name actor (function) okSafeMode
+ // --------------------- ------------------------ ----------------------- ----------
/* Overall control/query calls */
- { "control", "getinfo", &getinfo, true, false }, /* uses wallet if enabled */
- { "control", "help", &help, true, false },
- { "control", "stop", &stop, true, false },
+ { "control", "getinfo", &getinfo, true }, /* uses wallet if enabled */
+ { "control", "help", &help, true },
+ { "control", "stop", &stop, true },
/* P2P networking */
- { "network", "getnetworkinfo", &getnetworkinfo, true, false },
- { "network", "addnode", &addnode, true, false },
- { "network", "getaddednodeinfo", &getaddednodeinfo, true, false },
- { "network", "getconnectioncount", &getconnectioncount, true, false },
- { "network", "getnettotals", &getnettotals, true, false },
- { "network", "getpeerinfo", &getpeerinfo, true, false },
- { "network", "ping", &ping, true, false },
+ { "network", "getnetworkinfo", &getnetworkinfo, true },
+ { "network", "addnode", &addnode, true },
+ { "network", "disconnectnode", &disconnectnode, true },
+ { "network", "getaddednodeinfo", &getaddednodeinfo, true },
+ { "network", "getconnectioncount", &getconnectioncount, true },
+ { "network", "getnettotals", &getnettotals, true },
+ { "network", "getpeerinfo", &getpeerinfo, true },
+ { "network", "ping", &ping, true },
+ { "network", "setban", &setban, true },
+ { "network", "listbanned", &listbanned, true },
+ { "network", "clearbanned", &clearbanned, true },
/* Block chain and UTXO */
- { "blockchain", "getblockchaininfo", &getblockchaininfo, true, false },
- { "blockchain", "getbestblockhash", &getbestblockhash, true, false },
- { "blockchain", "getblockcount", &getblockcount, true, false },
- { "blockchain", "getblock", &getblock, true, false },
- { "blockchain", "getblockhash", &getblockhash, true, false },
- { "blockchain", "getchaintips", &getchaintips, true, false },
- { "blockchain", "getdifficulty", &getdifficulty, true, false },
- { "blockchain", "getmempoolinfo", &getmempoolinfo, true, false },
- { "blockchain", "getrawmempool", &getrawmempool, true, false },
- { "blockchain", "gettxout", &gettxout, true, false },
- { "blockchain", "gettxoutsetinfo", &gettxoutsetinfo, true, false },
- { "blockchain", "verifychain", &verifychain, true, false },
+ { "blockchain", "getblockchaininfo", &getblockchaininfo, true },
+ { "blockchain", "getbestblockhash", &getbestblockhash, true },
+ { "blockchain", "getblockcount", &getblockcount, true },
+ { "blockchain", "getblock", &getblock, true },
+ { "blockchain", "getblockhash", &getblockhash, true },
+ { "blockchain", "getblockheader", &getblockheader, true },
+ { "blockchain", "getchaintips", &getchaintips, true },
+ { "blockchain", "getdifficulty", &getdifficulty, true },
+ { "blockchain", "getmempoolinfo", &getmempoolinfo, true },
+ { "blockchain", "getrawmempool", &getrawmempool, true },
+ { "blockchain", "gettxout", &gettxout, true },
+ { "blockchain", "gettxoutproof", &gettxoutproof, true },
+ { "blockchain", "verifytxoutproof", &verifytxoutproof, true },
+ { "blockchain", "gettxoutsetinfo", &gettxoutsetinfo, true },
+ { "blockchain", "verifychain", &verifychain, true },
/* Mining */
- { "mining", "getblocktemplate", &getblocktemplate, true, false },
- { "mining", "getmininginfo", &getmininginfo, true, false },
- { "mining", "getnetworkhashps", &getnetworkhashps, true, false },
- { "mining", "prioritisetransaction", &prioritisetransaction, true, false },
- { "mining", "submitblock", &submitblock, true, false },
+ { "mining", "getblocktemplate", &getblocktemplate, true },
+ { "mining", "getmininginfo", &getmininginfo, true },
+ { "mining", "getnetworkhashps", &getnetworkhashps, true },
+ { "mining", "prioritisetransaction", &prioritisetransaction, true },
+ { "mining", "submitblock", &submitblock, true },
-#ifdef ENABLE_WALLET
/* Coin generation */
- { "generating", "getgenerate", &getgenerate, true, false },
- { "generating", "setgenerate", &setgenerate, true, false },
- { "generating", "generate", &generate, true, false },
-#endif
+ { "generating", "getgenerate", &getgenerate, true },
+ { "generating", "setgenerate", &setgenerate, true },
+ { "generating", "generate", &generate, true },
/* Raw transactions */
- { "rawtransactions", "createrawtransaction", &createrawtransaction, true, false },
- { "rawtransactions", "decoderawtransaction", &decoderawtransaction, true, false },
- { "rawtransactions", "decodescript", &decodescript, true, false },
- { "rawtransactions", "getrawtransaction", &getrawtransaction, true, false },
- { "rawtransactions", "sendrawtransaction", &sendrawtransaction, false, false },
- { "rawtransactions", "signrawtransaction", &signrawtransaction, false, false }, /* uses wallet if enabled */
+ { "rawtransactions", "createrawtransaction", &createrawtransaction, true },
+ { "rawtransactions", "decoderawtransaction", &decoderawtransaction, true },
+ { "rawtransactions", "decodescript", &decodescript, true },
+ { "rawtransactions", "getrawtransaction", &getrawtransaction, true },
+ { "rawtransactions", "sendrawtransaction", &sendrawtransaction, false },
+ { "rawtransactions", "signrawtransaction", &signrawtransaction, false }, /* uses wallet if enabled */
+#ifdef ENABLE_WALLET
+ { "rawtransactions", "fundrawtransaction", &fundrawtransaction, false },
+#endif
/* Utility functions */
- { "util", "createmultisig", &createmultisig, true, false },
- { "util", "validateaddress", &validateaddress, true, false }, /* uses wallet if enabled */
- { "util", "verifymessage", &verifymessage, true, false },
- { "util", "estimatefee", &estimatefee, true, false },
- { "util", "estimatepriority", &estimatepriority, true, false },
+ { "util", "createmultisig", &createmultisig, true },
+ { "util", "validateaddress", &validateaddress, true }, /* uses wallet if enabled */
+ { "util", "verifymessage", &verifymessage, true },
+ { "util", "estimatefee", &estimatefee, true },
+ { "util", "estimatepriority", &estimatepriority, true },
/* Not shown in help */
- { "hidden", "invalidateblock", &invalidateblock, true, false },
- { "hidden", "reconsiderblock", &reconsiderblock, true, false },
- { "hidden", "setmocktime", &setmocktime, true, false },
+ { "hidden", "invalidateblock", &invalidateblock, true },
+ { "hidden", "reconsiderblock", &reconsiderblock, true },
+ { "hidden", "setmocktime", &setmocktime, true },
#ifdef ENABLE_WALLET
- { "hidden", "resendwallettransactions", &resendwallettransactions, true, true },
+ { "hidden", "resendwallettransactions", &resendwallettransactions, true},
#endif
#ifdef ENABLE_WALLET
/* Wallet */
- { "wallet", "addmultisigaddress", &addmultisigaddress, true, true },
- { "wallet", "backupwallet", &backupwallet, true, true },
- { "wallet", "dumpprivkey", &dumpprivkey, true, true },
- { "wallet", "dumpwallet", &dumpwallet, true, true },
- { "wallet", "encryptwallet", &encryptwallet, true, true },
- { "wallet", "getaccountaddress", &getaccountaddress, true, true },
- { "wallet", "getaccount", &getaccount, true, true },
- { "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true, true },
- { "wallet", "getbalance", &getbalance, false, true },
- { "wallet", "getnewaddress", &getnewaddress, true, true },
- { "wallet", "getrawchangeaddress", &getrawchangeaddress, true, true },
- { "wallet", "getreceivedbyaccount", &getreceivedbyaccount, false, true },
- { "wallet", "getreceivedbyaddress", &getreceivedbyaddress, false, true },
- { "wallet", "gettransaction", &gettransaction, false, true },
- { "wallet", "getunconfirmedbalance", &getunconfirmedbalance, false, true },
- { "wallet", "getwalletinfo", &getwalletinfo, false, true },
- { "wallet", "importprivkey", &importprivkey, true, true },
- { "wallet", "importwallet", &importwallet, true, true },
- { "wallet", "importaddress", &importaddress, true, true },
- { "wallet", "keypoolrefill", &keypoolrefill, true, true },
- { "wallet", "listaccounts", &listaccounts, false, true },
- { "wallet", "listaddressgroupings", &listaddressgroupings, false, true },
- { "wallet", "listlockunspent", &listlockunspent, false, true },
- { "wallet", "listreceivedbyaccount", &listreceivedbyaccount, false, true },
- { "wallet", "listreceivedbyaddress", &listreceivedbyaddress, false, true },
- { "wallet", "listsinceblock", &listsinceblock, false, true },
- { "wallet", "listtransactions", &listtransactions, false, true },
- { "wallet", "listunspent", &listunspent, false, true },
- { "wallet", "lockunspent", &lockunspent, true, true },
- { "wallet", "move", &movecmd, false, true },
- { "wallet", "sendfrom", &sendfrom, false, true },
- { "wallet", "sendmany", &sendmany, false, true },
- { "wallet", "sendtoaddress", &sendtoaddress, false, true },
- { "wallet", "setaccount", &setaccount, true, true },
- { "wallet", "settxfee", &settxfee, true, true },
- { "wallet", "signmessage", &signmessage, true, true },
- { "wallet", "walletlock", &walletlock, true, true },
- { "wallet", "walletpassphrasechange", &walletpassphrasechange, true, true },
- { "wallet", "walletpassphrase", &walletpassphrase, true, true },
+ { "wallet", "addmultisigaddress", &addmultisigaddress, true },
+ { "wallet", "backupwallet", &backupwallet, true },
+ { "wallet", "dumpprivkey", &dumpprivkey, true },
+ { "wallet", "dumpwallet", &dumpwallet, true },
+ { "wallet", "encryptwallet", &encryptwallet, true },
+ { "wallet", "getaccountaddress", &getaccountaddress, true },
+ { "wallet", "getaccount", &getaccount, true },
+ { "wallet", "getaddressesbyaccount", &getaddressesbyaccount, true },
+ { "wallet", "getbalance", &getbalance, false },
+ { "wallet", "getnewaddress", &getnewaddress, true },
+ { "wallet", "getrawchangeaddress", &getrawchangeaddress, true },
+ { "wallet", "getreceivedbyaccount", &getreceivedbyaccount, false },
+ { "wallet", "getreceivedbyaddress", &getreceivedbyaddress, false },
+ { "wallet", "gettransaction", &gettransaction, false },
+ { "wallet", "getunconfirmedbalance", &getunconfirmedbalance, false },
+ { "wallet", "getwalletinfo", &getwalletinfo, false },
+ { "wallet", "importprivkey", &importprivkey, true },
+ { "wallet", "importwallet", &importwallet, true },
+ { "wallet", "importaddress", &importaddress, true },
+ { "wallet", "keypoolrefill", &keypoolrefill, true },
+ { "wallet", "listaccounts", &listaccounts, false },
+ { "wallet", "listaddressgroupings", &listaddressgroupings, false },
+ { "wallet", "listlockunspent", &listlockunspent, false },
+ { "wallet", "listreceivedbyaccount", &listreceivedbyaccount, false },
+ { "wallet", "listreceivedbyaddress", &listreceivedbyaddress, false },
+ { "wallet", "listsinceblock", &listsinceblock, false },
+ { "wallet", "listtransactions", &listtransactions, false },
+ { "wallet", "listunspent", &listunspent, false },
+ { "wallet", "lockunspent", &lockunspent, true },
+ { "wallet", "move", &movecmd, false },
+ { "wallet", "sendfrom", &sendfrom, false },
+ { "wallet", "sendmany", &sendmany, false },
+ { "wallet", "sendtoaddress", &sendtoaddress, false },
+ { "wallet", "setaccount", &setaccount, true },
+ { "wallet", "settxfee", &settxfee, true },
+ { "wallet", "signmessage", &signmessage, true },
+ { "wallet", "walletlock", &walletlock, true },
+ { "wallet", "walletpassphrasechange", &walletpassphrasechange, true },
+ { "wallet", "walletpassphrase", &walletpassphrase, true },
#endif // ENABLE_WALLET
};
@@ -394,7 +394,7 @@ CRPCTable::CRPCTable()
}
}
-const CRPCCommand *CRPCTable::operator[](string name) const
+const CRPCCommand *CRPCTable::operator[](const std::string& name) const
{
map<string, const CRPCCommand*>::const_iterator it = mapCommands.find(name);
if (it == mapCommands.end())
@@ -413,14 +413,14 @@ bool HTTPAuthorized(map<string, string>& mapHeaders)
return TimingResistantEqual(strUserPass, strRPCUserColonPass);
}
-void ErrorReply(std::ostream& stream, const Object& objError, const Value& id)
+void ErrorReply(std::ostream& stream, const UniValue& objError, const UniValue& id)
{
// Send error reply from json-rpc error object
int nStatus = HTTP_INTERNAL_SERVER_ERROR;
int code = find_value(objError, "code").get_int();
if (code == RPC_INVALID_REQUEST) nStatus = HTTP_BAD_REQUEST;
else if (code == RPC_METHOD_NOT_FOUND) nStatus = HTTP_NOT_FOUND;
- string strReply = JSONRPCReply(Value::null, objError, id);
+ string strReply = JSONRPCReply(NullUniValue, objError, id);
stream << HTTPReply(nStatus, strReply, false) << std::flush;
}
@@ -827,76 +827,76 @@ void RPCRunLater(const std::string& name, boost::function<void(void)> func, int6
class JSONRequest
{
public:
- Value id;
+ UniValue id;
string strMethod;
- Array params;
+ UniValue params;
- JSONRequest() { id = Value::null; }
- void parse(const Value& valRequest);
+ JSONRequest() { id = NullUniValue; }
+ void parse(const UniValue& valRequest);
};
-void JSONRequest::parse(const Value& valRequest)
+void JSONRequest::parse(const UniValue& valRequest)
{
// Parse request
- if (valRequest.type() != obj_type)
+ if (!valRequest.isObject())
throw JSONRPCError(RPC_INVALID_REQUEST, "Invalid Request object");
- const Object& request = valRequest.get_obj();
+ const UniValue& request = valRequest.get_obj();
// Parse id now so errors from here on will have the id
id = find_value(request, "id");
// Parse method
- Value valMethod = find_value(request, "method");
- if (valMethod.type() == null_type)
+ UniValue valMethod = find_value(request, "method");
+ if (valMethod.isNull())
throw JSONRPCError(RPC_INVALID_REQUEST, "Missing method");
- if (valMethod.type() != str_type)
+ if (!valMethod.isStr())
throw JSONRPCError(RPC_INVALID_REQUEST, "Method must be a string");
strMethod = valMethod.get_str();
if (strMethod != "getblocktemplate")
LogPrint("rpc", "ThreadRPCServer method=%s\n", SanitizeString(strMethod));
// Parse params
- Value valParams = find_value(request, "params");
- if (valParams.type() == array_type)
+ UniValue valParams = find_value(request, "params");
+ if (valParams.isArray())
params = valParams.get_array();
- else if (valParams.type() == null_type)
- params = Array();
+ else if (valParams.isNull())
+ params = UniValue(UniValue::VARR);
else
throw JSONRPCError(RPC_INVALID_REQUEST, "Params must be an array");
}
-static Object JSONRPCExecOne(const Value& req)
+static UniValue JSONRPCExecOne(const UniValue& req)
{
- Object rpc_result;
+ UniValue rpc_result(UniValue::VOBJ);
JSONRequest jreq;
try {
jreq.parse(req);
- Value result = tableRPC.execute(jreq.strMethod, jreq.params);
- rpc_result = JSONRPCReplyObj(result, Value::null, jreq.id);
+ UniValue result = tableRPC.execute(jreq.strMethod, jreq.params);
+ rpc_result = JSONRPCReplyObj(result, NullUniValue, jreq.id);
}
- catch (const Object& objError)
+ catch (const UniValue& objError)
{
- rpc_result = JSONRPCReplyObj(Value::null, objError, jreq.id);
+ rpc_result = JSONRPCReplyObj(NullUniValue, objError, jreq.id);
}
catch (const std::exception& e)
{
- rpc_result = JSONRPCReplyObj(Value::null,
+ rpc_result = JSONRPCReplyObj(NullUniValue,
JSONRPCError(RPC_PARSE_ERROR, e.what()), jreq.id);
}
return rpc_result;
}
-static string JSONRPCExecBatch(const Array& vReq)
+static string JSONRPCExecBatch(const UniValue& vReq)
{
- Array ret;
+ UniValue ret(UniValue::VARR);
for (unsigned int reqIdx = 0; reqIdx < vReq.size(); reqIdx++)
ret.push_back(JSONRPCExecOne(vReq[reqIdx]));
- return write_string(Value(ret), false) + "\n";
+ return ret.write() + "\n";
}
static bool HTTPReq_JSONRPC(AcceptedConnection *conn,
@@ -915,8 +915,8 @@ static bool HTTPReq_JSONRPC(AcceptedConnection *conn,
{
LogPrintf("ThreadRPCServer incorrect password attempt from %s\n", conn->peer_address_to_string());
/* Deter brute-forcing
- If this results in a DoS the user really
- shouldn't have their RPC port exposed. */
+ We don't support exposing the RPC port, so this shouldn't result
+ in a DoS. */
MilliSleep(250);
conn->stream() << HTTPError(HTTP_UNAUTHORIZED, false) << std::flush;
@@ -927,8 +927,8 @@ static bool HTTPReq_JSONRPC(AcceptedConnection *conn,
try
{
// Parse request
- Value valRequest;
- if (!read_string(strRequest, valRequest))
+ UniValue valRequest;
+ if (!valRequest.read(strRequest))
throw JSONRPCError(RPC_PARSE_ERROR, "Parse error");
// Return immediately if in warmup
@@ -941,23 +941,23 @@ static bool HTTPReq_JSONRPC(AcceptedConnection *conn,
string strReply;
// singleton request
- if (valRequest.type() == obj_type) {
+ if (valRequest.isObject()) {
jreq.parse(valRequest);
- Value result = tableRPC.execute(jreq.strMethod, jreq.params);
+ UniValue result = tableRPC.execute(jreq.strMethod, jreq.params);
// Send reply
- strReply = JSONRPCReply(result, Value::null, jreq.id);
+ strReply = JSONRPCReply(result, NullUniValue, jreq.id);
// array of requests
- } else if (valRequest.type() == array_type)
+ } else if (valRequest.isArray())
strReply = JSONRPCExecBatch(valRequest.get_array());
else
throw JSONRPCError(RPC_PARSE_ERROR, "Top-level object parse error");
conn->stream() << HTTPReplyHeader(HTTP_OK, fRun, strReply.size()) << strReply << std::flush;
}
- catch (const Object& objError)
+ catch (const UniValue& objError)
{
ErrorReply(conn->stream(), objError, jreq.id);
return false;
@@ -997,7 +997,7 @@ void ServiceConnection(AcceptedConnection *conn)
// Process via HTTP REST API
} else if (strURI.substr(0, 6) == "/rest/" && GetBoolArg("-rest", false)) {
- if (!HTTPReq_REST(conn, strURI, mapHeaders, fRun))
+ if (!HTTPReq_REST(conn, strURI, strRequest, mapHeaders, fRun))
break;
} else {
@@ -1007,7 +1007,7 @@ void ServiceConnection(AcceptedConnection *conn)
}
}
-json_spirit::Value CRPCTable::execute(const std::string &strMethod, const json_spirit::Array &params) const
+UniValue CRPCTable::execute(const std::string &strMethod, const UniValue &params) const
{
// Find method
const CRPCCommand *pcmd = tableRPC[strMethod];
@@ -1029,11 +1029,13 @@ json_spirit::Value CRPCTable::execute(const std::string &strMethod, const json_s
g_rpcSignals.PostCommand(*pcmd);
}
-std::string HelpExampleCli(string methodname, string args){
+std::string HelpExampleCli(const std::string& methodname, const std::string& args)
+{
return "> bitcoin-cli " + methodname + " " + args + "\n";
}
-std::string HelpExampleRpc(string methodname, string args){
+std::string HelpExampleRpc(const std::string& methodname, const std::string& args)
+{
return "> curl --user myusername --data-binary '{\"jsonrpc\": \"1.0\", \"id\":\"curltest\", "
"\"method\": \"" + methodname + "\", \"params\": [" + args + "] }' -H 'content-type: text/plain;' http://127.0.0.1:8332/\n";
}
diff --git a/src/rpcserver.h b/src/rpcserver.h
index e7aaed8bdf..89d3980223 100644
--- a/src/rpcserver.h
+++ b/src/rpcserver.h
@@ -15,9 +15,9 @@
#include <stdint.h>
#include <string>
-#include "json/json_spirit_reader_template.h"
-#include "json/json_spirit_utils.h"
-#include "json/json_spirit_writer_template.h"
+#include <boost/function.hpp>
+
+#include "univalue/univalue.h"
class CRPCCommand;
@@ -55,7 +55,7 @@ void StopRPCThreads();
/** Query whether RPC is running */
bool IsRPCRunning();
-/**
+/**
* Set the RPC warmup status. When this is done, all RPC calls will error out
* immediately with RPC_IN_WARMUP.
*/
@@ -71,14 +71,15 @@ bool RPCIsInWarmup(std::string *statusOut);
* the right number of arguments are passed, just that any passed are the correct type.
* Use like: RPCTypeCheck(params, boost::assign::list_of(str_type)(int_type)(obj_type));
*/
-void RPCTypeCheck(const json_spirit::Array& params,
- const std::list<json_spirit::Value_type>& typesExpected, bool fAllowNull=false);
-/**
- * Check for expected keys/value types in an Object.
- * Use like: RPCTypeCheck(object, boost::assign::map_list_of("name", str_type)("value", int_type));
- */
-void RPCTypeCheck(const json_spirit::Object& o,
- const std::map<std::string, json_spirit::Value_type>& typesExpected, bool fAllowNull=false);
+void RPCTypeCheck(const UniValue& params,
+ const std::list<UniValue::VType>& typesExpected, bool fAllowNull=false);
+
+/*
+ Check for expected keys/value types in an Object.
+ Use like: RPCTypeCheckObj(object, boost::assign::map_list_of("name", str_type)("value", int_type));
+*/
+void RPCTypeCheckObj(const UniValue& o,
+ const std::map<std::string, UniValue::VType>& typesExpected, bool fAllowNull=false);
/**
* Run func nSeconds from now. Uses boost deadline timers.
@@ -89,7 +90,7 @@ void RPCRunLater(const std::string& name, boost::function<void(void)> func, int6
//! Convert boost::asio address to CNetAddr
extern CNetAddr BoostAsioToCNetAddr(boost::asio::ip::address address);
-typedef json_spirit::Value(*rpcfn_type)(const json_spirit::Array& params, bool fHelp);
+typedef UniValue(*rpcfn_type)(const UniValue& params, bool fHelp);
class CRPCCommand
{
@@ -98,7 +99,6 @@ public:
std::string name;
rpcfn_type actor;
bool okSafeMode;
- bool reqWallet;
};
/**
@@ -110,17 +110,17 @@ private:
std::map<std::string, const CRPCCommand*> mapCommands;
public:
CRPCTable();
- const CRPCCommand* operator[](std::string name) const;
- std::string help(std::string name) const;
+ const CRPCCommand* operator[](const std::string& name) const;
+ std::string help(const std::string& name) const;
/**
* Execute a method.
* @param method Method to execute
- * @param params Array of arguments (JSON objects)
+ * @param params UniValue Array of arguments (JSON objects)
* @returns Result of the call.
- * @throws an exception (json_spirit::Value) when an error happens.
+ * @throws an exception (UniValue) when an error happens.
*/
- json_spirit::Value execute(const std::string &method, const json_spirit::Array &params) const;
+ UniValue execute(const std::string &method, const UniValue &params) const;
};
extern const CRPCTable tableRPC;
@@ -129,115 +129,124 @@ extern const CRPCTable tableRPC;
* Utilities: convert hex-encoded Values
* (throws error if not hex).
*/
-extern uint256 ParseHashV(const json_spirit::Value& v, std::string strName);
-extern uint256 ParseHashO(const json_spirit::Object& o, std::string strKey);
-extern std::vector<unsigned char> ParseHexV(const json_spirit::Value& v, std::string strName);
-extern std::vector<unsigned char> ParseHexO(const json_spirit::Object& o, std::string strKey);
+extern uint256 ParseHashV(const UniValue& v, std::string strName);
+extern uint256 ParseHashO(const UniValue& o, std::string strKey);
+extern std::vector<unsigned char> ParseHexV(const UniValue& v, std::string strName);
+extern std::vector<unsigned char> ParseHexO(const UniValue& o, std::string strKey);
extern void InitRPCMining();
extern void ShutdownRPCMining();
extern int64_t nWalletUnlockTime;
-extern CAmount AmountFromValue(const json_spirit::Value& value);
-extern json_spirit::Value ValueFromAmount(const CAmount& amount);
+extern CAmount AmountFromValue(const UniValue& value);
+extern UniValue ValueFromAmount(const CAmount& amount);
extern double GetDifficulty(const CBlockIndex* blockindex = NULL);
extern std::string HelpRequiringPassphrase();
-extern std::string HelpExampleCli(std::string methodname, std::string args);
-extern std::string HelpExampleRpc(std::string methodname, std::string args);
+extern std::string HelpExampleCli(const std::string& methodname, const std::string& args);
+extern std::string HelpExampleRpc(const std::string& methodname, const std::string& args);
extern void EnsureWalletIsUnlocked();
-extern json_spirit::Value getconnectioncount(const json_spirit::Array& params, bool fHelp); // in rpcnet.cpp
-extern json_spirit::Value getpeerinfo(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value ping(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value addnode(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getaddednodeinfo(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getnettotals(const json_spirit::Array& params, bool fHelp);
-
-extern json_spirit::Value dumpprivkey(const json_spirit::Array& params, bool fHelp); // in rpcdump.cpp
-extern json_spirit::Value importprivkey(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value importaddress(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value dumpwallet(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value importwallet(const json_spirit::Array& params, bool fHelp);
-
-extern json_spirit::Value getgenerate(const json_spirit::Array& params, bool fHelp); // in rpcmining.cpp
-extern json_spirit::Value setgenerate(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value generate(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getnetworkhashps(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getmininginfo(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value prioritisetransaction(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getblocktemplate(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value submitblock(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value estimatefee(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value estimatepriority(const json_spirit::Array& params, bool fHelp);
-
-extern json_spirit::Value getnewaddress(const json_spirit::Array& params, bool fHelp); // in rpcwallet.cpp
-extern json_spirit::Value getaccountaddress(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getrawchangeaddress(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value setaccount(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getaccount(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getaddressesbyaccount(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value sendtoaddress(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value signmessage(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value verifymessage(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getreceivedbyaddress(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getreceivedbyaccount(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getbalance(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getunconfirmedbalance(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value movecmd(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value sendfrom(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value sendmany(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value addmultisigaddress(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value createmultisig(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value listreceivedbyaddress(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value listreceivedbyaccount(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value listtransactions(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value listaddressgroupings(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value listaccounts(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value listsinceblock(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value gettransaction(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value backupwallet(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value keypoolrefill(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value walletpassphrase(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value walletpassphrasechange(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value walletlock(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value encryptwallet(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value validateaddress(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getinfo(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getwalletinfo(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getblockchaininfo(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getnetworkinfo(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value setmocktime(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value resendwallettransactions(const json_spirit::Array& params, bool fHelp);
-
-extern json_spirit::Value getrawtransaction(const json_spirit::Array& params, bool fHelp); // in rcprawtransaction.cpp
-extern json_spirit::Value listunspent(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value lockunspent(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value listlockunspent(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value createrawtransaction(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value decoderawtransaction(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value decodescript(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value signrawtransaction(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value sendrawtransaction(const json_spirit::Array& params, bool fHelp);
-
-extern json_spirit::Value getblockcount(const json_spirit::Array& params, bool fHelp); // in rpcblockchain.cpp
-extern json_spirit::Value getbestblockhash(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getdifficulty(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value settxfee(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getmempoolinfo(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getrawmempool(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getblockhash(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getblock(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value gettxoutsetinfo(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value gettxout(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value verifychain(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value getchaintips(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value invalidateblock(const json_spirit::Array& params, bool fHelp);
-extern json_spirit::Value reconsiderblock(const json_spirit::Array& params, bool fHelp);
+extern UniValue getconnectioncount(const UniValue& params, bool fHelp); // in rpcnet.cpp
+extern UniValue getpeerinfo(const UniValue& params, bool fHelp);
+extern UniValue ping(const UniValue& params, bool fHelp);
+extern UniValue addnode(const UniValue& params, bool fHelp);
+extern UniValue disconnectnode(const UniValue& params, bool fHelp);
+extern UniValue getaddednodeinfo(const UniValue& params, bool fHelp);
+extern UniValue getnettotals(const UniValue& params, bool fHelp);
+extern UniValue setban(const UniValue& params, bool fHelp);
+extern UniValue listbanned(const UniValue& params, bool fHelp);
+extern UniValue clearbanned(const UniValue& params, bool fHelp);
+
+extern UniValue dumpprivkey(const UniValue& params, bool fHelp); // in rpcdump.cpp
+extern UniValue importprivkey(const UniValue& params, bool fHelp);
+extern UniValue importaddress(const UniValue& params, bool fHelp);
+extern UniValue dumpwallet(const UniValue& params, bool fHelp);
+extern UniValue importwallet(const UniValue& params, bool fHelp);
+
+extern UniValue getgenerate(const UniValue& params, bool fHelp); // in rpcmining.cpp
+extern UniValue setgenerate(const UniValue& params, bool fHelp);
+extern UniValue generate(const UniValue& params, bool fHelp);
+extern UniValue getnetworkhashps(const UniValue& params, bool fHelp);
+extern UniValue getmininginfo(const UniValue& params, bool fHelp);
+extern UniValue prioritisetransaction(const UniValue& params, bool fHelp);
+extern UniValue getblocktemplate(const UniValue& params, bool fHelp);
+extern UniValue submitblock(const UniValue& params, bool fHelp);
+extern UniValue estimatefee(const UniValue& params, bool fHelp);
+extern UniValue estimatepriority(const UniValue& params, bool fHelp);
+
+extern UniValue getnewaddress(const UniValue& params, bool fHelp); // in rpcwallet.cpp
+extern UniValue getaccountaddress(const UniValue& params, bool fHelp);
+extern UniValue getrawchangeaddress(const UniValue& params, bool fHelp);
+extern UniValue setaccount(const UniValue& params, bool fHelp);
+extern UniValue getaccount(const UniValue& params, bool fHelp);
+extern UniValue getaddressesbyaccount(const UniValue& params, bool fHelp);
+extern UniValue sendtoaddress(const UniValue& params, bool fHelp);
+extern UniValue signmessage(const UniValue& params, bool fHelp);
+extern UniValue verifymessage(const UniValue& params, bool fHelp);
+extern UniValue getreceivedbyaddress(const UniValue& params, bool fHelp);
+extern UniValue getreceivedbyaccount(const UniValue& params, bool fHelp);
+extern UniValue getbalance(const UniValue& params, bool fHelp);
+extern UniValue getunconfirmedbalance(const UniValue& params, bool fHelp);
+extern UniValue movecmd(const UniValue& params, bool fHelp);
+extern UniValue sendfrom(const UniValue& params, bool fHelp);
+extern UniValue sendmany(const UniValue& params, bool fHelp);
+extern UniValue addmultisigaddress(const UniValue& params, bool fHelp);
+extern UniValue createmultisig(const UniValue& params, bool fHelp);
+extern UniValue listreceivedbyaddress(const UniValue& params, bool fHelp);
+extern UniValue listreceivedbyaccount(const UniValue& params, bool fHelp);
+extern UniValue listtransactions(const UniValue& params, bool fHelp);
+extern UniValue listaddressgroupings(const UniValue& params, bool fHelp);
+extern UniValue listaccounts(const UniValue& params, bool fHelp);
+extern UniValue listsinceblock(const UniValue& params, bool fHelp);
+extern UniValue gettransaction(const UniValue& params, bool fHelp);
+extern UniValue backupwallet(const UniValue& params, bool fHelp);
+extern UniValue keypoolrefill(const UniValue& params, bool fHelp);
+extern UniValue walletpassphrase(const UniValue& params, bool fHelp);
+extern UniValue walletpassphrasechange(const UniValue& params, bool fHelp);
+extern UniValue walletlock(const UniValue& params, bool fHelp);
+extern UniValue encryptwallet(const UniValue& params, bool fHelp);
+extern UniValue validateaddress(const UniValue& params, bool fHelp);
+extern UniValue getinfo(const UniValue& params, bool fHelp);
+extern UniValue getwalletinfo(const UniValue& params, bool fHelp);
+extern UniValue getblockchaininfo(const UniValue& params, bool fHelp);
+extern UniValue getnetworkinfo(const UniValue& params, bool fHelp);
+extern UniValue setmocktime(const UniValue& params, bool fHelp);
+extern UniValue resendwallettransactions(const UniValue& params, bool fHelp);
+
+extern UniValue getrawtransaction(const UniValue& params, bool fHelp); // in rcprawtransaction.cpp
+extern UniValue listunspent(const UniValue& params, bool fHelp);
+extern UniValue lockunspent(const UniValue& params, bool fHelp);
+extern UniValue listlockunspent(const UniValue& params, bool fHelp);
+extern UniValue createrawtransaction(const UniValue& params, bool fHelp);
+extern UniValue decoderawtransaction(const UniValue& params, bool fHelp);
+extern UniValue decodescript(const UniValue& params, bool fHelp);
+extern UniValue fundrawtransaction(const UniValue& params, bool fHelp);
+extern UniValue signrawtransaction(const UniValue& params, bool fHelp);
+extern UniValue sendrawtransaction(const UniValue& params, bool fHelp);
+extern UniValue gettxoutproof(const UniValue& params, bool fHelp);
+extern UniValue verifytxoutproof(const UniValue& params, bool fHelp);
+
+extern UniValue getblockcount(const UniValue& params, bool fHelp); // in rpcblockchain.cpp
+extern UniValue getbestblockhash(const UniValue& params, bool fHelp);
+extern UniValue getdifficulty(const UniValue& params, bool fHelp);
+extern UniValue settxfee(const UniValue& params, bool fHelp);
+extern UniValue getmempoolinfo(const UniValue& params, bool fHelp);
+extern UniValue getrawmempool(const UniValue& params, bool fHelp);
+extern UniValue getblockhash(const UniValue& params, bool fHelp);
+extern UniValue getblockheader(const UniValue& params, bool fHelp);
+extern UniValue getblock(const UniValue& params, bool fHelp);
+extern UniValue gettxoutsetinfo(const UniValue& params, bool fHelp);
+extern UniValue gettxout(const UniValue& params, bool fHelp);
+extern UniValue verifychain(const UniValue& params, bool fHelp);
+extern UniValue getchaintips(const UniValue& params, bool fHelp);
+extern UniValue invalidateblock(const UniValue& params, bool fHelp);
+extern UniValue reconsiderblock(const UniValue& params, bool fHelp);
// in rest.cpp
extern bool HTTPReq_REST(AcceptedConnection *conn,
const std::string& strURI,
+ const std::string& strRequest,
const std::map<std::string, std::string>& mapHeaders,
bool fRun);
diff --git a/src/scheduler.cpp b/src/scheduler.cpp
new file mode 100644
index 0000000000..d5bb588b71
--- /dev/null
+++ b/src/scheduler.cpp
@@ -0,0 +1,128 @@
+// Copyright (c) 2015 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 "scheduler.h"
+
+#include <assert.h>
+#include <boost/bind.hpp>
+#include <utility>
+
+CScheduler::CScheduler() : nThreadsServicingQueue(0), stopRequested(false), stopWhenEmpty(false)
+{
+}
+
+CScheduler::~CScheduler()
+{
+ assert(nThreadsServicingQueue == 0);
+}
+
+
+#if BOOST_VERSION < 105000
+static boost::system_time toPosixTime(const boost::chrono::system_clock::time_point& t)
+{
+ return boost::posix_time::from_time_t(boost::chrono::system_clock::to_time_t(t));
+}
+#endif
+
+void CScheduler::serviceQueue()
+{
+ boost::unique_lock<boost::mutex> lock(newTaskMutex);
+ ++nThreadsServicingQueue;
+
+ // newTaskMutex is locked throughout this loop EXCEPT
+ // when the thread is waiting or when the user's function
+ // is called.
+ while (!shouldStop()) {
+ try {
+ while (!shouldStop() && taskQueue.empty()) {
+ // Wait until there is something to do.
+ newTaskScheduled.wait(lock);
+ }
+
+ // Wait until either there is a new task, or until
+ // the time of the first item on the queue:
+
+// wait_until needs boost 1.50 or later; older versions have timed_wait:
+#if BOOST_VERSION < 105000
+ while (!shouldStop() && !taskQueue.empty() &&
+ newTaskScheduled.timed_wait(lock, toPosixTime(taskQueue.begin()->first))) {
+ // Keep waiting until timeout
+ }
+#else
+ // Some boost versions have a conflicting overload of wait_until that returns void.
+ // Explicitly use a template here to avoid hitting that overload.
+ while (!shouldStop() && !taskQueue.empty() &&
+ newTaskScheduled.wait_until<>(lock, taskQueue.begin()->first) != boost::cv_status::timeout) {
+ // Keep waiting until timeout
+ }
+#endif
+ // If there are multiple threads, the queue can empty while we're waiting (another
+ // thread may service the task we were waiting on).
+ if (shouldStop() || taskQueue.empty())
+ continue;
+
+ Function f = taskQueue.begin()->second;
+ taskQueue.erase(taskQueue.begin());
+
+ // Unlock before calling f, so it can reschedule itself or another task
+ // without deadlocking:
+ lock.unlock();
+ f();
+ lock.lock();
+ } catch (...) {
+ --nThreadsServicingQueue;
+ throw;
+ }
+ }
+ --nThreadsServicingQueue;
+}
+
+void CScheduler::stop(bool drain)
+{
+ {
+ boost::unique_lock<boost::mutex> lock(newTaskMutex);
+ if (drain)
+ stopWhenEmpty = true;
+ else
+ stopRequested = true;
+ }
+ newTaskScheduled.notify_all();
+}
+
+void CScheduler::schedule(CScheduler::Function f, boost::chrono::system_clock::time_point t)
+{
+ {
+ boost::unique_lock<boost::mutex> lock(newTaskMutex);
+ taskQueue.insert(std::make_pair(t, f));
+ }
+ newTaskScheduled.notify_one();
+}
+
+void CScheduler::scheduleFromNow(CScheduler::Function f, int64_t deltaSeconds)
+{
+ schedule(f, boost::chrono::system_clock::now() + boost::chrono::seconds(deltaSeconds));
+}
+
+static void Repeat(CScheduler* s, CScheduler::Function f, int64_t deltaSeconds)
+{
+ f();
+ s->scheduleFromNow(boost::bind(&Repeat, s, f, deltaSeconds), deltaSeconds);
+}
+
+void CScheduler::scheduleEvery(CScheduler::Function f, int64_t deltaSeconds)
+{
+ scheduleFromNow(boost::bind(&Repeat, this, f, deltaSeconds), deltaSeconds);
+}
+
+size_t CScheduler::getQueueInfo(boost::chrono::system_clock::time_point &first,
+ boost::chrono::system_clock::time_point &last) const
+{
+ boost::unique_lock<boost::mutex> lock(newTaskMutex);
+ size_t result = taskQueue.size();
+ if (!taskQueue.empty()) {
+ first = taskQueue.begin()->first;
+ last = taskQueue.rbegin()->first;
+ }
+ return result;
+}
diff --git a/src/scheduler.h b/src/scheduler.h
new file mode 100644
index 0000000000..436659e58b
--- /dev/null
+++ b/src/scheduler.h
@@ -0,0 +1,83 @@
+// Copyright (c) 2015 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_SCHEDULER_H
+#define BITCOIN_SCHEDULER_H
+
+//
+// NOTE:
+// boost::thread / boost::function / boost::chrono should be ported to
+// std::thread / std::function / std::chrono when we support C++11.
+//
+#include <boost/function.hpp>
+#include <boost/chrono/chrono.hpp>
+#include <boost/thread.hpp>
+#include <map>
+
+//
+// Simple class for background tasks that should be run
+// periodically or once "after a while"
+//
+// Usage:
+//
+// CScheduler* s = new CScheduler();
+// s->scheduleFromNow(doSomething, 11); // Assuming a: void doSomething() { }
+// s->scheduleFromNow(boost::bind(Class::func, this, argument), 3);
+// boost::thread* t = new boost::thread(boost::bind(CScheduler::serviceQueue, s));
+//
+// ... then at program shutdown, clean up the thread running serviceQueue:
+// t->interrupt();
+// t->join();
+// delete t;
+// delete s; // Must be done after thread is interrupted/joined.
+//
+
+class CScheduler
+{
+public:
+ CScheduler();
+ ~CScheduler();
+
+ typedef boost::function<void(void)> Function;
+
+ // Call func at/after time t
+ void schedule(Function f, boost::chrono::system_clock::time_point t);
+
+ // Convenience method: call f once deltaSeconds from now
+ void scheduleFromNow(Function f, int64_t deltaSeconds);
+
+ // Another convenience method: call f approximately
+ // every deltaSeconds forever, starting deltaSeconds from now.
+ // To be more precise: every time f is finished, it
+ // is rescheduled to run deltaSeconds later. If you
+ // need more accurate scheduling, don't use this method.
+ void scheduleEvery(Function f, int64_t deltaSeconds);
+
+ // To keep things as simple as possible, there is no unschedule.
+
+ // Services the queue 'forever'. Should be run in a thread,
+ // and interrupted using boost::interrupt_thread
+ void serviceQueue();
+
+ // Tell any threads running serviceQueue to stop as soon as they're
+ // done servicing whatever task they're currently servicing (drain=false)
+ // or when there is no work left to be done (drain=true)
+ void stop(bool drain=false);
+
+ // Returns number of tasks waiting to be serviced,
+ // and first and last task times
+ size_t getQueueInfo(boost::chrono::system_clock::time_point &first,
+ boost::chrono::system_clock::time_point &last) const;
+
+private:
+ std::multimap<boost::chrono::system_clock::time_point, Function> taskQueue;
+ boost::condition_variable newTaskScheduled;
+ mutable boost::mutex newTaskMutex;
+ int nThreadsServicingQueue;
+ bool stopRequested;
+ bool stopWhenEmpty;
+ bool shouldStop() { return stopRequested || (stopWhenEmpty && taskQueue.empty()); }
+};
+
+#endif
diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp
index 84a7432fdb..0b78fdf5a8 100644
--- a/src/script/interpreter.cpp
+++ b/src/script/interpreter.cpp
@@ -335,9 +335,51 @@ bool EvalScript(vector<vector<unsigned char> >& stack, const CScript& script, un
// Control
//
case OP_NOP:
- break;
+ break;
+
+ case OP_CHECKLOCKTIMEVERIFY:
+ {
+ if (!(flags & SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY)) {
+ // not enabled; treat as a NOP2
+ if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS) {
+ return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS);
+ }
+ break;
+ }
+
+ if (stack.size() < 1)
+ return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
+
+ // Note that elsewhere numeric opcodes are limited to
+ // operands in the range -2**31+1 to 2**31-1, however it is
+ // legal for opcodes to produce results exceeding that
+ // range. This limitation is implemented by CScriptNum's
+ // default 4-byte limit.
+ //
+ // If we kept to that limit we'd have a year 2038 problem,
+ // even though the nLockTime field in transactions
+ // themselves is uint32 which only becomes meaningless
+ // after the year 2106.
+ //
+ // Thus as a special case we tell CScriptNum to accept up
+ // to 5-byte bignums, which are good until 2**39-1, well
+ // beyond the 2**32-1 limit of the nLockTime field itself.
+ const CScriptNum nLockTime(stacktop(-1), fRequireMinimal, 5);
+
+ // In the rare event that the argument may be < 0 due to
+ // some arithmetic being done first, you can always use
+ // 0 MAX CHECKLOCKTIMEVERIFY.
+ if (nLockTime < 0)
+ return set_error(serror, SCRIPT_ERR_NEGATIVE_LOCKTIME);
+
+ // Actually compare the specified lock time with the transaction.
+ if (!checker.CheckLockTime(nLockTime))
+ return set_error(serror, SCRIPT_ERR_UNSATISFIED_LOCKTIME);
+
+ break;
+ }
- case OP_NOP1: case OP_NOP2: case OP_NOP3: case OP_NOP4: case OP_NOP5:
+ case OP_NOP1: case OP_NOP3: case OP_NOP4: case OP_NOP5:
case OP_NOP6: case OP_NOP7: case OP_NOP8: case OP_NOP9: case OP_NOP10:
{
if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS)
@@ -1084,6 +1126,43 @@ bool TransactionSignatureChecker::CheckSig(const vector<unsigned char>& vchSigIn
return true;
}
+bool TransactionSignatureChecker::CheckLockTime(const CScriptNum& nLockTime) const
+{
+ // There are two times of nLockTime: lock-by-blockheight
+ // and lock-by-blocktime, distinguished by whether
+ // nLockTime < LOCKTIME_THRESHOLD.
+ //
+ // We want to compare apples to apples, so fail the script
+ // unless the type of nLockTime being tested is the same as
+ // the nLockTime in the transaction.
+ if (!(
+ (txTo->nLockTime < LOCKTIME_THRESHOLD && nLockTime < LOCKTIME_THRESHOLD) ||
+ (txTo->nLockTime >= LOCKTIME_THRESHOLD && nLockTime >= LOCKTIME_THRESHOLD)
+ ))
+ return false;
+
+ // Now that we know we're comparing apples-to-apples, the
+ // comparison is a simple numeric one.
+ if (nLockTime > (int64_t)txTo->nLockTime)
+ return false;
+
+ // Finally the nLockTime feature can be disabled and thus
+ // CHECKLOCKTIMEVERIFY bypassed if every txin has been
+ // finalized by setting nSequence to maxint. The
+ // transaction would be allowed into the blockchain, making
+ // the opcode ineffective.
+ //
+ // Testing if this vin is not final is sufficient to
+ // prevent this condition. Alternatively we could test all
+ // inputs, but testing just this input minimizes the data
+ // required to prove correct CHECKLOCKTIMEVERIFY execution.
+ if (txTo->vin[nIn].IsFinal())
+ return false;
+
+ return true;
+}
+
+
bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror)
{
set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR);
diff --git a/src/script/interpreter.h b/src/script/interpreter.h
index fc64438f68..35d572f0ad 100644
--- a/src/script/interpreter.h
+++ b/src/script/interpreter.h
@@ -76,6 +76,11 @@ enum
// (softfork safe, BIP62 rule 6)
// Note: CLEANSTACK should never be used without P2SH.
SCRIPT_VERIFY_CLEANSTACK = (1U << 8),
+
+ // Verify CHECKLOCKTIMEVERIFY
+ //
+ // See BIP65 for details.
+ SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9),
};
uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType);
@@ -88,6 +93,11 @@ public:
return false;
}
+ virtual bool CheckLockTime(const CScriptNum& nLockTime) const
+ {
+ return false;
+ }
+
virtual ~BaseSignatureChecker() {}
};
@@ -103,6 +113,7 @@ protected:
public:
TransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn) : txTo(txToIn), nIn(nInIn) {}
bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode) const;
+ bool CheckLockTime(const CScriptNum& nLockTime) const;
};
class MutableTransactionSignatureChecker : public TransactionSignatureChecker
diff --git a/src/script/script.h b/src/script/script.h
index ed456f5c5a..e39ca57f4f 100644
--- a/src/script/script.h
+++ b/src/script/script.h
@@ -6,6 +6,8 @@
#ifndef BITCOIN_SCRIPT_SCRIPT_H
#define BITCOIN_SCRIPT_SCRIPT_H
+#include "crypto/common.h"
+
#include <assert.h>
#include <climits>
#include <limits>
@@ -14,10 +16,13 @@
#include <string.h>
#include <string>
#include <vector>
-#include "crypto/common.h"
static const unsigned int MAX_SCRIPT_ELEMENT_SIZE = 520; // bytes
+// Threshold for nLockTime: below this value it is interpreted as block number,
+// otherwise as UNIX timestamp.
+static const unsigned int LOCKTIME_THRESHOLD = 500000000; // Tue Nov 5 00:53:20 1985 UTC
+
template <typename T>
std::vector<unsigned char> ToByteVector(const T& in)
{
@@ -150,6 +155,7 @@ enum opcodetype
// expansion
OP_NOP1 = 0xb0,
OP_NOP2 = 0xb1,
+ OP_CHECKLOCKTIMEVERIFY = OP_NOP2,
OP_NOP3 = 0xb2,
OP_NOP4 = 0xb3,
OP_NOP5 = 0xb4,
@@ -195,7 +201,10 @@ public:
m_value = n;
}
- explicit CScriptNum(const std::vector<unsigned char>& vch, bool fRequireMinimal)
+ static const size_t nDefaultMaxNumSize = 4;
+
+ explicit CScriptNum(const std::vector<unsigned char>& vch, bool fRequireMinimal,
+ const size_t nMaxNumSize = nDefaultMaxNumSize)
{
if (vch.size() > nMaxNumSize) {
throw scriptnum_error("script number overflow");
@@ -318,8 +327,6 @@ public:
return result;
}
- static const size_t nMaxNumSize = 4;
-
private:
static int64_t set_vch(const std::vector<unsigned char>& vch)
{
@@ -602,4 +609,13 @@ public:
}
};
+class CReserveScript
+{
+public:
+ CScript reserveScript;
+ virtual void KeepScript() {}
+ CReserveScript() {}
+ virtual ~CReserveScript() {}
+};
+
#endif // BITCOIN_SCRIPT_SCRIPT_H
diff --git a/src/script/script_error.cpp b/src/script/script_error.cpp
index d8ecfde1d7..f1aa1fb408 100644
--- a/src/script/script_error.cpp
+++ b/src/script/script_error.cpp
@@ -47,6 +47,10 @@ const char* ScriptErrorString(const ScriptError serror)
return "OP_RETURN was encountered";
case SCRIPT_ERR_UNBALANCED_CONDITIONAL:
return "Invalid OP_IF construction";
+ case SCRIPT_ERR_NEGATIVE_LOCKTIME:
+ return "Negative locktime";
+ case SCRIPT_ERR_UNSATISFIED_LOCKTIME:
+ return "Locktime requirement not satisfied";
case SCRIPT_ERR_SIG_HASHTYPE:
return "Signature hash type missing or not understood";
case SCRIPT_ERR_SIG_DER:
diff --git a/src/script/script_error.h b/src/script/script_error.h
index 6365680b29..bb10b8a293 100644
--- a/src/script/script_error.h
+++ b/src/script/script_error.h
@@ -35,6 +35,10 @@ typedef enum ScriptError_t
SCRIPT_ERR_INVALID_ALTSTACK_OPERATION,
SCRIPT_ERR_UNBALANCED_CONDITIONAL,
+ /* OP_CHECKLOCKTIMEVERIFY */
+ SCRIPT_ERR_NEGATIVE_LOCKTIME,
+ SCRIPT_ERR_UNSATISFIED_LOCKTIME,
+
/* BIP62 */
SCRIPT_ERR_SIG_HASHTYPE,
SCRIPT_ERR_SIG_DER,
diff --git a/src/script/sign.cpp b/src/script/sign.cpp
index eab629cd91..4543ca303f 100644
--- a/src/script/sign.cpp
+++ b/src/script/sign.cpp
@@ -275,3 +275,39 @@ CScript CombineSignatures(const CScript& scriptPubKey, const BaseSignatureChecke
return CombineSignatures(scriptPubKey, checker, txType, vSolutions, stack1, stack2);
}
+
+namespace {
+/** Dummy signature checker which accepts all signatures. */
+class DummySignatureChecker : public BaseSignatureChecker
+{
+public:
+ DummySignatureChecker() {}
+
+ bool CheckSig(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode) const
+ {
+ return true;
+ }
+};
+const DummySignatureChecker dummyChecker;
+}
+
+const BaseSignatureChecker& DummySignatureCreator::Checker() const
+{
+ return dummyChecker;
+}
+
+bool DummySignatureCreator::CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode) const
+{
+ // Create a dummy signature that is a valid DER-encoding
+ vchSig.assign(72, '\000');
+ vchSig[0] = 0x30;
+ vchSig[1] = 69;
+ vchSig[2] = 0x02;
+ vchSig[3] = 33;
+ vchSig[4] = 0x01;
+ vchSig[4 + 33] = 0x02;
+ vchSig[5 + 33] = 32;
+ vchSig[6 + 33] = 0x01;
+ vchSig[6 + 33 + 32] = SIGHASH_ALL;
+ return true;
+}
diff --git a/src/script/sign.h b/src/script/sign.h
index 0c4cf61e5e..13f45007dd 100644
--- a/src/script/sign.h
+++ b/src/script/sign.h
@@ -43,6 +43,14 @@ public:
bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode) const;
};
+/** A signature creator that just produces 72-byte empty signatyres. */
+class DummySignatureCreator : public BaseSignatureCreator {
+public:
+ DummySignatureCreator(const CKeyStore* keystoreIn) : BaseSignatureCreator(keystoreIn) {}
+ const BaseSignatureChecker& Checker() const;
+ bool CreateSig(std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode) const;
+};
+
/** Produce a script signature using a generic signature creator. */
bool ProduceSignature(const BaseSignatureCreator& creator, const CScript& scriptPubKey, CScript& scriptSig);
diff --git a/src/script/standard.h b/src/script/standard.h
index a8b0acc981..3b401dfe4f 100644
--- a/src/script/standard.h
+++ b/src/script/standard.h
@@ -50,7 +50,8 @@ static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY
SCRIPT_VERIFY_MINIMALDATA |
SCRIPT_VERIFY_NULLDUMMY |
SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS |
- SCRIPT_VERIFY_CLEANSTACK;
+ SCRIPT_VERIFY_CLEANSTACK |
+ SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY;
/** For convenience, standard but not mandatory verify flags. */
static const unsigned int STANDARD_NOT_MANDATORY_VERIFY_FLAGS = STANDARD_SCRIPT_VERIFY_FLAGS & ~MANDATORY_SCRIPT_VERIFY_FLAGS;
diff --git a/src/secp256k1/.gitignore b/src/secp256k1/.gitignore
index b9f7d243ec..076ff1295f 100644
--- a/src/secp256k1/.gitignore
+++ b/src/secp256k1/.gitignore
@@ -2,6 +2,7 @@ bench_inv
bench_sign
bench_verify
bench_recover
+bench_internal
tests
*.exe
*.so
diff --git a/src/secp256k1/.travis.yml b/src/secp256k1/.travis.yml
index 40f8dae23f..0d8089cfe4 100644
--- a/src/secp256k1/.travis.yml
+++ b/src/secp256k1/.travis.yml
@@ -1,14 +1,14 @@
language: c
+sudo: false
+addons:
+ apt:
+ packages: libgmp-dev
compiler:
- clang
- gcc
-install:
- - sudo apt-get install -qq libssl-dev
- - if [ "$BIGNUM" = "gmp" -o "$BIGNUM" = "auto" ]; then sudo apt-get install --no-install-recommends --no-upgrade -qq libgmp-dev; fi
- - if [ -n "$EXTRAPACKAGES" ]; then sudo apt-get update && sudo apt-get install --no-install-recommends --no-upgrade $EXTRAPACKAGES; fi
env:
global:
- - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no ASM=no BUILD=check EXTRAFLAGS= HOST= EXTRAPACKAGES=
+ - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no ASM=no BUILD=check EXTRAFLAGS= HOST=
matrix:
- SCALAR=32bit
- SCALAR=64bit
@@ -22,8 +22,35 @@ env:
- BIGNUM=no ENDOMORPHISM=yes
- BUILD=distcheck
- EXTRAFLAGS=CFLAGS=-DDETERMINISTIC
- - HOST=i686-linux-gnu EXTRAPACKAGES="gcc-multilib"
- - HOST=i686-linux-gnu EXTRAPACKAGES="gcc-multilib" ENDOMORPHISM=yes
+matrix:
+ fast_finish: true
+ include:
+ - compiler: clang
+ env: HOST=i686-linux-gnu ENDOMORPHISM=yes
+ addons:
+ apt:
+ packages:
+ - gcc-multilib
+ - libgmp-dev:i386
+ - compiler: clang
+ env: HOST=i686-linux-gnu
+ addons:
+ apt:
+ packages:
+ - gcc-multilib
+ - compiler: gcc
+ env: HOST=i686-linux-gnu ENDOMORPHISM=yes
+ addons:
+ apt:
+ packages:
+ - gcc-multilib
+ - compiler: gcc
+ env: HOST=i686-linux-gnu
+ addons:
+ apt:
+ packages:
+ - gcc-multilib
+ - libgmp-dev:i386
before_script: ./autogen.sh
script:
- if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi
diff --git a/src/secp256k1/include/secp256k1.h b/src/secp256k1/include/secp256k1.h
index a6e39d13db..06afd4c65b 100644
--- a/src/secp256k1/include/secp256k1.h
+++ b/src/secp256k1/include/secp256k1.h
@@ -40,42 +40,60 @@ extern "C" {
# define SECP256K1_ARG_NONNULL(_x)
# endif
+/** Opaque data structure that holds context information (precomputed tables etc.).
+ * Only functions that take a pointer to a non-const context require exclusive
+ * access to it. Multiple functions that take a pointer to a const context may
+ * run simultaneously.
+ */
+typedef struct secp256k1_context_struct secp256k1_context_t;
+
+/** Flags to pass to secp256k1_context_create. */
+# define SECP256K1_CONTEXT_VERIFY (1 << 0)
+# define SECP256K1_CONTEXT_SIGN (1 << 1)
-/** Flags to pass to secp256k1_start. */
-# define SECP256K1_START_VERIFY (1 << 0)
-# define SECP256K1_START_SIGN (1 << 1)
+/** Create a secp256k1 context object.
+ * Returns: a newly created context object.
+ * In: flags: which parts of the context to initialize.
+ */
+secp256k1_context_t* secp256k1_context_create(
+ int flags
+) SECP256K1_WARN_UNUSED_RESULT;
-/** Initialize the library. This may take some time (10-100 ms).
- * You need to call this before calling any other function.
- * It cannot run in parallel with any other functions, but once
- * secp256k1_start() returns, all other functions are thread-safe.
+/** Copies a secp256k1 context object.
+ * Returns: a newly created context object.
+ * In: ctx: an existing context to copy
*/
-void secp256k1_start(unsigned int flags);
+secp256k1_context_t* secp256k1_context_clone(
+ const secp256k1_context_t* ctx
+) SECP256K1_WARN_UNUSED_RESULT;
-/** Free all memory associated with this library. After this, no
- * functions can be called anymore, except secp256k1_start()
+/** Destroy a secp256k1 context object.
+ * The context pointer may not be used afterwards.
*/
-void secp256k1_stop(void);
+void secp256k1_context_destroy(
+ secp256k1_context_t* ctx
+) SECP256K1_ARG_NONNULL(1);
/** Verify an ECDSA signature.
* Returns: 1: correct signature
* 0: incorrect signature
* -1: invalid public key
* -2: invalid signature
- * In: msg32: the 32-byte message hash being verified (cannot be NULL)
+ * In: ctx: a secp256k1 context object, initialized for verification.
+ * msg32: the 32-byte message hash being verified (cannot be NULL)
* sig: the signature being verified (cannot be NULL)
* siglen: the length of the signature
* pubkey: the public key to verify with (cannot be NULL)
* pubkeylen: the length of pubkey
- * Requires starting using SECP256K1_START_VERIFY.
*/
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_verify(
+ const secp256k1_context_t* ctx,
const unsigned char *msg32,
const unsigned char *sig,
int siglen,
const unsigned char *pubkey,
int pubkeylen
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(5);
/** A pointer to a function to deterministically generate a nonce.
* Returns: 1 if a nonce was successfully generated. 0 will cause signing to fail.
@@ -111,15 +129,14 @@ extern const secp256k1_nonce_function_t secp256k1_nonce_function_default;
* Returns: 1: signature created
* 0: the nonce generation function failed, the private key was invalid, or there is not
* enough space in the signature (as indicated by siglen).
- * In: msg32: the 32-byte message hash being signed (cannot be NULL)
+ * In: ctx: pointer to a context object, initialized for signing (cannot be NULL)
+ * msg32: the 32-byte message hash being signed (cannot be NULL)
* seckey: pointer to a 32-byte secret key (cannot be NULL)
* noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used
* ndata: pointer to arbitrary data used by the nonce generation function (can be NULL)
* Out: sig: pointer to an array where the signature will be placed (cannot be NULL)
* In/Out: siglen: pointer to an int with the length of sig, which will be updated
- * to contain the actual signature length (<=72). If 0 is returned, this will be
- * set to zero.
- * Requires starting using SECP256K1_START_SIGN.
+ * to contain the actual signature length (<=72).
*
* The sig always has an s value in the lower half of the range (From 0x1
* to 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0,
@@ -148,145 +165,180 @@ extern const secp256k1_nonce_function_t secp256k1_nonce_function_default;
* be taken when this property is required for an application.
*/
int secp256k1_ecdsa_sign(
+ const secp256k1_context_t* ctx,
const unsigned char *msg32,
unsigned char *sig,
int *siglen,
const unsigned char *seckey,
secp256k1_nonce_function_t noncefp,
const void *ndata
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5);
/** Create a compact ECDSA signature (64 byte + recovery id).
* Returns: 1: signature created
* 0: the nonce generation function failed, or the secret key was invalid.
- * In: msg32: the 32-byte message hash being signed (cannot be NULL)
+ * In: ctx: pointer to a context object, initialized for signing (cannot be NULL)
+ * msg32: the 32-byte message hash being signed (cannot be NULL)
* seckey: pointer to a 32-byte secret key (cannot be NULL)
* noncefp:pointer to a nonce generation function. If NULL, secp256k1_nonce_function_default is used
* ndata: pointer to arbitrary data used by the nonce generation function (can be NULL)
* Out: sig: pointer to a 64-byte array where the signature will be placed (cannot be NULL)
* In case 0 is returned, the returned signature length will be zero.
* recid: pointer to an int, which will be updated to contain the recovery id (can be NULL)
- * Requires starting using SECP256K1_START_SIGN.
*/
int secp256k1_ecdsa_sign_compact(
+ const secp256k1_context_t* ctx,
const unsigned char *msg32,
unsigned char *sig64,
const unsigned char *seckey,
secp256k1_nonce_function_t noncefp,
const void *ndata,
int *recid
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
/** Recover an ECDSA public key from a compact signature.
* Returns: 1: public key successfully recovered (which guarantees a correct signature).
* 0: otherwise.
- * In: msg32: the 32-byte message hash assumed to be signed (cannot be NULL)
+ * In: ctx: pointer to a context object, initialized for verification (cannot be NULL)
+ * msg32: the 32-byte message hash assumed to be signed (cannot be NULL)
* sig64: signature as 64 byte array (cannot be NULL)
* compressed: whether to recover a compressed or uncompressed pubkey
* recid: the recovery id (0-3, as returned by ecdsa_sign_compact)
* Out: pubkey: pointer to a 33 or 65 byte array to put the pubkey (cannot be NULL)
* pubkeylen: pointer to an int that will contain the pubkey length (cannot be NULL)
- * Requires starting using SECP256K1_START_VERIFY.
*/
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ecdsa_recover_compact(
+ const secp256k1_context_t* ctx,
const unsigned char *msg32,
const unsigned char *sig64,
unsigned char *pubkey,
int *pubkeylen,
int compressed,
int recid
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4) SECP256K1_ARG_NONNULL(5);
/** Verify an ECDSA secret key.
* Returns: 1: secret key is valid
* 0: secret key is invalid
- * In: seckey: pointer to a 32-byte secret key (cannot be NULL)
+ * In: ctx: pointer to a context object (cannot be NULL)
+ * seckey: pointer to a 32-byte secret key (cannot be NULL)
*/
-SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify(const unsigned char *seckey) SECP256K1_ARG_NONNULL(1);
+SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify(
+ const secp256k1_context_t* ctx,
+ const unsigned char *seckey
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2);
/** Just validate a public key.
- * Returns: 1: valid public key
- * 0: invalid public key
- * In: pubkey: pointer to a 33-byte or 65-byte public key (cannot be NULL).
+ * Returns: 1: public key is valid
+ * 0: public key is invalid
+ * In: ctx: pointer to a context object (cannot be NULL)
+ * pubkey: pointer to a 33-byte or 65-byte public key (cannot be NULL).
* pubkeylen: length of pubkey
*/
-SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify(const unsigned char *pubkey, int pubkeylen) SECP256K1_ARG_NONNULL(1);
+SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_verify(
+ const secp256k1_context_t* ctx,
+ const unsigned char *pubkey,
+ int pubkeylen
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2);
/** Compute the public key for a secret key.
- * In: compressed: whether the computed public key should be compressed
+ * In: ctx: pointer to a context object, initialized for signing (cannot be NULL)
+ * compressed: whether the computed public key should be compressed
* seckey: pointer to a 32-byte private key (cannot be NULL)
* Out: pubkey: pointer to a 33-byte (if compressed) or 65-byte (if uncompressed)
* area to store the public key (cannot be NULL)
* pubkeylen: pointer to int that will be updated to contains the pubkey's
* length (cannot be NULL)
* Returns: 1: secret was valid, public key stores
- * 0: secret was invalid, try again.
- * Requires starting using SECP256K1_START_SIGN.
+ * 0: secret was invalid, try again
*/
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create(
+ const secp256k1_context_t* ctx,
unsigned char *pubkey,
int *pubkeylen,
const unsigned char *seckey,
int compressed
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
/** Decompress a public key.
+ * In: ctx: pointer to a context object (cannot be NULL)
* In/Out: pubkey: pointer to a 65-byte array to put the decompressed public key.
- It must contain a 33-byte or 65-byte public key already (cannot be NULL)
+ * It must contain a 33-byte or 65-byte public key already (cannot be NULL)
* pubkeylen: pointer to the size of the public key pointed to by pubkey (cannot be NULL)
- It will be updated to reflect the new size.
- * Returns: 0 if the passed public key was invalid, 1 otherwise. If 1 is returned, the
- pubkey is replaced with its decompressed version.
+ * It will be updated to reflect the new size.
+ * Returns: 0: pubkey was invalid
+ * 1: pubkey was valid, and was replaced with its decompressed version
*/
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_decompress(
+ const secp256k1_context_t* ctx,
unsigned char *pubkey,
int *pubkeylen
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
-/** Export a private key in DER format. */
+/** Export a private key in DER format.
+ * In: ctx: pointer to a context object, initialized for signing (cannot be NULL)
+ */
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_export(
+ const secp256k1_context_t* ctx,
const unsigned char *seckey,
unsigned char *privkey,
int *privkeylen,
int compressed
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4);
/** Import a private key in DER format. */
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_import(
+ const secp256k1_context_t* ctx,
unsigned char *seckey,
const unsigned char *privkey,
int privkeylen
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
/** Tweak a private key by adding tweak to it. */
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(
+ const secp256k1_context_t* ctx,
unsigned char *seckey,
const unsigned char *tweak
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
/** Tweak a public key by adding tweak times the generator to it.
- * Requires starting with SECP256K1_START_VERIFY.
+ * In: ctx: pointer to a context object, initialized for verification (cannot be NULL)
*/
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_add(
+ const secp256k1_context_t* ctx,
unsigned char *pubkey,
int pubkeylen,
const unsigned char *tweak
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4);
/** Tweak a private key by multiplying it with tweak. */
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_mul(
+ const secp256k1_context_t* ctx,
unsigned char *seckey,
const unsigned char *tweak
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
/** Tweak a public key by multiplying it with tweak.
- * Requires starting with SECP256K1_START_VERIFY.
+ * In: ctx: pointer to a context object, initialized for verification (cannot be NULL)
*/
SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_tweak_mul(
+ const secp256k1_context_t* ctx,
unsigned char *pubkey,
int pubkeylen,
const unsigned char *tweak
-) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(3);
+) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(4);
+
+/** Updates the context randomization.
+ * Returns: 1: randomization successfully updated
+ * 0: error
+ * In: ctx: pointer to a context object (cannot be NULL)
+ * seed32: pointer to a 32-byte random seed (NULL resets to initial state)
+ */
+SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize(
+ secp256k1_context_t* ctx,
+ const unsigned char *seed32
+) SECP256K1_ARG_NONNULL(1);
+
# ifdef __cplusplus
}
diff --git a/src/secp256k1/src/bench.h b/src/secp256k1/src/bench.h
index 0559b3e853..db5f68cee1 100644
--- a/src/secp256k1/src/bench.h
+++ b/src/secp256k1/src/bench.h
@@ -48,7 +48,7 @@ void run_benchmark(char *name, void (*benchmark)(void*), void (*setup)(void*), v
print_number(min * 1000000.0 / iter);
printf("us / avg ");
print_number((sum / count) * 1000000.0 / iter);
- printf("us / avg ");
+ printf("us / max ");
print_number(max * 1000000.0 / iter);
printf("us\n");
}
diff --git a/src/secp256k1/src/bench_recover.c b/src/secp256k1/src/bench_recover.c
index 6991cc9d6c..56faed11a0 100644
--- a/src/secp256k1/src/bench_recover.c
+++ b/src/secp256k1/src/bench_recover.c
@@ -9,6 +9,7 @@
#include "bench.h"
typedef struct {
+ secp256k1_context_t *ctx;
unsigned char msg[32];
unsigned char sig[64];
} bench_recover_t;
@@ -21,7 +22,7 @@ void bench_recover(void* arg) {
for (i = 0; i < 20000; i++) {
int j;
int pubkeylen = 33;
- CHECK(secp256k1_ecdsa_recover_compact(data->msg, data->sig, pubkey, &pubkeylen, 1, i % 2));
+ CHECK(secp256k1_ecdsa_recover_compact(data->ctx, data->msg, data->sig, pubkey, &pubkeylen, 1, i % 2));
for (j = 0; j < 32; j++) {
data->sig[j + 32] = data->msg[j]; /* Move former message to S. */
data->msg[j] = data->sig[j]; /* Move former R to message. */
@@ -40,10 +41,11 @@ void bench_recover_setup(void* arg) {
int main(void) {
bench_recover_t data;
- secp256k1_start(SECP256K1_START_VERIFY);
+
+ data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY);
run_benchmark("ecdsa_recover", bench_recover, bench_recover_setup, NULL, &data, 10, 20000);
- secp256k1_stop();
+ secp256k1_context_destroy(data.ctx);
return 0;
}
diff --git a/src/secp256k1/src/bench_sign.c b/src/secp256k1/src/bench_sign.c
index c5b6829a84..072a37af51 100644
--- a/src/secp256k1/src/bench_sign.c
+++ b/src/secp256k1/src/bench_sign.c
@@ -9,6 +9,7 @@
#include "bench.h"
typedef struct {
+ secp256k1_context_t* ctx;
unsigned char msg[32];
unsigned char key[32];
} bench_sign_t;
@@ -29,7 +30,7 @@ static void bench_sign(void* arg) {
for (i = 0; i < 20000; i++) {
int j;
int recid = 0;
- CHECK(secp256k1_ecdsa_sign_compact(data->msg, sig, data->key, NULL, NULL, &recid));
+ CHECK(secp256k1_ecdsa_sign_compact(data->ctx, data->msg, sig, data->key, NULL, NULL, &recid));
for (j = 0; j < 32; j++) {
data->msg[j] = sig[j]; /* Move former R to message. */
data->key[j] = sig[j + 32]; /* Move former S to key. */
@@ -39,10 +40,11 @@ static void bench_sign(void* arg) {
int main(void) {
bench_sign_t data;
- secp256k1_start(SECP256K1_START_SIGN);
+
+ data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);
run_benchmark("ecdsa_sign", bench_sign, bench_sign_setup, NULL, &data, 10, 20000);
- secp256k1_stop();
+ secp256k1_context_destroy(data.ctx);
return 0;
}
diff --git a/src/secp256k1/src/bench_verify.c b/src/secp256k1/src/bench_verify.c
index c279305a0d..c8c82752ce 100644
--- a/src/secp256k1/src/bench_verify.c
+++ b/src/secp256k1/src/bench_verify.c
@@ -12,6 +12,7 @@
#include "bench.h"
typedef struct {
+ secp256k1_context_t *ctx;
unsigned char msg[32];
unsigned char key[32];
unsigned char sig[72];
@@ -28,7 +29,7 @@ static void benchmark_verify(void* arg) {
data->sig[data->siglen - 1] ^= (i & 0xFF);
data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF);
data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF);
- CHECK(secp256k1_ecdsa_verify(data->msg, data->sig, data->siglen, data->pubkey, data->pubkeylen) == (i == 0));
+ CHECK(secp256k1_ecdsa_verify(data->ctx, data->msg, data->sig, data->siglen, data->pubkey, data->pubkeylen) == (i == 0));
data->sig[data->siglen - 1] ^= (i & 0xFF);
data->sig[data->siglen - 2] ^= ((i >> 8) & 0xFF);
data->sig[data->siglen - 3] ^= ((i >> 16) & 0xFF);
@@ -39,17 +40,17 @@ int main(void) {
int i;
benchmark_verify_t data;
- secp256k1_start(SECP256K1_START_VERIFY | SECP256K1_START_SIGN);
+ data.ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
for (i = 0; i < 32; i++) data.msg[i] = 1 + i;
for (i = 0; i < 32; i++) data.key[i] = 33 + i;
data.siglen = 72;
- secp256k1_ecdsa_sign(data.msg, data.sig, &data.siglen, data.key, NULL, NULL);
+ secp256k1_ecdsa_sign(data.ctx, data.msg, data.sig, &data.siglen, data.key, NULL, NULL);
data.pubkeylen = 33;
- CHECK(secp256k1_ec_pubkey_create(data.pubkey, &data.pubkeylen, data.key, 1));
+ CHECK(secp256k1_ec_pubkey_create(data.ctx, data.pubkey, &data.pubkeylen, data.key, 1));
run_benchmark("ecdsa_verify", benchmark_verify, NULL, NULL, &data, 10, 20000);
- secp256k1_stop();
+ secp256k1_context_destroy(data.ctx);
return 0;
}
diff --git a/src/secp256k1/src/ecdsa.h b/src/secp256k1/src/ecdsa.h
index c195e7afcb..4ef78e8afb 100644
--- a/src/secp256k1/src/ecdsa.h
+++ b/src/secp256k1/src/ecdsa.h
@@ -9,6 +9,7 @@
#include "scalar.h"
#include "group.h"
+#include "ecmult.h"
typedef struct {
secp256k1_scalar_t r, s;
@@ -16,8 +17,8 @@ typedef struct {
static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned char *sig, int size);
static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const secp256k1_ecdsa_sig_t *a);
-static int secp256k1_ecdsa_sig_verify(const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message);
-static int secp256k1_ecdsa_sig_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid);
-static int secp256k1_ecdsa_sig_recover(const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid);
+static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message);
+static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid);
+static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid);
#endif
diff --git a/src/secp256k1/src/ecdsa_impl.h b/src/secp256k1/src/ecdsa_impl.h
index 1a77649390..ed1d228189 100644
--- a/src/secp256k1/src/ecdsa_impl.h
+++ b/src/secp256k1/src/ecdsa_impl.h
@@ -53,35 +53,59 @@ static int secp256k1_ecdsa_sig_parse(secp256k1_ecdsa_sig_t *r, const unsigned ch
int lenr;
int lens;
int overflow;
- if (sig[0] != 0x30) return 0;
+ if (sig[0] != 0x30) {
+ return 0;
+ }
lenr = sig[3];
- if (5+lenr >= size) return 0;
+ if (5+lenr >= size) {
+ return 0;
+ }
lens = sig[lenr+5];
- if (sig[1] != lenr+lens+4) return 0;
- if (lenr+lens+6 > size) return 0;
- if (sig[2] != 0x02) return 0;
- if (lenr == 0) return 0;
- if (sig[lenr+4] != 0x02) return 0;
- if (lens == 0) return 0;
+ if (sig[1] != lenr+lens+4) {
+ return 0;
+ }
+ if (lenr+lens+6 > size) {
+ return 0;
+ }
+ if (sig[2] != 0x02) {
+ return 0;
+ }
+ if (lenr == 0) {
+ return 0;
+ }
+ if (sig[lenr+4] != 0x02) {
+ return 0;
+ }
+ if (lens == 0) {
+ return 0;
+ }
sp = sig + 6 + lenr;
while (lens > 0 && sp[0] == 0) {
lens--;
sp++;
}
- if (lens > 32) return 0;
+ if (lens > 32) {
+ return 0;
+ }
rp = sig + 4;
while (lenr > 0 && rp[0] == 0) {
lenr--;
rp++;
}
- if (lenr > 32) return 0;
+ if (lenr > 32) {
+ return 0;
+ }
memcpy(ra + 32 - lenr, rp, lenr);
memcpy(sa + 32 - lens, sp, lens);
overflow = 0;
secp256k1_scalar_set_b32(&r->r, ra, &overflow);
- if (overflow) return 0;
+ if (overflow) {
+ return 0;
+ }
secp256k1_scalar_set_b32(&r->s, sa, &overflow);
- if (overflow) return 0;
+ if (overflow) {
+ return 0;
+ }
return 1;
}
@@ -93,8 +117,9 @@ static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const se
secp256k1_scalar_get_b32(&s[1], &a->s);
while (lenR > 1 && rp[0] == 0 && rp[1] < 0x80) { lenR--; rp++; }
while (lenS > 1 && sp[0] == 0 && sp[1] < 0x80) { lenS--; sp++; }
- if (*size < 6+lenS+lenR)
+ if (*size < 6+lenS+lenR) {
return 0;
+ }
*size = 6 + lenS + lenR;
sig[0] = 0x30;
sig[1] = 4 + lenS + lenR;
@@ -107,21 +132,22 @@ static int secp256k1_ecdsa_sig_serialize(unsigned char *sig, int *size, const se
return 1;
}
-static int secp256k1_ecdsa_sig_verify(const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message) {
+static int secp256k1_ecdsa_sig_verify(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, const secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message) {
unsigned char c[32];
secp256k1_scalar_t sn, u1, u2;
secp256k1_fe_t xr;
secp256k1_gej_t pubkeyj;
secp256k1_gej_t pr;
- if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s))
+ if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s)) {
return 0;
+ }
secp256k1_scalar_inverse_var(&sn, &sig->s);
secp256k1_scalar_mul(&u1, &sn, message);
secp256k1_scalar_mul(&u2, &sn, &sig->r);
secp256k1_gej_set_ge(&pubkeyj, pubkey);
- secp256k1_ecmult(&pr, &pubkeyj, &u2, &u1);
+ secp256k1_ecmult(ctx, &pr, &pubkeyj, &u2, &u1);
if (secp256k1_gej_is_infinity(&pr)) {
return 0;
}
@@ -160,7 +186,7 @@ static int secp256k1_ecdsa_sig_verify(const secp256k1_ecdsa_sig_t *sig, const se
return 0;
}
-static int secp256k1_ecdsa_sig_recover(const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid) {
+static int secp256k1_ecdsa_sig_recover(const secp256k1_ecmult_context_t *ctx, const secp256k1_ecdsa_sig_t *sig, secp256k1_ge_t *pubkey, const secp256k1_scalar_t *message, int recid) {
unsigned char brx[32];
secp256k1_fe_t fx;
secp256k1_ge_t x;
@@ -168,36 +194,39 @@ static int secp256k1_ecdsa_sig_recover(const secp256k1_ecdsa_sig_t *sig, secp256
secp256k1_scalar_t rn, u1, u2;
secp256k1_gej_t qj;
- if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s))
+ if (secp256k1_scalar_is_zero(&sig->r) || secp256k1_scalar_is_zero(&sig->s)) {
return 0;
+ }
secp256k1_scalar_get_b32(brx, &sig->r);
VERIFY_CHECK(secp256k1_fe_set_b32(&fx, brx)); /* brx comes from a scalar, so is less than the order; certainly less than p */
if (recid & 2) {
- if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0)
+ if (secp256k1_fe_cmp_var(&fx, &secp256k1_ecdsa_const_p_minus_order) >= 0) {
return 0;
+ }
secp256k1_fe_add(&fx, &secp256k1_ecdsa_const_order_as_fe);
}
- if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1))
+ if (!secp256k1_ge_set_xo_var(&x, &fx, recid & 1)) {
return 0;
+ }
secp256k1_gej_set_ge(&xj, &x);
secp256k1_scalar_inverse_var(&rn, &sig->r);
secp256k1_scalar_mul(&u1, &rn, message);
secp256k1_scalar_negate(&u1, &u1);
secp256k1_scalar_mul(&u2, &rn, &sig->s);
- secp256k1_ecmult(&qj, &xj, &u2, &u1);
+ secp256k1_ecmult(ctx, &qj, &xj, &u2, &u1);
secp256k1_ge_set_gej_var(pubkey, &qj);
return !secp256k1_gej_is_infinity(&qj);
}
-static int secp256k1_ecdsa_sig_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid) {
+static int secp256k1_ecdsa_sig_sign(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *seckey, const secp256k1_scalar_t *message, const secp256k1_scalar_t *nonce, int *recid) {
unsigned char b[32];
secp256k1_gej_t rp;
secp256k1_ge_t r;
secp256k1_scalar_t n;
int overflow = 0;
- secp256k1_ecmult_gen(&rp, nonce);
+ secp256k1_ecmult_gen(ctx, &rp, nonce);
secp256k1_ge_set_gej(&r, &rp);
secp256k1_fe_normalize(&r.x);
secp256k1_fe_normalize(&r.y);
@@ -209,8 +238,9 @@ static int secp256k1_ecdsa_sig_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_
secp256k1_ge_clear(&r);
return 0;
}
- if (recid)
+ if (recid) {
*recid = (overflow ? 2 : 0) | (secp256k1_fe_is_odd(&r.y) ? 1 : 0);
+ }
secp256k1_scalar_mul(&n, &sig->r, seckey);
secp256k1_scalar_add(&n, &n, message);
secp256k1_scalar_inverse(&sig->s, nonce);
@@ -218,12 +248,14 @@ static int secp256k1_ecdsa_sig_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_
secp256k1_scalar_clear(&n);
secp256k1_gej_clear(&rp);
secp256k1_ge_clear(&r);
- if (secp256k1_scalar_is_zero(&sig->s))
+ if (secp256k1_scalar_is_zero(&sig->s)) {
return 0;
+ }
if (secp256k1_scalar_is_high(&sig->s)) {
secp256k1_scalar_negate(&sig->s, &sig->s);
- if (recid)
+ if (recid) {
*recid ^= 1;
+ }
}
return 1;
}
diff --git a/src/secp256k1/src/eckey.h b/src/secp256k1/src/eckey.h
index 6de5dc0a59..53b818485e 100644
--- a/src/secp256k1/src/eckey.h
+++ b/src/secp256k1/src/eckey.h
@@ -9,16 +9,18 @@
#include "group.h"
#include "scalar.h"
+#include "ecmult.h"
+#include "ecmult_gen.h"
static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned char *pub, int size);
static int secp256k1_eckey_pubkey_serialize(secp256k1_ge_t *elem, unsigned char *pub, int *size, int compressed);
static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned char *privkey, int privkeylen);
-static int secp256k1_eckey_privkey_serialize(unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed);
+static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context_t *ctx, unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed);
static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak);
-static int secp256k1_eckey_pubkey_tweak_add(secp256k1_ge_t *key, const secp256k1_scalar_t *tweak);
+static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak);
static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak);
-static int secp256k1_eckey_pubkey_tweak_mul(secp256k1_ge_t *key, const secp256k1_scalar_t *tweak);
+static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak);
#endif
diff --git a/src/secp256k1/src/eckey_impl.h b/src/secp256k1/src/eckey_impl.h
index 3e06d05b47..a332bd34ec 100644
--- a/src/secp256k1/src/eckey_impl.h
+++ b/src/secp256k1/src/eckey_impl.h
@@ -24,8 +24,9 @@ static int secp256k1_eckey_pubkey_parse(secp256k1_ge_t *elem, const unsigned cha
return 0;
}
secp256k1_ge_set_xy(elem, &x, &y);
- if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07))
+ if ((pub[0] == 0x06 || pub[0] == 0x07) && secp256k1_fe_is_odd(&y) != (pub[0] == 0x07)) {
return 0;
+ }
return secp256k1_ge_is_valid_var(elem);
} else {
return 0;
@@ -57,40 +58,47 @@ static int secp256k1_eckey_privkey_parse(secp256k1_scalar_t *key, const unsigned
int len = 0;
int overflow = 0;
/* sequence header */
- if (end < privkey+1 || *privkey != 0x30)
+ if (end < privkey+1 || *privkey != 0x30) {
return 0;
+ }
privkey++;
/* sequence length constructor */
- if (end < privkey+1 || !(*privkey & 0x80))
+ if (end < privkey+1 || !(*privkey & 0x80)) {
return 0;
+ }
lenb = *privkey & ~0x80; privkey++;
- if (lenb < 1 || lenb > 2)
+ if (lenb < 1 || lenb > 2) {
return 0;
- if (end < privkey+lenb)
+ }
+ if (end < privkey+lenb) {
return 0;
+ }
/* sequence length */
len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0);
privkey += lenb;
- if (end < privkey+len)
+ if (end < privkey+len) {
return 0;
+ }
/* sequence element 0: version number (=1) */
- if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01)
+ if (end < privkey+3 || privkey[0] != 0x02 || privkey[1] != 0x01 || privkey[2] != 0x01) {
return 0;
+ }
privkey += 3;
/* sequence element 1: octet string, up to 32 bytes */
- if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1])
+ if (end < privkey+2 || privkey[0] != 0x04 || privkey[1] > 0x20 || end < privkey+2+privkey[1]) {
return 0;
+ }
memcpy(c + 32 - privkey[1], privkey + 2, privkey[1]);
secp256k1_scalar_set_b32(key, c, &overflow);
memset(c, 0, 32);
return !overflow;
}
-static int secp256k1_eckey_privkey_serialize(unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed) {
+static int secp256k1_eckey_privkey_serialize(const secp256k1_ecmult_gen_context_t *ctx, unsigned char *privkey, int *privkeylen, const secp256k1_scalar_t *key, int compressed) {
secp256k1_gej_t rp;
secp256k1_ge_t r;
int pubkeylen = 0;
- secp256k1_ecmult_gen(&rp, key);
+ secp256k1_ecmult_gen(ctx, &rp, key);
secp256k1_ge_set_gej(&r, &rp);
if (compressed) {
static const unsigned char begin[] = {
@@ -148,41 +156,45 @@ static int secp256k1_eckey_privkey_serialize(unsigned char *privkey, int *privke
static int secp256k1_eckey_privkey_tweak_add(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) {
secp256k1_scalar_add(key, key, tweak);
- if (secp256k1_scalar_is_zero(key))
+ if (secp256k1_scalar_is_zero(key)) {
return 0;
+ }
return 1;
}
-static int secp256k1_eckey_pubkey_tweak_add(secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) {
+static int secp256k1_eckey_pubkey_tweak_add(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) {
secp256k1_gej_t pt;
secp256k1_scalar_t one;
secp256k1_gej_set_ge(&pt, key);
secp256k1_scalar_set_int(&one, 1);
- secp256k1_ecmult(&pt, &pt, &one, tweak);
+ secp256k1_ecmult(ctx, &pt, &pt, &one, tweak);
- if (secp256k1_gej_is_infinity(&pt))
+ if (secp256k1_gej_is_infinity(&pt)) {
return 0;
+ }
secp256k1_ge_set_gej(key, &pt);
return 1;
}
static int secp256k1_eckey_privkey_tweak_mul(secp256k1_scalar_t *key, const secp256k1_scalar_t *tweak) {
- if (secp256k1_scalar_is_zero(tweak))
+ if (secp256k1_scalar_is_zero(tweak)) {
return 0;
+ }
secp256k1_scalar_mul(key, key, tweak);
return 1;
}
-static int secp256k1_eckey_pubkey_tweak_mul(secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) {
+static int secp256k1_eckey_pubkey_tweak_mul(const secp256k1_ecmult_context_t *ctx, secp256k1_ge_t *key, const secp256k1_scalar_t *tweak) {
secp256k1_scalar_t zero;
secp256k1_gej_t pt;
- if (secp256k1_scalar_is_zero(tweak))
+ if (secp256k1_scalar_is_zero(tweak)) {
return 0;
+ }
secp256k1_scalar_set_int(&zero, 0);
secp256k1_gej_set_ge(&pt, key);
- secp256k1_ecmult(&pt, &pt, tweak, &zero);
+ secp256k1_ecmult(ctx, &pt, &pt, tweak, &zero);
secp256k1_ge_set_gej(key, &pt);
return 1;
}
diff --git a/src/secp256k1/src/ecmult.h b/src/secp256k1/src/ecmult.h
index 15a7100a4a..bab9e4ef52 100644
--- a/src/secp256k1/src/ecmult.h
+++ b/src/secp256k1/src/ecmult.h
@@ -10,10 +10,22 @@
#include "num.h"
#include "group.h"
-static void secp256k1_ecmult_start(void);
-static void secp256k1_ecmult_stop(void);
+typedef struct {
+ /* For accelerating the computation of a*P + b*G: */
+ secp256k1_ge_storage_t (*pre_g)[]; /* odd multiples of the generator */
+#ifdef USE_ENDOMORPHISM
+ secp256k1_ge_storage_t (*pre_g_128)[]; /* odd multiples of 2^128*generator */
+#endif
+} secp256k1_ecmult_context_t;
+
+static void secp256k1_ecmult_context_init(secp256k1_ecmult_context_t *ctx);
+static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx);
+static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst,
+ const secp256k1_ecmult_context_t *src);
+static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx);
+static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context_t *ctx);
/** Double multiply: R = na*A + ng*G */
-static void secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng);
+static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng);
#endif
diff --git a/src/secp256k1/src/ecmult_gen.h b/src/secp256k1/src/ecmult_gen.h
index 42f822f9ce..3745633c47 100644
--- a/src/secp256k1/src/ecmult_gen.h
+++ b/src/secp256k1/src/ecmult_gen.h
@@ -10,10 +10,34 @@
#include "scalar.h"
#include "group.h"
-static void secp256k1_ecmult_gen_start(void);
-static void secp256k1_ecmult_gen_stop(void);
+typedef struct {
+ /* For accelerating the computation of a*G:
+ * To harden against timing attacks, use the following mechanism:
+ * * Break up the multiplicand into groups of 4 bits, called n_0, n_1, n_2, ..., n_63.
+ * * Compute sum(n_i * 16^i * G + U_i, i=0..63), where:
+ * * U_i = U * 2^i (for i=0..62)
+ * * U_i = U * (1-2^63) (for i=63)
+ * where U is a point with no known corresponding scalar. Note that sum(U_i, i=0..63) = 0.
+ * For each i, and each of the 16 possible values of n_i, (n_i * 16^i * G + U_i) is
+ * precomputed (call it prec(i, n_i)). The formula now becomes sum(prec(i, n_i), i=0..63).
+ * None of the resulting prec group elements have a known scalar, and neither do any of
+ * the intermediate sums while computing a*G.
+ */
+ secp256k1_ge_storage_t (*prec)[64][16]; /* prec[j][i] = 16^j * i * G + U_i */
+ secp256k1_scalar_t blind;
+ secp256k1_gej_t initial;
+} secp256k1_ecmult_gen_context_t;
+
+static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context_t* ctx);
+static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t* ctx);
+static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context_t *dst,
+ const secp256k1_ecmult_gen_context_t* src);
+static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context_t* ctx);
+static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context_t* ctx);
/** Multiply with the generator: R = a*G */
-static void secp256k1_ecmult_gen(secp256k1_gej_t *r, const secp256k1_scalar_t *a);
+static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t* ctx, secp256k1_gej_t *r, const secp256k1_scalar_t *a);
+
+static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, const unsigned char *seed32);
#endif
diff --git a/src/secp256k1/src/ecmult_gen_impl.h b/src/secp256k1/src/ecmult_gen_impl.h
index 849452c7a1..4697753ac8 100644
--- a/src/secp256k1/src/ecmult_gen_impl.h
+++ b/src/secp256k1/src/ecmult_gen_impl.h
@@ -1,5 +1,5 @@
/**********************************************************************
- * Copyright (c) 2013, 2014 Pieter Wuille *
+ * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell *
* Distributed under the MIT software license, see the accompanying *
* file COPYING or http://www.opensource.org/licenses/mit-license.php.*
**********************************************************************/
@@ -10,36 +10,23 @@
#include "scalar.h"
#include "group.h"
#include "ecmult_gen.h"
+#include "hash_impl.h"
-typedef struct {
- /* For accelerating the computation of a*G:
- * To harden against timing attacks, use the following mechanism:
- * * Break up the multiplicand into groups of 4 bits, called n_0, n_1, n_2, ..., n_63.
- * * Compute sum(n_i * 16^i * G + U_i, i=0..63), where:
- * * U_i = U * 2^i (for i=0..62)
- * * U_i = U * (1-2^63) (for i=63)
- * where U is a point with no known corresponding scalar. Note that sum(U_i, i=0..63) = 0.
- * For each i, and each of the 16 possible values of n_i, (n_i * 16^i * G + U_i) is
- * precomputed (call it prec(i, n_i)). The formula now becomes sum(prec(i, n_i), i=0..63).
- * None of the resulting prec group elements have a known scalar, and neither do any of
- * the intermediate sums while computing a*G.
- */
- secp256k1_ge_storage_t prec[64][16]; /* prec[j][i] = 16^j * i * G + U_i */
-} secp256k1_ecmult_gen_consts_t;
-
-static const secp256k1_ecmult_gen_consts_t *secp256k1_ecmult_gen_consts = NULL;
+static void secp256k1_ecmult_gen_context_init(secp256k1_ecmult_gen_context_t *ctx) {
+ ctx->prec = NULL;
+}
-static void secp256k1_ecmult_gen_start(void) {
+static void secp256k1_ecmult_gen_context_build(secp256k1_ecmult_gen_context_t *ctx) {
secp256k1_ge_t prec[1024];
secp256k1_gej_t gj;
secp256k1_gej_t nums_gej;
- secp256k1_ecmult_gen_consts_t *ret;
int i, j;
- if (secp256k1_ecmult_gen_consts != NULL)
+
+ if (ctx->prec != NULL) {
return;
+ }
- /* Allocate the precomputation table. */
- ret = (secp256k1_ecmult_gen_consts_t*)checked_malloc(sizeof(secp256k1_ecmult_gen_consts_t));
+ ctx->prec = (secp256k1_ge_storage_t (*)[64][16])checked_malloc(sizeof(*ctx->prec));
/* get the generator */
secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g);
@@ -85,42 +72,113 @@ static void secp256k1_ecmult_gen_start(void) {
}
for (j = 0; j < 64; j++) {
for (i = 0; i < 16; i++) {
- secp256k1_ge_to_storage(&ret->prec[j][i], &prec[j*16 + i]);
+ secp256k1_ge_to_storage(&(*ctx->prec)[j][i], &prec[j*16 + i]);
}
}
+ secp256k1_ecmult_gen_blind(ctx, NULL);
+}
- /* Set the global pointer to the precomputation table. */
- secp256k1_ecmult_gen_consts = ret;
+static int secp256k1_ecmult_gen_context_is_built(const secp256k1_ecmult_gen_context_t* ctx) {
+ return ctx->prec != NULL;
}
-static void secp256k1_ecmult_gen_stop(void) {
- secp256k1_ecmult_gen_consts_t *c;
- if (secp256k1_ecmult_gen_consts == NULL)
- return;
+static void secp256k1_ecmult_gen_context_clone(secp256k1_ecmult_gen_context_t *dst,
+ const secp256k1_ecmult_gen_context_t *src) {
+ if (src->prec == NULL) {
+ dst->prec = NULL;
+ } else {
+ dst->prec = (secp256k1_ge_storage_t (*)[64][16])checked_malloc(sizeof(*dst->prec));
+ memcpy(dst->prec, src->prec, sizeof(*dst->prec));
+ dst->initial = src->initial;
+ dst->blind = src->blind;
+ }
+}
- c = (secp256k1_ecmult_gen_consts_t*)secp256k1_ecmult_gen_consts;
- secp256k1_ecmult_gen_consts = NULL;
- free(c);
+static void secp256k1_ecmult_gen_context_clear(secp256k1_ecmult_gen_context_t *ctx) {
+ free(ctx->prec);
+ secp256k1_scalar_clear(&ctx->blind);
+ secp256k1_gej_clear(&ctx->initial);
+ ctx->prec = NULL;
}
-static void secp256k1_ecmult_gen(secp256k1_gej_t *r, const secp256k1_scalar_t *gn) {
- const secp256k1_ecmult_gen_consts_t *c = secp256k1_ecmult_gen_consts;
+static void secp256k1_ecmult_gen(const secp256k1_ecmult_gen_context_t *ctx, secp256k1_gej_t *r, const secp256k1_scalar_t *gn) {
secp256k1_ge_t add;
secp256k1_ge_storage_t adds;
+ secp256k1_scalar_t gnb;
int bits;
int i, j;
- secp256k1_gej_set_infinity(r);
+ memset(&adds, 0, sizeof(adds));
+ *r = ctx->initial;
+ /* Blind scalar/point multiplication by computing (n-b)G + bG instead of nG. */
+ secp256k1_scalar_add(&gnb, gn, &ctx->blind);
add.infinity = 0;
for (j = 0; j < 64; j++) {
- bits = secp256k1_scalar_get_bits(gn, j * 4, 4);
+ bits = secp256k1_scalar_get_bits(&gnb, j * 4, 4);
for (i = 0; i < 16; i++) {
- secp256k1_ge_storage_cmov(&adds, &c->prec[j][i], i == bits);
+ /** This uses a conditional move to avoid any secret data in array indexes.
+ * _Any_ use of secret indexes has been demonstrated to result in timing
+ * sidechannels, even when the cache-line access patterns are uniform.
+ * See also:
+ * "A word of warning", CHES 2013 Rump Session, by Daniel J. Bernstein and Peter Schwabe
+ * (https://cryptojedi.org/peter/data/chesrump-20130822.pdf) and
+ * "Cache Attacks and Countermeasures: the Case of AES", RSA 2006,
+ * by Dag Arne Osvik, Adi Shamir, and Eran Tromer
+ * (http://www.tau.ac.il/~tromer/papers/cache.pdf)
+ */
+ secp256k1_ge_storage_cmov(&adds, &(*ctx->prec)[j][i], i == bits);
}
secp256k1_ge_from_storage(&add, &adds);
secp256k1_gej_add_ge(r, r, &add);
}
bits = 0;
secp256k1_ge_clear(&add);
+ secp256k1_scalar_clear(&gnb);
+}
+
+/* Setup blinding values for secp256k1_ecmult_gen. */
+static void secp256k1_ecmult_gen_blind(secp256k1_ecmult_gen_context_t *ctx, const unsigned char *seed32) {
+ secp256k1_scalar_t b;
+ secp256k1_gej_t gb;
+ secp256k1_fe_t s;
+ unsigned char nonce32[32];
+ secp256k1_rfc6979_hmac_sha256_t rng;
+ int retry;
+ if (!seed32) {
+ /* When seed is NULL, reset the initial point and blinding value. */
+ secp256k1_gej_set_ge(&ctx->initial, &secp256k1_ge_const_g);
+ secp256k1_gej_neg(&ctx->initial, &ctx->initial);
+ secp256k1_scalar_set_int(&ctx->blind, 1);
+ }
+ /* The prior blinding value (if not reset) is chained forward by including it in the hash. */
+ secp256k1_scalar_get_b32(nonce32, &ctx->blind);
+ /** Using a CSPRNG allows a failure free interface, avoids needing large amounts of random data,
+ * and guards against weak or adversarial seeds. This is a simpler and safer interface than
+ * asking the caller for blinding values directly and expecting them to retry on failure.
+ */
+ secp256k1_rfc6979_hmac_sha256_initialize(&rng, seed32 ? seed32 : nonce32, 32, nonce32, 32, NULL, 0);
+ /* Retry for out of range results to achieve uniformity. */
+ do {
+ secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);
+ retry = !secp256k1_fe_set_b32(&s, nonce32);
+ retry |= secp256k1_fe_is_zero(&s);
+ } while (retry);
+ /* Randomize the projection to defend against multiplier sidechannels. */
+ secp256k1_gej_rescale(&ctx->initial, &s);
+ secp256k1_fe_clear(&s);
+ do {
+ secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);
+ secp256k1_scalar_set_b32(&b, nonce32, &retry);
+ /* A blinding value of 0 works, but would undermine the projection hardening. */
+ retry |= secp256k1_scalar_is_zero(&b);
+ } while (retry);
+ secp256k1_rfc6979_hmac_sha256_finalize(&rng);
+ memset(nonce32, 0, 32);
+ secp256k1_ecmult_gen(ctx, &gb, &b);
+ secp256k1_scalar_negate(&b, &b);
+ ctx->blind = b;
+ ctx->initial = gb;
+ secp256k1_scalar_clear(&b);
+ secp256k1_gej_clear(&gb);
}
#endif
diff --git a/src/secp256k1/src/ecmult_impl.h b/src/secp256k1/src/ecmult_impl.h
index ece0b0a459..1b2856f83d 100644
--- a/src/secp256k1/src/ecmult_impl.h
+++ b/src/secp256k1/src/ecmult_impl.h
@@ -41,16 +41,17 @@ static void secp256k1_ecmult_table_precomp_gej_var(secp256k1_gej_t *pre, const s
int i;
pre[0] = *a;
secp256k1_gej_double_var(&d, &pre[0]);
- for (i = 1; i < (1 << (w-2)); i++)
+ for (i = 1; i < (1 << (w-2)); i++) {
secp256k1_gej_add_var(&pre[i], &d, &pre[i-1]);
+ }
}
static void secp256k1_ecmult_table_precomp_ge_storage_var(secp256k1_ge_storage_t *pre, const secp256k1_gej_t *a, int w) {
secp256k1_gej_t d;
int i;
const int table_size = 1 << (w-2);
- secp256k1_gej_t *prej = checked_malloc(sizeof(secp256k1_gej_t) * table_size);
- secp256k1_ge_t *prea = checked_malloc(sizeof(secp256k1_ge_t) * table_size);
+ secp256k1_gej_t *prej = (secp256k1_gej_t *)checked_malloc(sizeof(secp256k1_gej_t) * table_size);
+ secp256k1_ge_t *prea = (secp256k1_ge_t *)checked_malloc(sizeof(secp256k1_ge_t) * table_size);
prej[0] = *a;
secp256k1_gej_double_var(&d, a);
for (i = 1; i < table_size; i++) {
@@ -73,73 +74,93 @@ static void secp256k1_ecmult_table_precomp_ge_storage_var(secp256k1_ge_storage_t
VERIFY_CHECK(((n) & 1) == 1); \
VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \
VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \
- if ((n) > 0) \
+ if ((n) > 0) { \
*(r) = (pre)[((n)-1)/2]; \
- else \
+ } else { \
secp256k1_gej_neg((r), &(pre)[(-(n)-1)/2]); \
+ } \
} while(0)
#define ECMULT_TABLE_GET_GE_STORAGE(r,pre,n,w) do { \
VERIFY_CHECK(((n) & 1) == 1); \
VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \
VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \
- if ((n) > 0) \
+ if ((n) > 0) { \
secp256k1_ge_from_storage((r), &(pre)[((n)-1)/2]); \
- else {\
+ } else { \
secp256k1_ge_from_storage((r), &(pre)[(-(n)-1)/2]); \
secp256k1_ge_neg((r), (r)); \
} \
} while(0)
-typedef struct {
- /* For accelerating the computation of a*P + b*G: */
- secp256k1_ge_storage_t pre_g[ECMULT_TABLE_SIZE(WINDOW_G)]; /* odd multiples of the generator */
+static void secp256k1_ecmult_context_init(secp256k1_ecmult_context_t *ctx) {
+ ctx->pre_g = NULL;
#ifdef USE_ENDOMORPHISM
- secp256k1_ge_storage_t pre_g_128[ECMULT_TABLE_SIZE(WINDOW_G)]; /* odd multiples of 2^128*generator */
+ ctx->pre_g_128 = NULL;
#endif
-} secp256k1_ecmult_consts_t;
-
-static const secp256k1_ecmult_consts_t *secp256k1_ecmult_consts = NULL;
+}
-static void secp256k1_ecmult_start(void) {
+static void secp256k1_ecmult_context_build(secp256k1_ecmult_context_t *ctx) {
secp256k1_gej_t gj;
- secp256k1_ecmult_consts_t *ret;
- if (secp256k1_ecmult_consts != NULL)
- return;
- /* Allocate the precomputation table. */
- ret = (secp256k1_ecmult_consts_t*)checked_malloc(sizeof(secp256k1_ecmult_consts_t));
+ if (ctx->pre_g != NULL) {
+ return;
+ }
/* get the generator */
secp256k1_gej_set_ge(&gj, &secp256k1_ge_const_g);
+ ctx->pre_g = (secp256k1_ge_storage_t (*)[])checked_malloc(sizeof((*ctx->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G));
/* precompute the tables with odd multiples */
- secp256k1_ecmult_table_precomp_ge_storage_var(ret->pre_g, &gj, WINDOW_G);
+ secp256k1_ecmult_table_precomp_ge_storage_var(*ctx->pre_g, &gj, WINDOW_G);
#ifdef USE_ENDOMORPHISM
{
secp256k1_gej_t g_128j;
int i;
+
+ ctx->pre_g_128 = (secp256k1_ge_storage_t (*)[])checked_malloc(sizeof((*ctx->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G));
+
/* calculate 2^128*generator */
g_128j = gj;
- for (i = 0; i < 128; i++)
+ for (i = 0; i < 128; i++) {
secp256k1_gej_double_var(&g_128j, &g_128j);
- secp256k1_ecmult_table_precomp_ge_storage_var(ret->pre_g_128, &g_128j, WINDOW_G);
+ }
+ secp256k1_ecmult_table_precomp_ge_storage_var(*ctx->pre_g_128, &g_128j, WINDOW_G);
}
#endif
+}
- /* Set the global pointer to the precomputation table. */
- secp256k1_ecmult_consts = ret;
+static void secp256k1_ecmult_context_clone(secp256k1_ecmult_context_t *dst,
+ const secp256k1_ecmult_context_t *src) {
+ if (src->pre_g == NULL) {
+ dst->pre_g = NULL;
+ } else {
+ size_t size = sizeof((*dst->pre_g)[0]) * ECMULT_TABLE_SIZE(WINDOW_G);
+ dst->pre_g = (secp256k1_ge_storage_t (*)[])checked_malloc(size);
+ memcpy(dst->pre_g, src->pre_g, size);
+ }
+#ifdef USE_ENDOMORPHISM
+ if (src->pre_g_128 == NULL) {
+ dst->pre_g_128 = NULL;
+ } else {
+ size_t size = sizeof((*dst->pre_g_128)[0]) * ECMULT_TABLE_SIZE(WINDOW_G);
+ dst->pre_g_128 = (secp256k1_ge_storage_t (*)[])checked_malloc(size);
+ memcpy(dst->pre_g_128, src->pre_g_128, size);
+ }
+#endif
}
-static void secp256k1_ecmult_stop(void) {
- secp256k1_ecmult_consts_t *c;
- if (secp256k1_ecmult_consts == NULL)
- return;
+static int secp256k1_ecmult_context_is_built(const secp256k1_ecmult_context_t *ctx) {
+ return ctx->pre_g != NULL;
+}
- c = (secp256k1_ecmult_consts_t*)secp256k1_ecmult_consts;
- secp256k1_ecmult_consts = NULL;
- free(c);
+static void secp256k1_ecmult_context_clear(secp256k1_ecmult_context_t *ctx) {
+ free(ctx->pre_g);
+#ifdef USE_ENDOMORPHISM
+ free(ctx->pre_g_128);
+#endif
+ secp256k1_ecmult_context_init(ctx);
}
/** Convert a number to WNAF notation. The number becomes represented by sum(2^i * wnaf[i], i=0..bits),
@@ -186,11 +207,10 @@ static int secp256k1_ecmult_wnaf(int *wnaf, const secp256k1_scalar_t *a, int w)
return set_bits;
}
-static void secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng) {
+static void secp256k1_ecmult(const secp256k1_ecmult_context_t *ctx, secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_scalar_t *na, const secp256k1_scalar_t *ng) {
secp256k1_gej_t tmpj;
secp256k1_gej_t pre_a[ECMULT_TABLE_SIZE(WINDOW_A)];
secp256k1_ge_t tmpa;
- const secp256k1_ecmult_consts_t *c = secp256k1_ecmult_consts;
#ifdef USE_ENDOMORPHISM
secp256k1_gej_t pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)];
secp256k1_scalar_t na_1, na_lam;
@@ -223,7 +243,9 @@ static void secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const
VERIFY_CHECK(bits_na_1 <= 130);
VERIFY_CHECK(bits_na_lam <= 130);
bits = bits_na_1;
- if (bits_na_lam > bits) bits = bits_na_lam;
+ if (bits_na_lam > bits) {
+ bits = bits_na_lam;
+ }
#else
/* build wnaf representation for na. */
bits_na = secp256k1_ecmult_wnaf(wnaf_na, na, WINDOW_A);
@@ -234,8 +256,9 @@ static void secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const
secp256k1_ecmult_table_precomp_gej_var(pre_a, a, WINDOW_A);
#ifdef USE_ENDOMORPHISM
- for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++)
+ for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) {
secp256k1_gej_mul_lambda(&pre_a_lam[i], &pre_a[i]);
+ }
/* split ng into ng_1 and ng_128 (where gn = gn_1 + gn_128*2^128, and gn_1 and gn_128 are ~128 bit) */
secp256k1_scalar_split_128(&ng_1, &ng_128, ng);
@@ -243,11 +266,17 @@ static void secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const
/* Build wnaf representation for ng_1 and ng_128 */
bits_ng_1 = secp256k1_ecmult_wnaf(wnaf_ng_1, &ng_1, WINDOW_G);
bits_ng_128 = secp256k1_ecmult_wnaf(wnaf_ng_128, &ng_128, WINDOW_G);
- if (bits_ng_1 > bits) bits = bits_ng_1;
- if (bits_ng_128 > bits) bits = bits_ng_128;
+ if (bits_ng_1 > bits) {
+ bits = bits_ng_1;
+ }
+ if (bits_ng_128 > bits) {
+ bits = bits_ng_128;
+ }
#else
bits_ng = secp256k1_ecmult_wnaf(wnaf_ng, ng, WINDOW_G);
- if (bits_ng > bits) bits = bits_ng;
+ if (bits_ng > bits) {
+ bits = bits_ng;
+ }
#endif
secp256k1_gej_set_infinity(r);
@@ -265,11 +294,11 @@ static void secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const
secp256k1_gej_add_var(r, r, &tmpj);
}
if (i < bits_ng_1 && (n = wnaf_ng_1[i])) {
- ECMULT_TABLE_GET_GE_STORAGE(&tmpa, c->pre_g, n, WINDOW_G);
+ ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G);
secp256k1_gej_add_ge_var(r, r, &tmpa);
}
if (i < bits_ng_128 && (n = wnaf_ng_128[i])) {
- ECMULT_TABLE_GET_GE_STORAGE(&tmpa, c->pre_g_128, n, WINDOW_G);
+ ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g_128, n, WINDOW_G);
secp256k1_gej_add_ge_var(r, r, &tmpa);
}
#else
@@ -278,7 +307,7 @@ static void secp256k1_ecmult(secp256k1_gej_t *r, const secp256k1_gej_t *a, const
secp256k1_gej_add_var(r, r, &tmpj);
}
if (i < bits_ng && (n = wnaf_ng[i])) {
- ECMULT_TABLE_GET_GE_STORAGE(&tmpa, c->pre_g, n, WINDOW_G);
+ ECMULT_TABLE_GET_GE_STORAGE(&tmpa, *ctx->pre_g, n, WINDOW_G);
secp256k1_gej_add_ge_var(r, r, &tmpa);
}
#endif
diff --git a/src/secp256k1/src/field.h b/src/secp256k1/src/field.h
index 9e6d7d3c04..41b280892d 100644
--- a/src/secp256k1/src/field.h
+++ b/src/secp256k1/src/field.h
@@ -113,4 +113,7 @@ static void secp256k1_fe_from_storage(secp256k1_fe_t *r, const secp256k1_fe_stor
/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */
static void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag);
+/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */
+static void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag);
+
#endif
diff --git a/src/secp256k1/src/field_10x26_impl.h b/src/secp256k1/src/field_10x26_impl.h
index 0afbb18a4a..871b91f912 100644
--- a/src/secp256k1/src/field_10x26_impl.h
+++ b/src/secp256k1/src/field_10x26_impl.h
@@ -236,8 +236,9 @@ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) {
z1 = z0 ^ 0x3D0UL;
/* Fast return path should catch the majority of cases */
- if ((z0 != 0UL) & (z1 != 0x3FFFFFFUL))
+ if ((z0 != 0UL) & (z1 != 0x3FFFFFFUL)) {
return 0;
+ }
t1 = r->n[1];
t2 = r->n[2];
@@ -315,8 +316,12 @@ static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b
secp256k1_fe_verify(b);
#endif
for (i = 9; i >= 0; i--) {
- if (a->n[i] > b->n[i]) return 1;
- if (a->n[i] < b->n[i]) return -1;
+ if (a->n[i] > b->n[i]) {
+ return 1;
+ }
+ if (a->n[i] < b->n[i]) {
+ return -1;
+ }
}
return 0;
}
@@ -1063,6 +1068,26 @@ static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
#endif
}
+static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag) {
+ uint32_t mask0, mask1;
+ mask0 = flag + ~((uint32_t)0);
+ mask1 = ~mask0;
+ r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1);
+ r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1);
+ r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);
+ r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);
+ r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1);
+ r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1);
+ r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1);
+ r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1);
+ r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1);
+ r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1);
+#ifdef VERIFY
+ r->magnitude = (r->magnitude & mask0) | (a->magnitude & mask1);
+ r->normalized = (r->normalized & mask0) | (a->normalized & mask1);
+#endif
+}
+
static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) {
uint32_t mask0, mask1;
mask0 = flag + ~((uint32_t)0);
diff --git a/src/secp256k1/src/field_5x52_impl.h b/src/secp256k1/src/field_5x52_impl.h
index 2f9c8704a8..bda4c3dfc2 100644
--- a/src/secp256k1/src/field_5x52_impl.h
+++ b/src/secp256k1/src/field_5x52_impl.h
@@ -209,8 +209,9 @@ static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe_t *r) {
z1 = z0 ^ 0x1000003D0ULL;
/* Fast return path should catch the majority of cases */
- if ((z0 != 0ULL) & (z1 != 0xFFFFFFFFFFFFFULL))
+ if ((z0 != 0ULL) & (z1 != 0xFFFFFFFFFFFFFULL)) {
return 0;
+ }
t1 = r->n[1];
t2 = r->n[2];
@@ -277,8 +278,12 @@ static int secp256k1_fe_cmp_var(const secp256k1_fe_t *a, const secp256k1_fe_t *b
secp256k1_fe_verify(b);
#endif
for (i = 4; i >= 0; i--) {
- if (a->n[i] > b->n[i]) return 1;
- if (a->n[i] < b->n[i]) return -1;
+ if (a->n[i] > b->n[i]) {
+ return 1;
+ }
+ if (a->n[i] < b->n[i]) {
+ return -1;
+ }
}
return 0;
}
@@ -399,6 +404,21 @@ static void secp256k1_fe_sqr(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
#endif
}
+static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe_t *r, const secp256k1_fe_t *a, int flag) {
+ uint64_t mask0, mask1;
+ mask0 = flag + ~((uint64_t)0);
+ mask1 = ~mask0;
+ r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1);
+ r->n[1] = (r->n[1] & mask0) | (a->n[1] & mask1);
+ r->n[2] = (r->n[2] & mask0) | (a->n[2] & mask1);
+ r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1);
+ r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1);
+#ifdef VERIFY
+ r->magnitude = (r->magnitude & mask0) | (a->magnitude & mask1);
+ r->normalized = (r->normalized & mask0) | (a->normalized & mask1);
+#endif
+}
+
static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage_t *r, const secp256k1_fe_storage_t *a, int flag) {
uint64_t mask0, mask1;
mask0 = flag + ~((uint64_t)0);
diff --git a/src/secp256k1/src/field_impl.h b/src/secp256k1/src/field_impl.h
index 047914cf28..e6ec11e8f2 100644
--- a/src/secp256k1/src/field_impl.h
+++ b/src/secp256k1/src/field_impl.h
@@ -44,47 +44,69 @@ static int secp256k1_fe_sqrt_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
secp256k1_fe_mul(&x3, &x3, a);
x6 = x3;
- for (j=0; j<3; j++) secp256k1_fe_sqr(&x6, &x6);
+ for (j=0; j<3; j++) {
+ secp256k1_fe_sqr(&x6, &x6);
+ }
secp256k1_fe_mul(&x6, &x6, &x3);
x9 = x6;
- for (j=0; j<3; j++) secp256k1_fe_sqr(&x9, &x9);
+ for (j=0; j<3; j++) {
+ secp256k1_fe_sqr(&x9, &x9);
+ }
secp256k1_fe_mul(&x9, &x9, &x3);
x11 = x9;
- for (j=0; j<2; j++) secp256k1_fe_sqr(&x11, &x11);
+ for (j=0; j<2; j++) {
+ secp256k1_fe_sqr(&x11, &x11);
+ }
secp256k1_fe_mul(&x11, &x11, &x2);
x22 = x11;
- for (j=0; j<11; j++) secp256k1_fe_sqr(&x22, &x22);
+ for (j=0; j<11; j++) {
+ secp256k1_fe_sqr(&x22, &x22);
+ }
secp256k1_fe_mul(&x22, &x22, &x11);
x44 = x22;
- for (j=0; j<22; j++) secp256k1_fe_sqr(&x44, &x44);
+ for (j=0; j<22; j++) {
+ secp256k1_fe_sqr(&x44, &x44);
+ }
secp256k1_fe_mul(&x44, &x44, &x22);
x88 = x44;
- for (j=0; j<44; j++) secp256k1_fe_sqr(&x88, &x88);
+ for (j=0; j<44; j++) {
+ secp256k1_fe_sqr(&x88, &x88);
+ }
secp256k1_fe_mul(&x88, &x88, &x44);
x176 = x88;
- for (j=0; j<88; j++) secp256k1_fe_sqr(&x176, &x176);
+ for (j=0; j<88; j++) {
+ secp256k1_fe_sqr(&x176, &x176);
+ }
secp256k1_fe_mul(&x176, &x176, &x88);
x220 = x176;
- for (j=0; j<44; j++) secp256k1_fe_sqr(&x220, &x220);
+ for (j=0; j<44; j++) {
+ secp256k1_fe_sqr(&x220, &x220);
+ }
secp256k1_fe_mul(&x220, &x220, &x44);
x223 = x220;
- for (j=0; j<3; j++) secp256k1_fe_sqr(&x223, &x223);
+ for (j=0; j<3; j++) {
+ secp256k1_fe_sqr(&x223, &x223);
+ }
secp256k1_fe_mul(&x223, &x223, &x3);
/* The final result is then assembled using a sliding window over the blocks. */
t1 = x223;
- for (j=0; j<23; j++) secp256k1_fe_sqr(&t1, &t1);
+ for (j=0; j<23; j++) {
+ secp256k1_fe_sqr(&t1, &t1);
+ }
secp256k1_fe_mul(&t1, &t1, &x22);
- for (j=0; j<6; j++) secp256k1_fe_sqr(&t1, &t1);
+ for (j=0; j<6; j++) {
+ secp256k1_fe_sqr(&t1, &t1);
+ }
secp256k1_fe_mul(&t1, &t1, &x2);
secp256k1_fe_sqr(&t1, &t1);
secp256k1_fe_sqr(r, &t1);
@@ -111,51 +133,77 @@ static void secp256k1_fe_inv(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
secp256k1_fe_mul(&x3, &x3, a);
x6 = x3;
- for (j=0; j<3; j++) secp256k1_fe_sqr(&x6, &x6);
+ for (j=0; j<3; j++) {
+ secp256k1_fe_sqr(&x6, &x6);
+ }
secp256k1_fe_mul(&x6, &x6, &x3);
x9 = x6;
- for (j=0; j<3; j++) secp256k1_fe_sqr(&x9, &x9);
+ for (j=0; j<3; j++) {
+ secp256k1_fe_sqr(&x9, &x9);
+ }
secp256k1_fe_mul(&x9, &x9, &x3);
x11 = x9;
- for (j=0; j<2; j++) secp256k1_fe_sqr(&x11, &x11);
+ for (j=0; j<2; j++) {
+ secp256k1_fe_sqr(&x11, &x11);
+ }
secp256k1_fe_mul(&x11, &x11, &x2);
x22 = x11;
- for (j=0; j<11; j++) secp256k1_fe_sqr(&x22, &x22);
+ for (j=0; j<11; j++) {
+ secp256k1_fe_sqr(&x22, &x22);
+ }
secp256k1_fe_mul(&x22, &x22, &x11);
x44 = x22;
- for (j=0; j<22; j++) secp256k1_fe_sqr(&x44, &x44);
+ for (j=0; j<22; j++) {
+ secp256k1_fe_sqr(&x44, &x44);
+ }
secp256k1_fe_mul(&x44, &x44, &x22);
x88 = x44;
- for (j=0; j<44; j++) secp256k1_fe_sqr(&x88, &x88);
+ for (j=0; j<44; j++) {
+ secp256k1_fe_sqr(&x88, &x88);
+ }
secp256k1_fe_mul(&x88, &x88, &x44);
x176 = x88;
- for (j=0; j<88; j++) secp256k1_fe_sqr(&x176, &x176);
+ for (j=0; j<88; j++) {
+ secp256k1_fe_sqr(&x176, &x176);
+ }
secp256k1_fe_mul(&x176, &x176, &x88);
x220 = x176;
- for (j=0; j<44; j++) secp256k1_fe_sqr(&x220, &x220);
+ for (j=0; j<44; j++) {
+ secp256k1_fe_sqr(&x220, &x220);
+ }
secp256k1_fe_mul(&x220, &x220, &x44);
x223 = x220;
- for (j=0; j<3; j++) secp256k1_fe_sqr(&x223, &x223);
+ for (j=0; j<3; j++) {
+ secp256k1_fe_sqr(&x223, &x223);
+ }
secp256k1_fe_mul(&x223, &x223, &x3);
/* The final result is then assembled using a sliding window over the blocks. */
t1 = x223;
- for (j=0; j<23; j++) secp256k1_fe_sqr(&t1, &t1);
+ for (j=0; j<23; j++) {
+ secp256k1_fe_sqr(&t1, &t1);
+ }
secp256k1_fe_mul(&t1, &t1, &x22);
- for (j=0; j<5; j++) secp256k1_fe_sqr(&t1, &t1);
+ for (j=0; j<5; j++) {
+ secp256k1_fe_sqr(&t1, &t1);
+ }
secp256k1_fe_mul(&t1, &t1, a);
- for (j=0; j<3; j++) secp256k1_fe_sqr(&t1, &t1);
+ for (j=0; j<3; j++) {
+ secp256k1_fe_sqr(&t1, &t1);
+ }
secp256k1_fe_mul(&t1, &t1, &x2);
- for (j=0; j<2; j++) secp256k1_fe_sqr(&t1, &t1);
+ for (j=0; j<2; j++) {
+ secp256k1_fe_sqr(&t1, &t1);
+ }
secp256k1_fe_mul(r, a, &t1);
}
@@ -188,8 +236,9 @@ static void secp256k1_fe_inv_var(secp256k1_fe_t *r, const secp256k1_fe_t *a) {
static void secp256k1_fe_inv_all_var(size_t len, secp256k1_fe_t *r, const secp256k1_fe_t *a) {
secp256k1_fe_t u;
size_t i;
- if (len < 1)
+ if (len < 1) {
return;
+ }
VERIFY_CHECK((r + len <= a) || (a + len <= r));
diff --git a/src/secp256k1/src/group.h b/src/secp256k1/src/group.h
index d1e5834909..0b08b3b991 100644
--- a/src/secp256k1/src/group.h
+++ b/src/secp256k1/src/group.h
@@ -115,4 +115,7 @@ static void secp256k1_ge_from_storage(secp256k1_ge_t *r, const secp256k1_ge_stor
/** If flag is true, set *r equal to *a; otherwise leave it. Constant-time. */
static void secp256k1_ge_storage_cmov(secp256k1_ge_storage_t *r, const secp256k1_ge_storage_t *a, int flag);
+/** Rescale a jacobian point by b which must be non-zero. Constant-time. */
+static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *b);
+
#endif
diff --git a/src/secp256k1/src/group_impl.h b/src/secp256k1/src/group_impl.h
index 8d8c359c5a..0f64576fbb 100644
--- a/src/secp256k1/src/group_impl.h
+++ b/src/secp256k1/src/group_impl.h
@@ -77,14 +77,14 @@ static void secp256k1_ge_set_all_gej_var(size_t len, secp256k1_ge_t *r, const se
secp256k1_fe_t *azi;
size_t i;
size_t count = 0;
- az = checked_malloc(sizeof(secp256k1_fe_t) * len);
+ az = (secp256k1_fe_t *)checked_malloc(sizeof(secp256k1_fe_t) * len);
for (i = 0; i < len; i++) {
if (!a[i].infinity) {
az[count++] = a[i].z;
}
}
- azi = checked_malloc(sizeof(secp256k1_fe_t) * count);
+ azi = (secp256k1_fe_t *)checked_malloc(sizeof(secp256k1_fe_t) * count);
secp256k1_fe_inv_all_var(count, azi, az);
free(az);
@@ -138,11 +138,13 @@ static int secp256k1_ge_set_xo_var(secp256k1_ge_t *r, const secp256k1_fe_t *x, i
r->infinity = 0;
secp256k1_fe_set_int(&c, 7);
secp256k1_fe_add(&c, &x3);
- if (!secp256k1_fe_sqrt_var(&r->y, &c))
+ if (!secp256k1_fe_sqrt_var(&r->y, &c)) {
return 0;
+ }
secp256k1_fe_normalize_var(&r->y);
- if (secp256k1_fe_is_odd(&r->y) != odd)
+ if (secp256k1_fe_is_odd(&r->y) != odd) {
secp256k1_fe_negate(&r->y, &r->y, 1);
+ }
return 1;
}
@@ -176,8 +178,9 @@ static int secp256k1_gej_is_infinity(const secp256k1_gej_t *a) {
static int secp256k1_gej_is_valid_var(const secp256k1_gej_t *a) {
secp256k1_fe_t y2, x3, z2, z6;
- if (a->infinity)
+ if (a->infinity) {
return 0;
+ }
/** y^2 = x^3 + 7
* (Y/Z^3)^2 = (X/Z^2)^3 + 7
* Y^2 / Z^6 = X^3 / Z^6 + 7
@@ -195,8 +198,9 @@ static int secp256k1_gej_is_valid_var(const secp256k1_gej_t *a) {
static int secp256k1_ge_is_valid_var(const secp256k1_ge_t *a) {
secp256k1_fe_t y2, x3, c;
- if (a->infinity)
+ if (a->infinity) {
return 0;
+ }
/* y^2 = x^3 + 7 */
secp256k1_fe_sqr(&y2, &a->y);
secp256k1_fe_sqr(&x3, &a->x); secp256k1_fe_mul(&x3, &x3, &a->x);
@@ -321,7 +325,8 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej_t *r, const secp256k1_gej_t *
}
static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, const secp256k1_ge_t *b) {
- /* Operations: 7 mul, 5 sqr, 5 normalize, 19 mul_int/add/negate */
+ /* Operations: 7 mul, 5 sqr, 5 normalize, 17 mul_int/add/negate/cmov */
+ static const secp256k1_fe_t fe_1 = SECP256K1_FE_CONST(0, 0, 0, 0, 0, 0, 0, 1);
secp256k1_fe_t zz, u1, u2, s1, s2, z, t, m, n, q, rr;
int infinity;
VERIFY_CHECK(!b->infinity);
@@ -383,17 +388,25 @@ static void secp256k1_gej_add_ge(secp256k1_gej_t *r, const secp256k1_gej_t *a, c
secp256k1_fe_mul_int(&r->y, 4 * (1 - a->infinity)); /* r->y = Y3 = 4*R*(3*Q-2*R^2)-4*M^4 (4) */
/** In case a->infinity == 1, the above code results in r->x, r->y, and r->z all equal to 0.
- * Add b->x to x, b->y to y, and 1 to z in that case.
+ * Replace r with b->x, b->y, 1 in that case.
*/
- t = b->x; secp256k1_fe_mul_int(&t, a->infinity);
- secp256k1_fe_add(&r->x, &t);
- t = b->y; secp256k1_fe_mul_int(&t, a->infinity);
- secp256k1_fe_add(&r->y, &t);
- secp256k1_fe_set_int(&t, a->infinity);
- secp256k1_fe_add(&r->z, &t);
+ secp256k1_fe_cmov(&r->x, &b->x, a->infinity);
+ secp256k1_fe_cmov(&r->y, &b->y, a->infinity);
+ secp256k1_fe_cmov(&r->z, &fe_1, a->infinity);
r->infinity = infinity;
}
+static void secp256k1_gej_rescale(secp256k1_gej_t *r, const secp256k1_fe_t *s) {
+ /* Operations: 4 mul, 1 sqr */
+ secp256k1_fe_t zz;
+ VERIFY_CHECK(!secp256k1_fe_is_zero(s));
+ secp256k1_fe_sqr(&zz, s);
+ secp256k1_fe_mul(&r->x, &r->x, &zz); /* r->x *= s^2 */
+ secp256k1_fe_mul(&r->y, &r->y, &zz);
+ secp256k1_fe_mul(&r->y, &r->y, s); /* r->y *= s^3 */
+ secp256k1_fe_mul(&r->z, &r->z, s); /* r->z *= s */
+}
+
static void secp256k1_ge_to_storage(secp256k1_ge_storage_t *r, const secp256k1_ge_t *a) {
secp256k1_fe_t x, y;
VERIFY_CHECK(!a->infinity);
diff --git a/src/secp256k1/src/hash_impl.h b/src/secp256k1/src/hash_impl.h
index 60fdbf7718..9828827bcd 100644
--- a/src/secp256k1/src/hash_impl.h
+++ b/src/secp256k1/src/hash_impl.h
@@ -176,13 +176,15 @@ static void secp256k1_hmac_sha256_initialize(secp256k1_hmac_sha256_t *hash, cons
}
secp256k1_sha256_initialize(&hash->outer);
- for (n = 0; n < 64; n++)
+ for (n = 0; n < 64; n++) {
rkey[n] ^= 0x5c;
+ }
secp256k1_sha256_write(&hash->outer, rkey, 64);
secp256k1_sha256_initialize(&hash->inner);
- for (n = 0; n < 64; n++)
+ for (n = 0; n < 64; n++) {
rkey[n] ^= 0x5c ^ 0x36;
+ }
secp256k1_sha256_write(&hash->inner, rkey, 64);
memset(rkey, 0, 64);
}
@@ -205,15 +207,17 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2
static const unsigned char zero[1] = {0x00};
static const unsigned char one[1] = {0x01};
- memset(rng->v, 0x01, 32);
- memset(rng->k, 0x00, 32);
+ memset(rng->v, 0x01, 32); /* RFC6979 3.2.b. */
+ memset(rng->k, 0x00, 32); /* RFC6979 3.2.c. */
+ /* RFC6979 3.2.d. */
secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
secp256k1_hmac_sha256_write(&hmac, zero, 1);
secp256k1_hmac_sha256_write(&hmac, key, keylen);
secp256k1_hmac_sha256_write(&hmac, msg, msglen);
if (rnd && rndlen) {
+ /* RFC6979 3.6 "Additional data". */
secp256k1_hmac_sha256_write(&hmac, rnd, rndlen);
}
secp256k1_hmac_sha256_finalize(&hmac, rng->k);
@@ -221,12 +225,14 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2
secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
secp256k1_hmac_sha256_finalize(&hmac, rng->v);
+ /* RFC6979 3.2.f. */
secp256k1_hmac_sha256_initialize(&hmac, rng->k, 32);
secp256k1_hmac_sha256_write(&hmac, rng->v, 32);
secp256k1_hmac_sha256_write(&hmac, one, 1);
secp256k1_hmac_sha256_write(&hmac, key, keylen);
secp256k1_hmac_sha256_write(&hmac, msg, msglen);
if (rnd && rndlen) {
+ /* RFC6979 3.6 "Additional data". */
secp256k1_hmac_sha256_write(&hmac, rnd, rndlen);
}
secp256k1_hmac_sha256_finalize(&hmac, rng->k);
@@ -237,6 +243,7 @@ static void secp256k1_rfc6979_hmac_sha256_initialize(secp256k1_rfc6979_hmac_sha2
}
static void secp256k1_rfc6979_hmac_sha256_generate(secp256k1_rfc6979_hmac_sha256_t *rng, unsigned char *out, size_t outlen) {
+ /* RFC6979 3.2.h. */
static const unsigned char zero[1] = {0x00};
if (rng->retry) {
secp256k1_hmac_sha256_t hmac;
diff --git a/src/secp256k1/src/num_gmp_impl.h b/src/secp256k1/src/num_gmp_impl.h
index 3e4b92d329..dbbc458d5d 100644
--- a/src/secp256k1/src/num_gmp_impl.h
+++ b/src/secp256k1/src/num_gmp_impl.h
@@ -54,7 +54,9 @@ static void secp256k1_num_set_bin(secp256k1_num_t *r, const unsigned char *a, un
VERIFY_CHECK(len <= NUM_LIMBS*2);
r->limbs = len;
r->neg = 0;
- while (r->limbs > 1 && r->data[r->limbs-1]==0) r->limbs--;
+ while (r->limbs > 1 && r->data[r->limbs-1]==0) {
+ r->limbs--;
+ }
}
static void secp256k1_num_add_abs(secp256k1_num_t *r, const secp256k1_num_t *a, const secp256k1_num_t *b) {
@@ -70,7 +72,9 @@ static void secp256k1_num_sub_abs(secp256k1_num_t *r, const secp256k1_num_t *a,
mp_limb_t c = mpn_sub(r->data, a->data, a->limbs, b->data, b->limbs);
VERIFY_CHECK(c == 0);
r->limbs = a->limbs;
- while (r->limbs > 1 && r->data[r->limbs-1]==0) r->limbs--;
+ while (r->limbs > 1 && r->data[r->limbs-1]==0) {
+ r->limbs--;
+ }
}
static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m) {
@@ -82,7 +86,9 @@ static void secp256k1_num_mod(secp256k1_num_t *r, const secp256k1_num_t *m) {
mpn_tdiv_qr(t, r->data, 0, r->data, r->limbs, m->data, m->limbs);
memset(t, 0, sizeof(t));
r->limbs = m->limbs;
- while (r->limbs > 1 && r->data[r->limbs-1]==0) r->limbs--;
+ while (r->limbs > 1 && r->data[r->limbs-1]==0) {
+ r->limbs--;
+ }
}
if (r->neg && (r->limbs > 1 || r->data[0] != 0)) {
@@ -125,7 +131,9 @@ static void secp256k1_num_mod_inverse(secp256k1_num_t *r, const secp256k1_num_t
if (sn < 0) {
mpn_sub(r->data, m->data, m->limbs, r->data, -sn);
r->limbs = m->limbs;
- while (r->limbs > 1 && r->data[r->limbs-1]==0) r->limbs--;
+ while (r->limbs > 1 && r->data[r->limbs-1]==0) {
+ r->limbs--;
+ }
} else {
r->limbs = sn;
}
@@ -143,15 +151,25 @@ static int secp256k1_num_is_neg(const secp256k1_num_t *a) {
}
static int secp256k1_num_cmp(const secp256k1_num_t *a, const secp256k1_num_t *b) {
- if (a->limbs > b->limbs) return 1;
- if (a->limbs < b->limbs) return -1;
+ if (a->limbs > b->limbs) {
+ return 1;
+ }
+ if (a->limbs < b->limbs) {
+ return -1;
+ }
return mpn_cmp(a->data, b->data, a->limbs);
}
static int secp256k1_num_eq(const secp256k1_num_t *a, const secp256k1_num_t *b) {
- if (a->limbs > b->limbs) return 0;
- if (a->limbs < b->limbs) return 0;
- if ((a->neg && !secp256k1_num_is_zero(a)) != (b->neg && !secp256k1_num_is_zero(b))) return 0;
+ if (a->limbs > b->limbs) {
+ return 0;
+ }
+ if (a->limbs < b->limbs) {
+ return 0;
+ }
+ if ((a->neg && !secp256k1_num_is_zero(a)) != (b->neg && !secp256k1_num_is_zero(b))) {
+ return 0;
+ }
return mpn_cmp(a->data, b->data, a->limbs) == 0;
}
@@ -198,12 +216,15 @@ static void secp256k1_num_mul(secp256k1_num_t *r, const secp256k1_num_t *a, cons
r->data[0] = 0;
return;
}
- if (a->limbs >= b->limbs)
+ if (a->limbs >= b->limbs) {
mpn_mul(tmp, a->data, a->limbs, b->data, b->limbs);
- else
+ } else {
mpn_mul(tmp, b->data, b->limbs, a->data, a->limbs);
+ }
r->limbs = a->limbs + b->limbs;
- if (r->limbs > 1 && tmp[r->limbs - 1]==0) r->limbs--;
+ if (r->limbs > 1 && tmp[r->limbs - 1]==0) {
+ r->limbs--;
+ }
VERIFY_CHECK(r->limbs <= 2*NUM_LIMBS);
mpn_copyi(r->data, tmp, r->limbs);
r->neg = a->neg ^ b->neg;
@@ -227,7 +248,9 @@ static void secp256k1_num_shift(secp256k1_num_t *r, int bits) {
}
}
}
- while (r->limbs>1 && r->data[r->limbs-1]==0) r->limbs--;
+ while (r->limbs>1 && r->data[r->limbs-1]==0) {
+ r->limbs--;
+ }
}
static void secp256k1_num_negate(secp256k1_num_t *r) {
diff --git a/src/secp256k1/src/scalar_impl.h b/src/secp256k1/src/scalar_impl.h
index 3acbe264ae..33824983e4 100644
--- a/src/secp256k1/src/scalar_impl.h
+++ b/src/secp256k1/src/scalar_impl.h
@@ -69,130 +69,168 @@ static void secp256k1_scalar_inverse(secp256k1_scalar_t *r, const secp256k1_scal
secp256k1_scalar_mul(&x8, &x8, x);
secp256k1_scalar_sqr(&x15, &x8);
- for (i = 0; i < 6; i++)
+ for (i = 0; i < 6; i++) {
secp256k1_scalar_sqr(&x15, &x15);
+ }
secp256k1_scalar_mul(&x15, &x15, &x7);
secp256k1_scalar_sqr(&x30, &x15);
- for (i = 0; i < 14; i++)
+ for (i = 0; i < 14; i++) {
secp256k1_scalar_sqr(&x30, &x30);
+ }
secp256k1_scalar_mul(&x30, &x30, &x15);
secp256k1_scalar_sqr(&x60, &x30);
- for (i = 0; i < 29; i++)
+ for (i = 0; i < 29; i++) {
secp256k1_scalar_sqr(&x60, &x60);
+ }
secp256k1_scalar_mul(&x60, &x60, &x30);
secp256k1_scalar_sqr(&x120, &x60);
- for (i = 0; i < 59; i++)
+ for (i = 0; i < 59; i++) {
secp256k1_scalar_sqr(&x120, &x120);
+ }
secp256k1_scalar_mul(&x120, &x120, &x60);
secp256k1_scalar_sqr(&x127, &x120);
- for (i = 0; i < 6; i++)
+ for (i = 0; i < 6; i++) {
secp256k1_scalar_sqr(&x127, &x127);
+ }
secp256k1_scalar_mul(&x127, &x127, &x7);
/* Then accumulate the final result (t starts at x127). */
t = &x127;
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 4; i++) /* 0 */
+ for (i = 0; i < 4; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x3); /* 111 */
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 4; i++) /* 0 */
+ for (i = 0; i < 4; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x3); /* 111 */
- for (i = 0; i < 3; i++) /* 0 */
+ for (i = 0; i < 3; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x2); /* 11 */
- for (i = 0; i < 4; i++) /* 0 */
+ for (i = 0; i < 4; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x3); /* 111 */
- for (i = 0; i < 5; i++) /* 00 */
+ for (i = 0; i < 5; i++) { /* 00 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x3); /* 111 */
- for (i = 0; i < 4; i++) /* 00 */
+ for (i = 0; i < 4; i++) { /* 00 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x2); /* 11 */
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 5; i++) /* 0 */
+ for (i = 0; i < 5; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x4); /* 1111 */
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 3; i++) /* 00 */
+ for (i = 0; i < 3; i++) { /* 00 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 4; i++) /* 000 */
+ for (i = 0; i < 4; i++) { /* 000 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 10; i++) /* 0000000 */
+ for (i = 0; i < 10; i++) { /* 0000000 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x3); /* 111 */
- for (i = 0; i < 4; i++) /* 0 */
+ for (i = 0; i < 4; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x3); /* 111 */
- for (i = 0; i < 9; i++) /* 0 */
+ for (i = 0; i < 9; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x8); /* 11111111 */
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 3; i++) /* 00 */
+ for (i = 0; i < 3; i++) { /* 00 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 3; i++) /* 00 */
+ for (i = 0; i < 3; i++) { /* 00 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 5; i++) /* 0 */
+ for (i = 0; i < 5; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x4); /* 1111 */
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 5; i++) /* 000 */
+ for (i = 0; i < 5; i++) { /* 000 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x2); /* 11 */
- for (i = 0; i < 4; i++) /* 00 */
+ for (i = 0; i < 4; i++) { /* 00 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x2); /* 11 */
- for (i = 0; i < 2; i++) /* 0 */
+ for (i = 0; i < 2; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 8; i++) /* 000000 */
+ for (i = 0; i < 8; i++) { /* 000000 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x2); /* 11 */
- for (i = 0; i < 3; i++) /* 0 */
+ for (i = 0; i < 3; i++) { /* 0 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, &x2); /* 11 */
- for (i = 0; i < 3; i++) /* 00 */
+ for (i = 0; i < 3; i++) { /* 00 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 6; i++) /* 00000 */
+ for (i = 0; i < 6; i++) { /* 00000 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(t, t, x); /* 1 */
- for (i = 0; i < 8; i++) /* 00 */
+ for (i = 0; i < 8; i++) { /* 00 */
secp256k1_scalar_sqr(t, t);
+ }
secp256k1_scalar_mul(r, t, &x6); /* 111111 */
}
diff --git a/src/secp256k1/src/secp256k1.c b/src/secp256k1/src/secp256k1.c
index 8c4eca4b62..d6192dc4ed 100644
--- a/src/secp256k1/src/secp256k1.c
+++ b/src/secp256k1/src/secp256k1.c
@@ -1,5 +1,5 @@
/**********************************************************************
- * Copyright (c) 2013, 2014 Pieter Wuille *
+ * Copyright (c) 2013-2015 Pieter Wuille *
* Distributed under the MIT software license, see the accompanying *
* file COPYING or http://www.opensource.org/licenses/mit-license.php.*
**********************************************************************/
@@ -19,26 +19,48 @@
#include "eckey_impl.h"
#include "hash_impl.h"
-void secp256k1_start(unsigned int flags) {
- if (flags & SECP256K1_START_SIGN) {
- secp256k1_ecmult_gen_start();
+struct secp256k1_context_struct {
+ secp256k1_ecmult_context_t ecmult_ctx;
+ secp256k1_ecmult_gen_context_t ecmult_gen_ctx;
+};
+
+secp256k1_context_t* secp256k1_context_create(int flags) {
+ secp256k1_context_t* ret = (secp256k1_context_t*)checked_malloc(sizeof(secp256k1_context_t));
+
+ secp256k1_ecmult_context_init(&ret->ecmult_ctx);
+ secp256k1_ecmult_gen_context_init(&ret->ecmult_gen_ctx);
+
+ if (flags & SECP256K1_CONTEXT_SIGN) {
+ secp256k1_ecmult_gen_context_build(&ret->ecmult_gen_ctx);
}
- if (flags & SECP256K1_START_VERIFY) {
- secp256k1_ecmult_start();
+ if (flags & SECP256K1_CONTEXT_VERIFY) {
+ secp256k1_ecmult_context_build(&ret->ecmult_ctx);
}
+
+ return ret;
}
-void secp256k1_stop(void) {
- secp256k1_ecmult_stop();
- secp256k1_ecmult_gen_stop();
+secp256k1_context_t* secp256k1_context_clone(const secp256k1_context_t* ctx) {
+ secp256k1_context_t* ret = (secp256k1_context_t*)checked_malloc(sizeof(secp256k1_context_t));
+ secp256k1_ecmult_context_clone(&ret->ecmult_ctx, &ctx->ecmult_ctx);
+ secp256k1_ecmult_gen_context_clone(&ret->ecmult_gen_ctx, &ctx->ecmult_gen_ctx);
+ return ret;
}
-int secp256k1_ecdsa_verify(const unsigned char *msg32, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) {
+void secp256k1_context_destroy(secp256k1_context_t* ctx) {
+ secp256k1_ecmult_context_clear(&ctx->ecmult_ctx);
+ secp256k1_ecmult_gen_context_clear(&ctx->ecmult_gen_ctx);
+
+ free(ctx);
+}
+
+int secp256k1_ecdsa_verify(const secp256k1_context_t* ctx, const unsigned char *msg32, const unsigned char *sig, int siglen, const unsigned char *pubkey, int pubkeylen) {
secp256k1_ge_t q;
secp256k1_ecdsa_sig_t s;
secp256k1_scalar_t m;
int ret = -3;
- DEBUG_CHECK(secp256k1_ecmult_consts != NULL);
+ DEBUG_CHECK(ctx != NULL);
+ DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));
DEBUG_CHECK(msg32 != NULL);
DEBUG_CHECK(sig != NULL);
DEBUG_CHECK(pubkey != NULL);
@@ -47,7 +69,7 @@ int secp256k1_ecdsa_verify(const unsigned char *msg32, const unsigned char *sig,
if (secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen)) {
if (secp256k1_ecdsa_sig_parse(&s, sig, siglen)) {
- if (secp256k1_ecdsa_sig_verify(&s, &q, &m)) {
+ if (secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &s, &q, &m)) {
/* success is 1, all other values are fail */
ret = 1;
} else {
@@ -66,7 +88,7 @@ int secp256k1_ecdsa_verify(const unsigned char *msg32, const unsigned char *sig,
static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) {
secp256k1_rfc6979_hmac_sha256_t rng;
unsigned int i;
- secp256k1_rfc6979_hmac_sha256_initialize(&rng, key32, 32, msg32, 32, data, data != NULL ? 32 : 0);
+ secp256k1_rfc6979_hmac_sha256_initialize(&rng, key32, 32, msg32, 32, (const unsigned char*)data, data != NULL ? 32 : 0);
for (i = 0; i <= counter; i++) {
secp256k1_rfc6979_hmac_sha256_generate(&rng, nonce32, 32);
}
@@ -77,13 +99,14 @@ static int nonce_function_rfc6979(unsigned char *nonce32, const unsigned char *m
const secp256k1_nonce_function_t secp256k1_nonce_function_rfc6979 = nonce_function_rfc6979;
const secp256k1_nonce_function_t secp256k1_nonce_function_default = nonce_function_rfc6979;
-int secp256k1_ecdsa_sign(const unsigned char *msg32, unsigned char *signature, int *signaturelen, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata) {
+int secp256k1_ecdsa_sign(const secp256k1_context_t* ctx, const unsigned char *msg32, unsigned char *signature, int *signaturelen, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata) {
secp256k1_ecdsa_sig_t sig;
secp256k1_scalar_t sec, non, msg;
int ret = 0;
int overflow = 0;
unsigned int count = 0;
- DEBUG_CHECK(secp256k1_ecmult_gen_consts != NULL);
+ DEBUG_CHECK(ctx != NULL);
+ DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));
DEBUG_CHECK(msg32 != NULL);
DEBUG_CHECK(signature != NULL);
DEBUG_CHECK(signaturelen != NULL);
@@ -105,7 +128,7 @@ int secp256k1_ecdsa_sign(const unsigned char *msg32, unsigned char *signature, i
secp256k1_scalar_set_b32(&non, nonce32, &overflow);
memset(nonce32, 0, 32);
if (!secp256k1_scalar_is_zero(&non) && !overflow) {
- if (secp256k1_ecdsa_sig_sign(&sig, &sec, &msg, &non, NULL)) {
+ if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &sig, &sec, &msg, &non, NULL)) {
break;
}
}
@@ -124,13 +147,14 @@ int secp256k1_ecdsa_sign(const unsigned char *msg32, unsigned char *signature, i
return ret;
}
-int secp256k1_ecdsa_sign_compact(const unsigned char *msg32, unsigned char *sig64, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata, int *recid) {
+int secp256k1_ecdsa_sign_compact(const secp256k1_context_t* ctx, const unsigned char *msg32, unsigned char *sig64, const unsigned char *seckey, secp256k1_nonce_function_t noncefp, const void* noncedata, int *recid) {
secp256k1_ecdsa_sig_t sig;
secp256k1_scalar_t sec, non, msg;
int ret = 0;
int overflow = 0;
unsigned int count = 0;
- DEBUG_CHECK(secp256k1_ecmult_gen_consts != NULL);
+ DEBUG_CHECK(ctx != NULL);
+ DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));
DEBUG_CHECK(msg32 != NULL);
DEBUG_CHECK(sig64 != NULL);
DEBUG_CHECK(seckey != NULL);
@@ -151,7 +175,7 @@ int secp256k1_ecdsa_sign_compact(const unsigned char *msg32, unsigned char *sig6
secp256k1_scalar_set_b32(&non, nonce32, &overflow);
memset(nonce32, 0, 32);
if (!secp256k1_scalar_is_zero(&non) && !overflow) {
- if (secp256k1_ecdsa_sig_sign(&sig, &sec, &msg, &non, recid)) {
+ if (secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, &sig, &sec, &msg, &non, recid)) {
break;
}
}
@@ -171,13 +195,14 @@ int secp256k1_ecdsa_sign_compact(const unsigned char *msg32, unsigned char *sig6
return ret;
}
-int secp256k1_ecdsa_recover_compact(const unsigned char *msg32, const unsigned char *sig64, unsigned char *pubkey, int *pubkeylen, int compressed, int recid) {
+int secp256k1_ecdsa_recover_compact(const secp256k1_context_t* ctx, const unsigned char *msg32, const unsigned char *sig64, unsigned char *pubkey, int *pubkeylen, int compressed, int recid) {
secp256k1_ge_t q;
secp256k1_ecdsa_sig_t sig;
secp256k1_scalar_t m;
int ret = 0;
int overflow = 0;
- DEBUG_CHECK(secp256k1_ecmult_consts != NULL);
+ DEBUG_CHECK(ctx != NULL);
+ DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));
DEBUG_CHECK(msg32 != NULL);
DEBUG_CHECK(sig64 != NULL);
DEBUG_CHECK(pubkey != NULL);
@@ -190,7 +215,7 @@ int secp256k1_ecdsa_recover_compact(const unsigned char *msg32, const unsigned c
if (!overflow) {
secp256k1_scalar_set_b32(&m, msg32, NULL);
- if (secp256k1_ecdsa_sig_recover(&sig, &q, &m, recid)) {
+ if (secp256k1_ecdsa_sig_recover(&ctx->ecmult_ctx, &sig, &q, &m, recid)) {
ret = secp256k1_eckey_pubkey_serialize(&q, pubkey, pubkeylen, compressed);
}
}
@@ -198,11 +223,13 @@ int secp256k1_ecdsa_recover_compact(const unsigned char *msg32, const unsigned c
return ret;
}
-int secp256k1_ec_seckey_verify(const unsigned char *seckey) {
+int secp256k1_ec_seckey_verify(const secp256k1_context_t* ctx, const unsigned char *seckey) {
secp256k1_scalar_t sec;
int ret;
int overflow;
+ DEBUG_CHECK(ctx != NULL);
DEBUG_CHECK(seckey != NULL);
+ (void)ctx;
secp256k1_scalar_set_b32(&sec, seckey, &overflow);
ret = !secp256k1_scalar_is_zero(&sec) && !overflow;
@@ -210,27 +237,30 @@ int secp256k1_ec_seckey_verify(const unsigned char *seckey) {
return ret;
}
-int secp256k1_ec_pubkey_verify(const unsigned char *pubkey, int pubkeylen) {
+int secp256k1_ec_pubkey_verify(const secp256k1_context_t* ctx, const unsigned char *pubkey, int pubkeylen) {
secp256k1_ge_t q;
+ DEBUG_CHECK(ctx != NULL);
DEBUG_CHECK(pubkey != NULL);
+ (void)ctx;
return secp256k1_eckey_pubkey_parse(&q, pubkey, pubkeylen);
}
-int secp256k1_ec_pubkey_create(unsigned char *pubkey, int *pubkeylen, const unsigned char *seckey, int compressed) {
+int secp256k1_ec_pubkey_create(const secp256k1_context_t* ctx, unsigned char *pubkey, int *pubkeylen, const unsigned char *seckey, int compressed) {
secp256k1_gej_t pj;
secp256k1_ge_t p;
secp256k1_scalar_t sec;
int overflow;
int ret = 0;
- DEBUG_CHECK(secp256k1_ecmult_gen_consts != NULL);
+ DEBUG_CHECK(ctx != NULL);
+ DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));
DEBUG_CHECK(pubkey != NULL);
DEBUG_CHECK(pubkeylen != NULL);
DEBUG_CHECK(seckey != NULL);
secp256k1_scalar_set_b32(&sec, seckey, &overflow);
if (!overflow) {
- secp256k1_ecmult_gen(&pj, &sec);
+ secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pj, &sec);
secp256k1_scalar_clear(&sec);
secp256k1_ge_set_gej(&p, &pj);
ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, compressed);
@@ -241,11 +271,12 @@ int secp256k1_ec_pubkey_create(unsigned char *pubkey, int *pubkeylen, const unsi
return ret;
}
-int secp256k1_ec_pubkey_decompress(unsigned char *pubkey, int *pubkeylen) {
+int secp256k1_ec_pubkey_decompress(const secp256k1_context_t* ctx, unsigned char *pubkey, int *pubkeylen) {
secp256k1_ge_t p;
int ret = 0;
DEBUG_CHECK(pubkey != NULL);
DEBUG_CHECK(pubkeylen != NULL);
+ (void)ctx;
if (secp256k1_eckey_pubkey_parse(&p, pubkey, *pubkeylen)) {
ret = secp256k1_eckey_pubkey_serialize(&p, pubkey, pubkeylen, 0);
@@ -253,13 +284,15 @@ int secp256k1_ec_pubkey_decompress(unsigned char *pubkey, int *pubkeylen) {
return ret;
}
-int secp256k1_ec_privkey_tweak_add(unsigned char *seckey, const unsigned char *tweak) {
+int secp256k1_ec_privkey_tweak_add(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *tweak) {
secp256k1_scalar_t term;
secp256k1_scalar_t sec;
int ret = 0;
int overflow = 0;
+ DEBUG_CHECK(ctx != NULL);
DEBUG_CHECK(seckey != NULL);
DEBUG_CHECK(tweak != NULL);
+ (void)ctx;
secp256k1_scalar_set_b32(&term, tweak, &overflow);
secp256k1_scalar_set_b32(&sec, seckey, NULL);
@@ -274,12 +307,13 @@ int secp256k1_ec_privkey_tweak_add(unsigned char *seckey, const unsigned char *t
return ret;
}
-int secp256k1_ec_pubkey_tweak_add(unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) {
+int secp256k1_ec_pubkey_tweak_add(const secp256k1_context_t* ctx, unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) {
secp256k1_ge_t p;
secp256k1_scalar_t term;
int ret = 0;
int overflow = 0;
- DEBUG_CHECK(secp256k1_ecmult_consts != NULL);
+ DEBUG_CHECK(ctx != NULL);
+ DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));
DEBUG_CHECK(pubkey != NULL);
DEBUG_CHECK(tweak != NULL);
@@ -287,7 +321,7 @@ int secp256k1_ec_pubkey_tweak_add(unsigned char *pubkey, int pubkeylen, const un
if (!overflow) {
ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen);
if (ret) {
- ret = secp256k1_eckey_pubkey_tweak_add(&p, &term);
+ ret = secp256k1_eckey_pubkey_tweak_add(&ctx->ecmult_ctx, &p, &term);
}
if (ret) {
int oldlen = pubkeylen;
@@ -299,13 +333,15 @@ int secp256k1_ec_pubkey_tweak_add(unsigned char *pubkey, int pubkeylen, const un
return ret;
}
-int secp256k1_ec_privkey_tweak_mul(unsigned char *seckey, const unsigned char *tweak) {
+int secp256k1_ec_privkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *tweak) {
secp256k1_scalar_t factor;
secp256k1_scalar_t sec;
int ret = 0;
int overflow = 0;
+ DEBUG_CHECK(ctx != NULL);
DEBUG_CHECK(seckey != NULL);
DEBUG_CHECK(tweak != NULL);
+ (void)ctx;
secp256k1_scalar_set_b32(&factor, tweak, &overflow);
secp256k1_scalar_set_b32(&sec, seckey, NULL);
@@ -319,12 +355,13 @@ int secp256k1_ec_privkey_tweak_mul(unsigned char *seckey, const unsigned char *t
return ret;
}
-int secp256k1_ec_pubkey_tweak_mul(unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) {
+int secp256k1_ec_pubkey_tweak_mul(const secp256k1_context_t* ctx, unsigned char *pubkey, int pubkeylen, const unsigned char *tweak) {
secp256k1_ge_t p;
secp256k1_scalar_t factor;
int ret = 0;
int overflow = 0;
- DEBUG_CHECK(secp256k1_ecmult_consts != NULL);
+ DEBUG_CHECK(ctx != NULL);
+ DEBUG_CHECK(secp256k1_ecmult_context_is_built(&ctx->ecmult_ctx));
DEBUG_CHECK(pubkey != NULL);
DEBUG_CHECK(tweak != NULL);
@@ -332,7 +369,7 @@ int secp256k1_ec_pubkey_tweak_mul(unsigned char *pubkey, int pubkeylen, const un
if (!overflow) {
ret = secp256k1_eckey_pubkey_parse(&p, pubkey, pubkeylen);
if (ret) {
- ret = secp256k1_eckey_pubkey_tweak_mul(&p, &factor);
+ ret = secp256k1_eckey_pubkey_tweak_mul(&ctx->ecmult_ctx, &p, &factor);
}
if (ret) {
int oldlen = pubkeylen;
@@ -344,24 +381,27 @@ int secp256k1_ec_pubkey_tweak_mul(unsigned char *pubkey, int pubkeylen, const un
return ret;
}
-int secp256k1_ec_privkey_export(const unsigned char *seckey, unsigned char *privkey, int *privkeylen, int compressed) {
+int secp256k1_ec_privkey_export(const secp256k1_context_t* ctx, const unsigned char *seckey, unsigned char *privkey, int *privkeylen, int compressed) {
secp256k1_scalar_t key;
int ret = 0;
DEBUG_CHECK(seckey != NULL);
DEBUG_CHECK(privkey != NULL);
DEBUG_CHECK(privkeylen != NULL);
+ DEBUG_CHECK(ctx != NULL);
+ DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));
secp256k1_scalar_set_b32(&key, seckey, NULL);
- ret = secp256k1_eckey_privkey_serialize(privkey, privkeylen, &key, compressed);
+ ret = secp256k1_eckey_privkey_serialize(&ctx->ecmult_gen_ctx, privkey, privkeylen, &key, compressed);
secp256k1_scalar_clear(&key);
return ret;
}
-int secp256k1_ec_privkey_import(unsigned char *seckey, const unsigned char *privkey, int privkeylen) {
+int secp256k1_ec_privkey_import(const secp256k1_context_t* ctx, unsigned char *seckey, const unsigned char *privkey, int privkeylen) {
secp256k1_scalar_t key;
int ret = 0;
DEBUG_CHECK(seckey != NULL);
DEBUG_CHECK(privkey != NULL);
+ (void)ctx;
ret = secp256k1_eckey_privkey_parse(&key, privkey, privkeylen);
if (ret) {
@@ -370,3 +410,10 @@ int secp256k1_ec_privkey_import(unsigned char *seckey, const unsigned char *priv
secp256k1_scalar_clear(&key);
return ret;
}
+
+int secp256k1_context_randomize(secp256k1_context_t* ctx, const unsigned char *seed32) {
+ DEBUG_CHECK(ctx != NULL);
+ DEBUG_CHECK(secp256k1_ecmult_gen_context_is_built(&ctx->ecmult_gen_ctx));
+ secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32);
+ return 1;
+}
diff --git a/src/secp256k1/src/tests.c b/src/secp256k1/src/tests.c
index f7f1acac64..d0e05057f2 100644
--- a/src/secp256k1/src/tests.c
+++ b/src/secp256k1/src/tests.c
@@ -1,5 +1,5 @@
/**********************************************************************
- * Copyright (c) 2013, 2014 Pieter Wuille *
+ * Copyright (c) 2013, 2014, 2015 Pieter Wuille, Gregory Maxwell *
* Distributed under the MIT software license, see the accompanying *
* file COPYING or http://www.opensource.org/licenses/mit-license.php.*
**********************************************************************/
@@ -24,6 +24,7 @@
#endif
static int count = 64;
+static secp256k1_context_t *ctx = NULL;
void random_field_element_test(secp256k1_fe_t *fe) {
do {
@@ -55,8 +56,9 @@ void random_group_element_test(secp256k1_ge_t *ge) {
secp256k1_fe_t fe;
do {
random_field_element_test(&fe);
- if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand32() & 1))
+ if (secp256k1_ge_set_xo_var(ge, &fe, secp256k1_rand32() & 1)) {
break;
+ }
} while(1);
}
@@ -81,8 +83,9 @@ void random_scalar_order_test(secp256k1_scalar_t *num) {
int overflow = 0;
secp256k1_rand256_test(b32);
secp256k1_scalar_set_b32(num, b32, &overflow);
- if (overflow || secp256k1_scalar_is_zero(num))
+ if (overflow || secp256k1_scalar_is_zero(num)) {
continue;
+ }
break;
} while(1);
}
@@ -93,12 +96,60 @@ void random_scalar_order(secp256k1_scalar_t *num) {
int overflow = 0;
secp256k1_rand256(b32);
secp256k1_scalar_set_b32(num, b32, &overflow);
- if (overflow || secp256k1_scalar_is_zero(num))
+ if (overflow || secp256k1_scalar_is_zero(num)) {
continue;
+ }
break;
} while(1);
}
+void run_context_tests(void) {
+ secp256k1_context_t *none = secp256k1_context_create(0);
+ secp256k1_context_t *sign = secp256k1_context_create(SECP256K1_CONTEXT_SIGN);
+ secp256k1_context_t *vrfy = secp256k1_context_create(SECP256K1_CONTEXT_VERIFY);
+ secp256k1_context_t *both = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
+
+ secp256k1_gej_t pubj;
+ secp256k1_ge_t pub;
+ secp256k1_scalar_t msg, key, nonce;
+ secp256k1_ecdsa_sig_t sig;
+
+ /*** clone and destroy all of them to make sure cloning was complete ***/
+ {
+ secp256k1_context_t *ctx_tmp;
+
+ ctx_tmp = none; none = secp256k1_context_clone(none); secp256k1_context_destroy(ctx_tmp);
+ ctx_tmp = sign; sign = secp256k1_context_clone(sign); secp256k1_context_destroy(ctx_tmp);
+ ctx_tmp = vrfy; vrfy = secp256k1_context_clone(vrfy); secp256k1_context_destroy(ctx_tmp);
+ ctx_tmp = both; both = secp256k1_context_clone(both); secp256k1_context_destroy(ctx_tmp);
+ }
+
+ /*** attempt to use them ***/
+ random_scalar_order_test(&msg);
+ random_scalar_order_test(&key);
+ secp256k1_ecmult_gen(&both->ecmult_gen_ctx, &pubj, &key);
+ secp256k1_ge_set_gej(&pub, &pubj);
+
+ /* obtain a working nonce */
+ do {
+ random_scalar_order_test(&nonce);
+ } while(!secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL));
+
+ /* try signing */
+ CHECK(secp256k1_ecdsa_sig_sign(&sign->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL));
+ CHECK(secp256k1_ecdsa_sig_sign(&both->ecmult_gen_ctx, &sig, &key, &msg, &nonce, NULL));
+
+ /* try verifying */
+ CHECK(secp256k1_ecdsa_sig_verify(&vrfy->ecmult_ctx, &sig, &pub, &msg));
+ CHECK(secp256k1_ecdsa_sig_verify(&both->ecmult_ctx, &sig, &pub, &msg));
+
+ /* cleanup */
+ secp256k1_context_destroy(none);
+ secp256k1_context_destroy(sign);
+ secp256k1_context_destroy(vrfy);
+ secp256k1_context_destroy(both);
+}
+
/***** HASH TESTS *****/
void run_sha256_tests(void) {
@@ -229,8 +280,9 @@ void run_rfc6979_hmac_sha256_tests(void) {
#ifndef USE_NUM_NONE
void random_num_negate(secp256k1_num_t *num) {
- if (secp256k1_rand32() & 1)
+ if (secp256k1_rand32() & 1) {
secp256k1_num_negate(num);
+ }
}
void random_num_order_test(secp256k1_num_t *num) {
@@ -624,8 +676,9 @@ void random_fe_non_zero(secp256k1_fe_t *nz) {
while (--tries >= 0) {
random_fe(nz);
secp256k1_fe_normalize(nz);
- if (!secp256k1_fe_is_zero(nz))
+ if (!secp256k1_fe_is_zero(nz)) {
break;
+ }
}
/* Infinitesimal probability of spurious failure here */
CHECK(tries >= 0);
@@ -700,12 +753,22 @@ void run_field_misc(void) {
CHECK(secp256k1_fe_equal_var(&x, &x));
z = x;
secp256k1_fe_add(&z,&y);
- secp256k1_fe_normalize(&z);
+ /* Test fe conditional move; z is not normalized here. */
+ q = x;
+ secp256k1_fe_cmov(&x, &z, 0);
+ secp256k1_fe_cmov(&x, &x, 1);
+ CHECK(memcmp(&x, &z, sizeof(x)) != 0);
+ CHECK(memcmp(&x, &q, sizeof(x)) == 0);
+ secp256k1_fe_cmov(&q, &z, 1);
+ CHECK(memcmp(&q, &z, sizeof(q)) == 0);
/* Test storage conversion and conditional moves. */
+ secp256k1_fe_normalize(&z);
+ CHECK(!secp256k1_fe_equal_var(&x, &z));
secp256k1_fe_to_storage(&xs, &x);
secp256k1_fe_to_storage(&ys, &y);
secp256k1_fe_to_storage(&zs, &z);
secp256k1_fe_storage_cmov(&zs, &xs, 0);
+ secp256k1_fe_storage_cmov(&zs, &zs, 1);
CHECK(memcmp(&xs, &zs, sizeof(xs)) != 0);
secp256k1_fe_storage_cmov(&ys, &xs, 1);
CHECK(memcmp(&xs, &ys, sizeof(xs)) == 0);
@@ -765,14 +828,17 @@ void run_field_inv_all_var(void) {
for (i = 0; i < count; i++) {
size_t j;
size_t len = (secp256k1_rand32() & 15) + 1;
- for (j = 0; j < len; j++)
+ for (j = 0; j < len; j++) {
random_fe_non_zero(&x[j]);
+ }
secp256k1_fe_inv_all_var(len, xi, x);
- for (j = 0; j < len; j++)
+ for (j = 0; j < len; j++) {
CHECK(check_fe_inverse(&x[j], &xi[j]));
+ }
secp256k1_fe_inv_all_var(len, xii, xi);
- for (j = 0; j < len; j++)
+ for (j = 0; j < len; j++) {
CHECK(check_fe_equal(&x[j], &xii[j]));
+ }
}
}
@@ -844,18 +910,42 @@ void run_sqrt(void) {
void ge_equals_ge(const secp256k1_ge_t *a, const secp256k1_ge_t *b) {
CHECK(a->infinity == b->infinity);
- if (a->infinity)
+ if (a->infinity) {
return;
+ }
CHECK(secp256k1_fe_equal_var(&a->x, &b->x));
CHECK(secp256k1_fe_equal_var(&b->y, &b->y));
}
+/* This compares jacobian points including their Z, not just their geometric meaning. */
+int gej_xyz_equals_gej(const secp256k1_gej_t *a, const secp256k1_gej_t *b) {
+ secp256k1_gej_t a2;
+ secp256k1_gej_t b2;
+ int ret = 1;
+ ret &= a->infinity == b->infinity;
+ if (ret && !a->infinity) {
+ a2 = *a;
+ b2 = *b;
+ secp256k1_fe_normalize(&a2.x);
+ secp256k1_fe_normalize(&a2.y);
+ secp256k1_fe_normalize(&a2.z);
+ secp256k1_fe_normalize(&b2.x);
+ secp256k1_fe_normalize(&b2.y);
+ secp256k1_fe_normalize(&b2.z);
+ ret &= secp256k1_fe_cmp_var(&a2.x, &b2.x) == 0;
+ ret &= secp256k1_fe_cmp_var(&a2.y, &b2.y) == 0;
+ ret &= secp256k1_fe_cmp_var(&a2.z, &b2.z) == 0;
+ }
+ return ret;
+}
+
void ge_equals_gej(const secp256k1_ge_t *a, const secp256k1_gej_t *b) {
secp256k1_fe_t z2s;
secp256k1_fe_t u1, u2, s1, s2;
CHECK(a->infinity == b->infinity);
- if (a->infinity)
+ if (a->infinity) {
return;
+ }
/* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */
secp256k1_fe_sqr(&z2s, &b->z);
secp256k1_fe_mul(&u1, &a->x, &z2s);
@@ -874,8 +964,8 @@ void test_ge(void) {
* All magnitudes are randomized.
* All 17*17 combinations of points are added to eachother, using all applicable methods.
*/
- secp256k1_ge_t *ge = malloc(sizeof(secp256k1_ge_t) * (1 + 4 * runs));
- secp256k1_gej_t *gej = malloc(sizeof(secp256k1_gej_t) * (1 + 4 * runs));
+ secp256k1_ge_t *ge = (secp256k1_ge_t *)malloc(sizeof(secp256k1_ge_t) * (1 + 4 * runs));
+ secp256k1_gej_t *gej = (secp256k1_gej_t *)malloc(sizeof(secp256k1_gej_t) * (1 + 4 * runs));
secp256k1_gej_set_infinity(&gej[0]);
secp256k1_ge_clear(&ge[0]);
secp256k1_ge_set_gej_var(&ge[0], &gej[0]);
@@ -951,7 +1041,7 @@ void test_ge(void) {
/* Test adding all points together in random order equals infinity. */
{
secp256k1_gej_t sum = SECP256K1_GEJ_CONST_INFINITY;
- secp256k1_gej_t *gej_shuffled = malloc((4 * runs + 1) * sizeof(secp256k1_gej_t));
+ secp256k1_gej_t *gej_shuffled = (secp256k1_gej_t *)malloc((4 * runs + 1) * sizeof(secp256k1_gej_t));
for (i = 0; i < 4 * runs + 1; i++) {
gej_shuffled[i] = gej[i];
}
@@ -972,9 +1062,12 @@ void test_ge(void) {
/* Test batch gej -> ge conversion. */
{
- secp256k1_ge_t *ge_set_all = malloc((4 * runs + 1) * sizeof(secp256k1_ge_t));
+ secp256k1_ge_t *ge_set_all = (secp256k1_ge_t *)malloc((4 * runs + 1) * sizeof(secp256k1_ge_t));
secp256k1_ge_set_all_gej_var(4 * runs + 1, ge_set_all, gej);
for (i = 0; i < 4 * runs + 1; i++) {
+ secp256k1_fe_t s;
+ random_fe_non_zero(&s);
+ secp256k1_gej_rescale(&gej[i], &s);
ge_equals_gej(&ge_set_all[i], &gej[i]);
}
free(ge_set_all);
@@ -1025,7 +1118,7 @@ void run_ecmult_chain(void) {
x = a;
for (i = 0; i < 200*count; i++) {
/* in each iteration, compute X = xn*X + gn*G; */
- secp256k1_ecmult(&x, &x, &xn, &gn);
+ secp256k1_ecmult(&ctx->ecmult_ctx, &x, &x, &xn, &gn);
/* also compute ae and ge: the actual accumulated factors for A and G */
/* if X was (ae*A+ge*G), xn*X + gn*G results in (xn*ae*A + (xn*ge+gn)*G) */
secp256k1_scalar_mul(&ae, &ae, &xn);
@@ -1051,7 +1144,7 @@ void run_ecmult_chain(void) {
}
}
/* redo the computation, but directly with the resulting ae and ge coefficients: */
- secp256k1_ecmult(&x2, &a, &ae, &ge);
+ secp256k1_ecmult(&ctx->ecmult_ctx, &x2, &a, &ae, &ge);
secp256k1_gej_neg(&x2, &x2);
secp256k1_gej_add_var(&x2, &x2, &x);
CHECK(secp256k1_gej_is_infinity(&x2));
@@ -1067,8 +1160,8 @@ void test_point_times_order(const secp256k1_gej_t *point) {
int psize = 65;
random_scalar_order_test(&x);
secp256k1_scalar_negate(&nx, &x);
- secp256k1_ecmult(&res1, point, &x, &x); /* calc res1 = x * point + x * G; */
- secp256k1_ecmult(&res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */
+ secp256k1_ecmult(&ctx->ecmult_ctx, &res1, point, &x, &x); /* calc res1 = x * point + x * G; */
+ secp256k1_ecmult(&ctx->ecmult_ctx, &res2, point, &nx, &nx); /* calc res2 = (order - x) * point + (order - x) * G; */
secp256k1_gej_add_var(&res1, &res1, &res2);
CHECK(secp256k1_gej_is_infinity(&res1));
CHECK(secp256k1_gej_is_valid_var(&res1) == 0);
@@ -1141,17 +1234,96 @@ void run_wnaf(void) {
secp256k1_scalar_t n;
for (i = 0; i < count; i++) {
random_scalar_order(&n);
- if (i % 1)
- secp256k1_scalar_negate(&n, &n);
test_wnaf(&n, 4+(i%10));
}
}
+void test_ecmult_constants(void) {
+ /* Test ecmult_gen() for [0..36) and [order-36..0). */
+ secp256k1_scalar_t x;
+ secp256k1_gej_t r;
+ secp256k1_ge_t ng;
+ int i;
+ int j;
+ secp256k1_ge_neg(&ng, &secp256k1_ge_const_g);
+ for (i = 0; i < 36; i++ ) {
+ secp256k1_scalar_set_int(&x, i);
+ secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x);
+ for (j = 0; j < i; j++) {
+ if (j == i - 1) {
+ ge_equals_gej(&secp256k1_ge_const_g, &r);
+ }
+ secp256k1_gej_add_ge(&r, &r, &ng);
+ }
+ CHECK(secp256k1_gej_is_infinity(&r));
+ }
+ for (i = 1; i <= 36; i++ ) {
+ secp256k1_scalar_set_int(&x, i);
+ secp256k1_scalar_negate(&x, &x);
+ secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &r, &x);
+ for (j = 0; j < i; j++) {
+ if (j == i - 1) {
+ ge_equals_gej(&ng, &r);
+ }
+ secp256k1_gej_add_ge(&r, &r, &secp256k1_ge_const_g);
+ }
+ CHECK(secp256k1_gej_is_infinity(&r));
+ }
+}
+
+void run_ecmult_constants(void) {
+ test_ecmult_constants();
+}
+
+void test_ecmult_gen_blind(void) {
+ /* Test ecmult_gen() blinding and confirm that the blinding changes, the affline points match, and the z's don't match. */
+ secp256k1_scalar_t key;
+ secp256k1_scalar_t b;
+ unsigned char seed32[32];
+ secp256k1_gej_t pgej;
+ secp256k1_gej_t pgej2;
+ secp256k1_gej_t i;
+ secp256k1_ge_t pge;
+ random_scalar_order_test(&key);
+ secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej, &key);
+ secp256k1_rand256(seed32);
+ b = ctx->ecmult_gen_ctx.blind;
+ i = ctx->ecmult_gen_ctx.initial;
+ secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, seed32);
+ CHECK(!secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind));
+ secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pgej2, &key);
+ CHECK(!gej_xyz_equals_gej(&pgej, &pgej2));
+ CHECK(!gej_xyz_equals_gej(&i, &ctx->ecmult_gen_ctx.initial));
+ secp256k1_ge_set_gej(&pge, &pgej);
+ ge_equals_gej(&pge, &pgej2);
+}
+
+void test_ecmult_gen_blind_reset(void) {
+ /* Test ecmult_gen() blinding reset and confirm that the blinding is consistent. */
+ secp256k1_scalar_t b;
+ secp256k1_gej_t initial;
+ secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0);
+ b = ctx->ecmult_gen_ctx.blind;
+ initial = ctx->ecmult_gen_ctx.initial;
+ secp256k1_ecmult_gen_blind(&ctx->ecmult_gen_ctx, 0);
+ CHECK(secp256k1_scalar_eq(&b, &ctx->ecmult_gen_ctx.blind));
+ CHECK(gej_xyz_equals_gej(&initial, &ctx->ecmult_gen_ctx.initial));
+}
+
+void run_ecmult_gen_blind(void) {
+ int i;
+ test_ecmult_gen_blind_reset();
+ for (i = 0; i < 10; i++) {
+ test_ecmult_gen_blind();
+ }
+}
+
+
void random_sign(secp256k1_ecdsa_sig_t *sig, const secp256k1_scalar_t *key, const secp256k1_scalar_t *msg, int *recid) {
secp256k1_scalar_t nonce;
do {
random_scalar_order_test(&nonce);
- } while(!secp256k1_ecdsa_sig_sign(sig, key, msg, &nonce, recid));
+ } while(!secp256k1_ecdsa_sig_sign(&ctx->ecmult_gen_ctx, sig, key, msg, &nonce, recid));
}
void test_ecdsa_sign_verify(void) {
@@ -1164,15 +1336,17 @@ void test_ecdsa_sign_verify(void) {
int getrec;
random_scalar_order_test(&msg);
random_scalar_order_test(&key);
- secp256k1_ecmult_gen(&pubj, &key);
+ secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &pubj, &key);
secp256k1_ge_set_gej(&pub, &pubj);
getrec = secp256k1_rand32()&1;
random_sign(&sig, &key, &msg, getrec?&recid:NULL);
- if (getrec) CHECK(recid >= 0 && recid < 4);
- CHECK(secp256k1_ecdsa_sig_verify(&sig, &pub, &msg));
+ if (getrec) {
+ CHECK(recid >= 0 && recid < 4);
+ }
+ CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &pub, &msg));
secp256k1_scalar_set_int(&one, 1);
secp256k1_scalar_add(&msg, &msg, &one);
- CHECK(!secp256k1_ecdsa_sig_verify(&sig, &pub, &msg));
+ CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &pub, &msg));
}
void run_ecdsa_sign_verify(void) {
@@ -1192,7 +1366,9 @@ static int precomputed_nonce_function(unsigned char *nonce32, const unsigned cha
static int nonce_function_test_fail(unsigned char *nonce32, const unsigned char *msg32, const unsigned char *key32, unsigned int counter, const void *data) {
/* Dummy nonce generator that has a fatal error on the first counter value. */
- if (counter == 0) return 0;
+ if (counter == 0) {
+ return 0;
+ }
return nonce_function_rfc6979(nonce32, msg32, key32, counter - 1, data);
}
@@ -1200,7 +1376,9 @@ static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char
/* Dummy nonce generator that produces unacceptable nonces for the first several counter values. */
if (counter < 3) {
memset(nonce32, counter==0 ? 0 : 255, 32);
- if (counter == 2) nonce32[31]--;
+ if (counter == 2) {
+ nonce32[31]--;
+ }
return 1;
}
if (counter < 5) {
@@ -1211,12 +1389,16 @@ static int nonce_function_test_retry(unsigned char *nonce32, const unsigned char
0xBF,0xD2,0x5E,0x8C,0xD0,0x36,0x41,0x41
};
memcpy(nonce32, order, 32);
- if (counter == 4) nonce32[31]++;
+ if (counter == 4) {
+ nonce32[31]++;
+ }
return 1;
}
/* Retry rate of 6979 is negligible esp. as we only call this in determinstic tests. */
/* If someone does fine a case where it retries for secp256k1, we'd like to know. */
- if (counter > 5) return 0;
+ if (counter > 5) {
+ return 0;
+ }
return nonce_function_rfc6979(nonce32, msg32, key32, counter - 5, data);
}
@@ -1257,16 +1439,16 @@ void test_ecdsa_end_to_end(void) {
}
/* Construct and verify corresponding public key. */
- CHECK(secp256k1_ec_seckey_verify(privkey) == 1);
- CHECK(secp256k1_ec_pubkey_create(pubkey, &pubkeylen, privkey, (secp256k1_rand32() & 3) != 0) == 1);
+ CHECK(secp256k1_ec_seckey_verify(ctx, privkey) == 1);
+ CHECK(secp256k1_ec_pubkey_create(ctx, pubkey, &pubkeylen, privkey, (secp256k1_rand32() & 3) != 0) == 1);
if (secp256k1_rand32() & 1) {
- CHECK(secp256k1_ec_pubkey_decompress(pubkey, &pubkeylen));
+ CHECK(secp256k1_ec_pubkey_decompress(ctx, pubkey, &pubkeylen));
}
- CHECK(secp256k1_ec_pubkey_verify(pubkey, pubkeylen));
+ CHECK(secp256k1_ec_pubkey_verify(ctx, pubkey, pubkeylen));
/* Verify private key import and export. */
- CHECK(secp256k1_ec_privkey_export(privkey, seckey, &seckeylen, secp256k1_rand32() % 2) == 1);
- CHECK(secp256k1_ec_privkey_import(privkey2, seckey, seckeylen) == 1);
+ CHECK(secp256k1_ec_privkey_export(ctx, privkey, seckey, &seckeylen, secp256k1_rand32() % 2) == 1);
+ CHECK(secp256k1_ec_privkey_import(ctx, privkey2, seckey, seckeylen) == 1);
CHECK(memcmp(privkey, privkey2, 32) == 0);
/* Optionally tweak the keys using addition. */
@@ -1277,11 +1459,13 @@ void test_ecdsa_end_to_end(void) {
unsigned char pubkey2[65];
int pubkeylen2 = 65;
secp256k1_rand256_test(rnd);
- ret1 = secp256k1_ec_privkey_tweak_add(privkey, rnd);
- ret2 = secp256k1_ec_pubkey_tweak_add(pubkey, pubkeylen, rnd);
+ ret1 = secp256k1_ec_privkey_tweak_add(ctx, privkey, rnd);
+ ret2 = secp256k1_ec_pubkey_tweak_add(ctx, pubkey, pubkeylen, rnd);
CHECK(ret1 == ret2);
- if (ret1 == 0) return;
- CHECK(secp256k1_ec_pubkey_create(pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1);
+ if (ret1 == 0) {
+ return;
+ }
+ CHECK(secp256k1_ec_pubkey_create(ctx, pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1);
CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0);
}
@@ -1293,25 +1477,27 @@ void test_ecdsa_end_to_end(void) {
unsigned char pubkey2[65];
int pubkeylen2 = 65;
secp256k1_rand256_test(rnd);
- ret1 = secp256k1_ec_privkey_tweak_mul(privkey, rnd);
- ret2 = secp256k1_ec_pubkey_tweak_mul(pubkey, pubkeylen, rnd);
+ ret1 = secp256k1_ec_privkey_tweak_mul(ctx, privkey, rnd);
+ ret2 = secp256k1_ec_pubkey_tweak_mul(ctx, pubkey, pubkeylen, rnd);
CHECK(ret1 == ret2);
- if (ret1 == 0) return;
- CHECK(secp256k1_ec_pubkey_create(pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1);
+ if (ret1 == 0) {
+ return;
+ }
+ CHECK(secp256k1_ec_pubkey_create(ctx, pubkey2, &pubkeylen2, privkey, pubkeylen == 33) == 1);
CHECK(memcmp(pubkey, pubkey2, pubkeylen) == 0);
}
/* Sign. */
- CHECK(secp256k1_ecdsa_sign(message, signature, &signaturelen, privkey, NULL, NULL) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, message, signature, &signaturelen, privkey, NULL, NULL) == 1);
CHECK(signaturelen > 0);
- CHECK(secp256k1_ecdsa_sign(message, signature2, &signaturelen2, privkey, NULL, extra) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, message, signature2, &signaturelen2, privkey, NULL, extra) == 1);
CHECK(signaturelen2 > 0);
extra[31] = 1;
- CHECK(secp256k1_ecdsa_sign(message, signature3, &signaturelen3, privkey, NULL, extra) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, message, signature3, &signaturelen3, privkey, NULL, extra) == 1);
CHECK(signaturelen3 > 0);
extra[31] = 0;
extra[0] = 1;
- CHECK(secp256k1_ecdsa_sign(message, signature4, &signaturelen4, privkey, NULL, extra) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, message, signature4, &signaturelen4, privkey, NULL, extra) == 1);
CHECK(signaturelen3 > 0);
CHECK((signaturelen != signaturelen2) || (memcmp(signature, signature2, signaturelen) != 0));
CHECK((signaturelen != signaturelen3) || (memcmp(signature, signature3, signaturelen) != 0));
@@ -1320,24 +1506,24 @@ void test_ecdsa_end_to_end(void) {
CHECK((signaturelen4 != signaturelen2) || (memcmp(signature4, signature2, signaturelen4) != 0));
CHECK((signaturelen4 != signaturelen) || (memcmp(signature4, signature, signaturelen4) != 0));
/* Verify. */
- CHECK(secp256k1_ecdsa_verify(message, signature, signaturelen, pubkey, pubkeylen) == 1);
- CHECK(secp256k1_ecdsa_verify(message, signature2, signaturelen2, pubkey, pubkeylen) == 1);
- CHECK(secp256k1_ecdsa_verify(message, signature3, signaturelen3, pubkey, pubkeylen) == 1);
- CHECK(secp256k1_ecdsa_verify(message, signature4, signaturelen4, pubkey, pubkeylen) == 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, message, signature, signaturelen, pubkey, pubkeylen) == 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, message, signature2, signaturelen2, pubkey, pubkeylen) == 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, message, signature3, signaturelen3, pubkey, pubkeylen) == 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, message, signature4, signaturelen4, pubkey, pubkeylen) == 1);
/* Destroy signature and verify again. */
signature[signaturelen - 1 - secp256k1_rand32() % 20] += 1 + (secp256k1_rand32() % 255);
- CHECK(secp256k1_ecdsa_verify(message, signature, signaturelen, pubkey, pubkeylen) != 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, message, signature, signaturelen, pubkey, pubkeylen) != 1);
/* Compact sign. */
- CHECK(secp256k1_ecdsa_sign_compact(message, csignature, privkey, NULL, NULL, &recid) == 1);
+ CHECK(secp256k1_ecdsa_sign_compact(ctx, message, csignature, privkey, NULL, NULL, &recid) == 1);
CHECK(!is_empty_compact_signature(csignature));
/* Recover. */
- CHECK(secp256k1_ecdsa_recover_compact(message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) == 1);
+ CHECK(secp256k1_ecdsa_recover_compact(ctx, message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) == 1);
CHECK(recpubkeylen == pubkeylen);
CHECK(memcmp(pubkey, recpubkey, pubkeylen) == 0);
/* Destroy signature and verify again. */
csignature[secp256k1_rand32() % 64] += 1 + (secp256k1_rand32() % 255);
- CHECK(secp256k1_ecdsa_recover_compact(message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) != 1 ||
+ CHECK(secp256k1_ecdsa_recover_compact(ctx, message, csignature, recpubkey, &recpubkeylen, pubkeylen == 33, recid) != 1 ||
memcmp(pubkey, recpubkey, pubkeylen) != 0);
CHECK(recpubkeylen == pubkeylen);
@@ -1351,7 +1537,9 @@ void test_random_pubkeys(void) {
uint32_t r = secp256k1_rand32();
int len = (r & 3) == 0 ? 65 : 33;
r>>=2;
- if ((r & 3) == 0) len = (r & 252) >> 3;
+ if ((r & 3) == 0) {
+ len = (r & 252) >> 3;
+ }
r>>=8;
if (len == 65) {
in[0] = (r & 2) ? 4 : (r & 1? 6 : 7);
@@ -1359,10 +1547,16 @@ void test_random_pubkeys(void) {
in[0] = (r & 1) ? 2 : 3;
}
r>>=2;
- if ((r & 7) == 0) in[0] = (r & 2040) >> 3;
+ if ((r & 7) == 0) {
+ in[0] = (r & 2040) >> 3;
+ }
r>>=11;
- if (len > 1) secp256k1_rand256(&in[1]);
- if (len > 33) secp256k1_rand256(&in[33]);
+ if (len > 1) {
+ secp256k1_rand256(&in[1]);
+ }
+ if (len > 33) {
+ secp256k1_rand256(&in[33]);
+ }
if (secp256k1_eckey_pubkey_parse(&elem, in, len)) {
unsigned char out[65];
unsigned char firstb;
@@ -1374,7 +1568,9 @@ void test_random_pubkeys(void) {
CHECK(size == len);
CHECK(memcmp(&in[1], &out[1], len-1) == 0);
/* ... except for the type of hybrid inputs. */
- if ((in[0] != 6) && (in[0] != 7)) CHECK(in[0] == out[0]);
+ if ((in[0] != 6) && (in[0] != 7)) {
+ CHECK(in[0] == out[0]);
+ }
size = 65;
CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0));
CHECK(size == 65);
@@ -1384,8 +1580,11 @@ void test_random_pubkeys(void) {
in[0] = (r & 1) ? 6 : 7;
res = secp256k1_eckey_pubkey_parse(&elem2, in, size);
if (firstb == 2 || firstb == 3) {
- if (in[0] == firstb + 4) CHECK(res);
- else CHECK(!res);
+ if (in[0] == firstb + 4) {
+ CHECK(res);
+ } else {
+ CHECK(!res);
+ }
}
if (res) {
ge_equals_ge(&elem,&elem2);
@@ -1447,10 +1646,10 @@ void test_ecdsa_edge_cases(void) {
int pubkeyblen = 33;
int recid;
- CHECK(!secp256k1_ecdsa_recover_compact(msg32, sig64, pubkey, &pubkeylen, 0, 0));
- CHECK(secp256k1_ecdsa_recover_compact(msg32, sig64, pubkey, &pubkeylen, 0, 1));
- CHECK(!secp256k1_ecdsa_recover_compact(msg32, sig64, pubkey, &pubkeylen, 0, 2));
- CHECK(!secp256k1_ecdsa_recover_compact(msg32, sig64, pubkey, &pubkeylen, 0, 3));
+ CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 0));
+ CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 1));
+ CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 2));
+ CHECK(!secp256k1_ecdsa_recover_compact(ctx, msg32, sig64, pubkey, &pubkeylen, 0, 3));
for (recid = 0; recid < 4; recid++) {
int i;
@@ -1495,42 +1694,44 @@ void test_ecdsa_edge_cases(void) {
0xE6, 0xAF, 0x48, 0xA0, 0x3B, 0xBF, 0xD2, 0x5E,
0x8C, 0xD0, 0x36, 0x41, 0x45, 0x02, 0x01, 0x04
};
- CHECK(secp256k1_ecdsa_recover_compact(msg32, sigb64, pubkeyb, &pubkeyblen, 1, recid));
- CHECK(secp256k1_ecdsa_verify(msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 1);
+ CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigb64, pubkeyb, &pubkeyblen, 1, recid));
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 1);
for (recid2 = 0; recid2 < 4; recid2++) {
unsigned char pubkey2b[33];
int pubkey2blen = 33;
- CHECK(secp256k1_ecdsa_recover_compact(msg32, sigb64, pubkey2b, &pubkey2blen, 1, recid2));
+ CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigb64, pubkey2b, &pubkey2blen, 1, recid2));
/* Verifying with (order + r,4) should always fail. */
- CHECK(secp256k1_ecdsa_verify(msg32, sigbderlong, sizeof(sigbderlong), pubkey2b, pubkey2blen) != 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderlong, sizeof(sigbderlong), pubkey2b, pubkey2blen) != 1);
}
/* DER parsing tests. */
/* Zero length r/s. */
- CHECK(secp256k1_ecdsa_verify(msg32, sigcder_zr, sizeof(sigcder_zr), pubkeyb, pubkeyblen) == -2);
- CHECK(secp256k1_ecdsa_verify(msg32, sigcder_zs, sizeof(sigcder_zs), pubkeyb, pubkeyblen) == -2);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder_zr, sizeof(sigcder_zr), pubkeyb, pubkeyblen) == -2);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder_zs, sizeof(sigcder_zs), pubkeyb, pubkeyblen) == -2);
/* Leading zeros. */
- CHECK(secp256k1_ecdsa_verify(msg32, sigbderalt1, sizeof(sigbderalt1), pubkeyb, pubkeyblen) == 1);
- CHECK(secp256k1_ecdsa_verify(msg32, sigbderalt2, sizeof(sigbderalt2), pubkeyb, pubkeyblen) == 1);
- CHECK(secp256k1_ecdsa_verify(msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == 1);
- CHECK(secp256k1_ecdsa_verify(msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt1, sizeof(sigbderalt1), pubkeyb, pubkeyblen) == 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt2, sizeof(sigbderalt2), pubkeyb, pubkeyblen) == 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == 1);
sigbderalt3[4] = 1;
- CHECK(secp256k1_ecdsa_verify(msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == -2);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt3, sizeof(sigbderalt3), pubkeyb, pubkeyblen) == -2);
sigbderalt4[7] = 1;
- CHECK(secp256k1_ecdsa_verify(msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == -2);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbderalt4, sizeof(sigbderalt4), pubkeyb, pubkeyblen) == -2);
/* Damage signature. */
sigbder[7]++;
- CHECK(secp256k1_ecdsa_verify(msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 0);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) == 0);
sigbder[7]--;
- CHECK(secp256k1_ecdsa_verify(msg32, sigbder, 6, pubkeyb, pubkeyblen) == -2);
- CHECK(secp256k1_ecdsa_verify(msg32, sigbder, sizeof(sigbder)-1, pubkeyb, pubkeyblen) == -2);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, 6, pubkeyb, pubkeyblen) == -2);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder)-1, pubkeyb, pubkeyblen) == -2);
for(i = 0; i < 8; i++) {
int c;
unsigned char orig = sigbder[i];
/*Try every single-byte change.*/
for (c = 0; c < 256; c++) {
- if (c == orig ) continue;
+ if (c == orig ) {
+ continue;
+ }
sigbder[i] = c;
- CHECK(secp256k1_ecdsa_verify(msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) ==
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigbder, sizeof(sigbder), pubkeyb, pubkeyblen) ==
(i==4 || i==7) ? 0 : -2 );
}
sigbder[i] = orig;
@@ -1547,10 +1748,10 @@ void test_ecdsa_edge_cases(void) {
secp256k1_scalar_negate(&sig.s, &sig.s);
secp256k1_scalar_inverse(&sig.s, &sig.s);
secp256k1_scalar_set_int(&sig.r, 1);
- secp256k1_ecmult_gen(&keyj, &sig.r);
+ secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &keyj, &sig.r);
secp256k1_ge_set_gej(&key, &keyj);
msg = sig.s;
- CHECK(secp256k1_ecdsa_sig_verify(&sig, &key, &msg) == 0);
+ CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &key, &msg) == 0);
}
/* Test r/s equal to zero */
@@ -1569,18 +1770,18 @@ void test_ecdsa_edge_cases(void) {
};
unsigned char pubkeyc[65];
int pubkeyclen = 65;
- CHECK(secp256k1_ecdsa_recover_compact(msg32, sigc64, pubkeyc, &pubkeyclen, 0, 0) == 1);
- CHECK(secp256k1_ecdsa_verify(msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 1);
+ CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyc, &pubkeyclen, 0, 0) == 1);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 1);
sigcder[4] = 0;
sigc64[31] = 0;
- CHECK(secp256k1_ecdsa_recover_compact(msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0);
- CHECK(secp256k1_ecdsa_verify(msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0);
+ CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0);
sigcder[4] = 1;
sigcder[7] = 0;
sigc64[31] = 1;
sigc64[63] = 0;
- CHECK(secp256k1_ecdsa_recover_compact(msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0);
- CHECK(secp256k1_ecdsa_verify(msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0);
+ CHECK(secp256k1_ecdsa_recover_compact(ctx, msg32, sigc64, pubkeyb, &pubkeyblen, 1, 0) == 0);
+ CHECK(secp256k1_ecdsa_verify(ctx, msg32, sigcder, sizeof(sigcder), pubkeyc, pubkeyclen) == 0);
}
/*Signature where s would be zero.*/
@@ -1611,18 +1812,18 @@ void test_ecdsa_edge_cases(void) {
};
unsigned char sig[72];
int siglen = 72;
- CHECK(secp256k1_ecdsa_sign(msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 0);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 0);
CHECK(siglen == 0);
- CHECK(secp256k1_ecdsa_sign(msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 0);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 0);
CHECK(siglen == 0);
msg[31] = 0xaa;
siglen = 72;
- CHECK(secp256k1_ecdsa_sign(msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) == 1);
CHECK(siglen > 0);
- CHECK(secp256k1_ecdsa_sign(msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce2) == 1);
CHECK(siglen > 0);
siglen = 10;
- CHECK(secp256k1_ecdsa_sign(msg, sig, &siglen, key, precomputed_nonce_function, nonce) != 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, precomputed_nonce_function, nonce) != 1);
CHECK(siglen == 0);
}
@@ -1644,41 +1845,41 @@ void test_ecdsa_edge_cases(void) {
msg[31] = 1;
/* High key results in signature failure. */
memset(key, 0xFF, 32);
- CHECK(secp256k1_ecdsa_sign(msg, sig, &siglen, key, NULL, extra) == 0);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 0);
CHECK(siglen == 0);
/* Zero key results in signature failure. */
memset(key, 0, 32);
- CHECK(secp256k1_ecdsa_sign(msg, sig, &siglen, key, NULL, extra) == 0);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 0);
CHECK(siglen == 0);
/* Nonce function failure results in signature failure. */
key[31] = 1;
- CHECK(secp256k1_ecdsa_sign(msg, sig, &siglen, key, nonce_function_test_fail, extra) == 0);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, nonce_function_test_fail, extra) == 0);
CHECK(siglen == 0);
- CHECK(secp256k1_ecdsa_sign_compact(msg, sig, key, nonce_function_test_fail, extra, &recid) == 0);
+ CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, nonce_function_test_fail, extra, &recid) == 0);
CHECK(is_empty_compact_signature(sig));
/* The retry loop successfully makes its way to the first good value. */
siglen = 72;
- CHECK(secp256k1_ecdsa_sign(msg, sig, &siglen, key, nonce_function_test_retry, extra) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, nonce_function_test_retry, extra) == 1);
CHECK(siglen > 0);
- CHECK(secp256k1_ecdsa_sign(msg, sig2, &siglen2, key, nonce_function_rfc6979, extra) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, nonce_function_rfc6979, extra) == 1);
CHECK(siglen > 0);
CHECK((siglen == siglen2) && (memcmp(sig, sig2, siglen) == 0));
- CHECK(secp256k1_ecdsa_sign_compact(msg, sig, key, nonce_function_test_retry, extra, &recid) == 1);
+ CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, nonce_function_test_retry, extra, &recid) == 1);
CHECK(!is_empty_compact_signature(sig));
- CHECK(secp256k1_ecdsa_sign_compact(msg, sig2, key, nonce_function_rfc6979, extra, &recid2) == 1);
+ CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig2, key, nonce_function_rfc6979, extra, &recid2) == 1);
CHECK(!is_empty_compact_signature(sig2));
CHECK((recid == recid2) && (memcmp(sig, sig2, 64) == 0));
/* The default nonce function is determinstic. */
siglen = 72;
siglen2 = 72;
- CHECK(secp256k1_ecdsa_sign(msg, sig, &siglen, key, NULL, extra) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig, &siglen, key, NULL, extra) == 1);
CHECK(siglen > 0);
- CHECK(secp256k1_ecdsa_sign(msg, sig2, &siglen2, key, NULL, extra) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1);
CHECK(siglen2 > 0);
CHECK((siglen == siglen2) && (memcmp(sig, sig2, siglen) == 0));
- CHECK(secp256k1_ecdsa_sign_compact(msg, sig, key, NULL, extra, &recid) == 1);
+ CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig, key, NULL, extra, &recid) == 1);
CHECK(!is_empty_compact_signature(sig));
- CHECK(secp256k1_ecdsa_sign_compact(msg, sig2, key, NULL, extra, &recid2) == 1);
+ CHECK(secp256k1_ecdsa_sign_compact(ctx, msg, sig2, key, NULL, extra, &recid2) == 1);
CHECK(!is_empty_compact_signature(sig));
CHECK((recid == recid2) && (memcmp(sig, sig2, 64) == 0));
/* The default nonce function changes output with different messages. */
@@ -1686,7 +1887,7 @@ void test_ecdsa_edge_cases(void) {
int j;
siglen2 = 72;
msg[0] = i;
- CHECK(secp256k1_ecdsa_sign(msg, sig2, &siglen2, key, NULL, extra) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1);
CHECK(!is_empty_compact_signature(sig));
CHECK(secp256k1_ecdsa_sig_parse(&s[i], sig2, siglen2));
for (j = 0; j < i; j++) {
@@ -1700,7 +1901,7 @@ void test_ecdsa_edge_cases(void) {
int j;
siglen2 = 72;
key[0] = i - 256;
- CHECK(secp256k1_ecdsa_sign(msg, sig2, &siglen2, key, NULL, extra) == 1);
+ CHECK(secp256k1_ecdsa_sign(ctx, msg, sig2, &siglen2, key, NULL, extra) == 1);
CHECK(secp256k1_ecdsa_sig_parse(&s[i], sig2, siglen2));
for (j = 0; j < i; j++) {
CHECK(!secp256k1_scalar_eq(&s[i].r, &s[j].r));
@@ -1719,8 +1920,8 @@ void test_ecdsa_edge_cases(void) {
0xbf, 0xd2, 0x5e, 0x8c, 0xd0, 0x36, 0x41, 0x41,
};
int outlen = 300;
- CHECK(!secp256k1_ec_privkey_export(seckey, privkey, &outlen, 0));
- CHECK(!secp256k1_ec_privkey_export(seckey, privkey, &outlen, 1));
+ CHECK(!secp256k1_ec_privkey_export(ctx, seckey, privkey, &outlen, 0));
+ CHECK(!secp256k1_ec_privkey_export(ctx, seckey, privkey, &outlen, 1));
}
}
@@ -1735,7 +1936,7 @@ EC_KEY *get_openssl_key(const secp256k1_scalar_t *key) {
const unsigned char* pbegin = privkey;
int compr = secp256k1_rand32() & 1;
EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1);
- CHECK(secp256k1_eckey_privkey_serialize(privkey, &privkeylen, key, compr));
+ CHECK(secp256k1_eckey_privkey_serialize(&ctx->ecmult_gen_ctx, privkey, &privkeylen, key, compr));
CHECK(d2i_ECPrivateKey(&ec_key, &pbegin, privkeylen));
CHECK(EC_KEY_check_key(ec_key));
return ec_key;
@@ -1756,16 +1957,16 @@ void test_ecdsa_openssl(void) {
secp256k1_rand256_test(message);
secp256k1_scalar_set_b32(&msg, message, NULL);
random_scalar_order_test(&key);
- secp256k1_ecmult_gen(&qj, &key);
+ secp256k1_ecmult_gen(&ctx->ecmult_gen_ctx, &qj, &key);
secp256k1_ge_set_gej(&q, &qj);
ec_key = get_openssl_key(&key);
CHECK(ec_key);
CHECK(ECDSA_sign(0, message, sizeof(message), signature, &sigsize, ec_key));
CHECK(secp256k1_ecdsa_sig_parse(&sig, signature, sigsize));
- CHECK(secp256k1_ecdsa_sig_verify(&sig, &q, &msg));
+ CHECK(secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &q, &msg));
secp256k1_scalar_set_int(&one, 1);
secp256k1_scalar_add(&msg2, &msg, &one);
- CHECK(!secp256k1_ecdsa_sig_verify(&sig, &q, &msg2));
+ CHECK(!secp256k1_ecdsa_sig_verify(&ctx->ecmult_ctx, &sig, &q, &msg2));
random_sign(&sig, &key, &msg, NULL);
CHECK(secp256k1_ecdsa_sig_serialize(signature, &secp_sigsize, &sig));
@@ -1825,10 +2026,13 @@ int main(int argc, char **argv) {
printf("random seed = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", seed16[0], seed16[1], seed16[2], seed16[3], seed16[4], seed16[5], seed16[6], seed16[7], seed16[8], seed16[9], seed16[10], seed16[11], seed16[12], seed16[13], seed16[14], seed16[15]);
/* initialize */
- secp256k1_start(SECP256K1_START_SIGN | SECP256K1_START_VERIFY);
+ run_context_tests();
+ ctx = secp256k1_context_create(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY);
- /* initializing a second time shouldn't cause any harm or memory leaks. */
- secp256k1_start(SECP256K1_START_SIGN | SECP256K1_START_VERIFY);
+ if (secp256k1_rand32() & 1) {
+ secp256k1_rand256(run32);
+ CHECK(secp256k1_context_randomize(ctx, secp256k1_rand32() & 1 ? run32 : NULL));
+ }
run_sha256_tests();
run_hmac_sha256_tests();
@@ -1858,6 +2062,8 @@ int main(int argc, char **argv) {
run_wnaf();
run_point_times_order();
run_ecmult_chain();
+ run_ecmult_constants();
+ run_ecmult_gen_blind();
/* ecdsa tests */
run_random_pubkeys();
@@ -1872,9 +2078,6 @@ int main(int argc, char **argv) {
printf("random run = %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", run32[0], run32[1], run32[2], run32[3], run32[4], run32[5], run32[6], run32[7], run32[8], run32[9], run32[10], run32[11], run32[12], run32[13], run32[14], run32[15]);
/* shutdown */
- secp256k1_stop();
-
- /* shutting down twice shouldn't cause any double frees. */
- secp256k1_stop();
+ secp256k1_context_destroy(ctx);
return 0;
}
diff --git a/src/serialize.h b/src/serialize.h
index 741f78f8b4..53d8af142f 100644
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -6,6 +6,8 @@
#ifndef BITCOIN_SERIALIZE_H
#define BITCOIN_SERIALIZE_H
+#include "compat/endian.h"
+
#include <algorithm>
#include <assert.h>
#include <ios>
@@ -18,8 +20,6 @@
#include <utility>
#include <vector>
-#include "compat/endian.h"
-
class CScript;
static const unsigned int MAX_SIZE = 0x02000000;
diff --git a/src/support/allocators/secure.h b/src/support/allocators/secure.h
index 7a74d87bb4..5e7bb66ea2 100644
--- a/src/support/allocators/secure.h
+++ b/src/support/allocators/secure.h
@@ -3,8 +3,8 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_ALLOCATORS_SECURE_H
-#define BITCOIN_ALLOCATORS_SECURE_H
+#ifndef BITCOIN_SUPPORT_ALLOCATORS_SECURE_H
+#define BITCOIN_SUPPORT_ALLOCATORS_SECURE_H
#include "support/pagelocker.h"
@@ -59,4 +59,4 @@ struct secure_allocator : public std::allocator<T> {
// This is exactly like std::string, but with a custom allocator.
typedef std::basic_string<char, std::char_traits<char>, secure_allocator<char> > SecureString;
-#endif // BITCOIN_ALLOCATORS_SECURE_H
+#endif // BITCOIN_SUPPORT_ALLOCATORS_SECURE_H
diff --git a/src/support/allocators/zeroafterfree.h b/src/support/allocators/zeroafterfree.h
index b01fcd088b..41e23392e8 100644
--- a/src/support/allocators/zeroafterfree.h
+++ b/src/support/allocators/zeroafterfree.h
@@ -3,8 +3,8 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_ALLOCATORS_ZEROAFTERFREE_H
-#define BITCOIN_ALLOCATORS_ZEROAFTERFREE_H
+#ifndef BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H
+#define BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H
#include "support/cleanse.h"
@@ -45,4 +45,4 @@ struct zero_after_free_allocator : public std::allocator<T> {
// Byte-vector that clears its contents before deletion.
typedef std::vector<char, zero_after_free_allocator<char> > CSerializeData;
-#endif // BITCOIN_ALLOCATORS_ZEROAFTERFREE_H
+#endif // BITCOIN_SUPPORT_ALLOCATORS_ZEROAFTERFREE_H
diff --git a/src/support/pagelocker.h b/src/support/pagelocker.h
index 964be1aec4..88b95cce73 100644
--- a/src/support/pagelocker.h
+++ b/src/support/pagelocker.h
@@ -3,8 +3,8 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_ALLOCATORS_PAGELOCKER_H
-#define BITCOIN_ALLOCATORS_PAGELOCKER_H
+#ifndef BITCOIN_SUPPORT_PAGELOCKER_H
+#define BITCOIN_SUPPORT_PAGELOCKER_H
#include "support/cleanse.h"
@@ -37,7 +37,6 @@ public:
~LockedPageManagerBase()
{
- assert(this->GetLockedPageCount() == 0);
}
@@ -175,4 +174,4 @@ void UnlockObject(const T& t)
LockedPageManager::Instance().UnlockRange((void*)(&t), sizeof(T));
}
-#endif // BITCOIN_ALLOCATORS_PAGELOCKER_H
+#endif // BITCOIN_SUPPORT_PAGELOCKER_H
diff --git a/src/sync.cpp b/src/sync.cpp
index e28caee8e7..a422939964 100644
--- a/src/sync.cpp
+++ b/src/sync.cpp
@@ -86,7 +86,6 @@ static void push_lock(void* c, const CLockLocation& locklocation, bool fTry)
if (lockstack.get() == NULL)
lockstack.reset(new LockStack);
- LogPrint("lock", "Locking: %s\n", locklocation.ToString());
dd_mutex.lock();
(*lockstack).push_back(std::make_pair(c, locklocation));
@@ -113,10 +112,6 @@ static void push_lock(void* c, const CLockLocation& locklocation, bool fTry)
static void pop_lock()
{
- if (fDebug) {
- const CLockLocation& locklocation = (*lockstack).rbegin()->second;
- LogPrint("lock", "Unlocked: %s\n", locklocation.ToString());
- }
dd_mutex.lock();
(*lockstack).pop_back();
dd_mutex.unlock();
diff --git a/src/sync.h b/src/sync.h
index 27e80e813b..78b9043477 100644
--- a/src/sync.h
+++ b/src/sync.h
@@ -21,9 +21,6 @@
////////////////////////////////////////////////
/*
-
-
-
CCriticalSection mutex;
boost::recursive_mutex mutex;
@@ -42,20 +39,18 @@ ENTER_CRITICAL_SECTION(mutex); // no RAII
LEAVE_CRITICAL_SECTION(mutex); // no RAII
mutex.unlock();
-
-
-
*/
-
///////////////////////////////
// //
// THE ACTUAL IMPLEMENTATION //
// //
///////////////////////////////
-// Template mixin that adds -Wthread-safety locking annotations to a
-// subset of the mutex API.
+/**
+ * Template mixin that adds -Wthread-safety locking
+ * annotations to a subset of the mutex API.
+ */
template <typename PARENT>
class LOCKABLE AnnotatedMixin : public PARENT
{
@@ -76,8 +71,10 @@ public:
}
};
-/** Wrapped boost mutex: supports recursive locking, but no waiting */
-// TODO: We should move away from using the recursive lock by default.
+/**
+ * Wrapped boost mutex: supports recursive locking, but no waiting
+ * TODO: We should move away from using the recursive lock by default.
+ */
typedef AnnotatedMixin<boost::recursive_mutex> CCriticalSection;
/** Wrapped boost mutex: supports waiting but not recursive locking */
@@ -92,9 +89,7 @@ void LeaveCritical();
std::string LocksHeld();
void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs);
#else
-void static inline EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry = false)
-{
-}
+void static inline EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry = false) {}
void static inline LeaveCritical() {}
void static inline AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs) {}
#endif
diff --git a/src/test/Checkpoints_tests.cpp b/src/test/Checkpoints_tests.cpp
index c3125d76dc..703cf307d1 100644
--- a/src/test/Checkpoints_tests.cpp
+++ b/src/test/Checkpoints_tests.cpp
@@ -10,6 +10,7 @@
#include "uint256.h"
#include "test/test_bitcoin.h"
+#include "chainparams.h"
#include <boost/test/unit_test.hpp>
@@ -19,21 +20,8 @@ BOOST_FIXTURE_TEST_SUITE(Checkpoints_tests, BasicTestingSetup)
BOOST_AUTO_TEST_CASE(sanity)
{
- uint256 p11111 = uint256S("0x0000000069e244f73d78e8fd29ba2fd2ed618bd6fa2ee92559f542fdb26e7c1d");
- uint256 p134444 = uint256S("0x00000000000005b12ffd4cd315cd34ffd4a594f430ac814c91184a0d42d2b0fe");
- BOOST_CHECK(Checkpoints::CheckBlock(11111, p11111));
- BOOST_CHECK(Checkpoints::CheckBlock(134444, p134444));
-
-
- // Wrong hashes at checkpoints should fail:
- BOOST_CHECK(!Checkpoints::CheckBlock(11111, p134444));
- BOOST_CHECK(!Checkpoints::CheckBlock(134444, p11111));
-
- // ... but any hash not at a checkpoint should succeed:
- BOOST_CHECK(Checkpoints::CheckBlock(11111+1, p134444));
- BOOST_CHECK(Checkpoints::CheckBlock(134444+1, p11111));
-
- BOOST_CHECK(Checkpoints::GetTotalBlocksEstimate() >= 134444);
-}
+ const Checkpoints::CCheckpointData& checkpoints = Params(CBaseChainParams::MAIN).Checkpoints();
+ BOOST_CHECK(Checkpoints::GetTotalBlocksEstimate(checkpoints) >= 134444);
+}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/alert_tests.cpp b/src/test/alert_tests.cpp
index 6b6df5199a..38dcc6023c 100644
--- a/src/test/alert_tests.cpp
+++ b/src/test/alert_tests.cpp
@@ -7,10 +7,12 @@
//
#include "alert.h"
+#include "chain.h"
+#include "chainparams.h"
#include "clientversion.h"
#include "data/alertTests.raw.h"
-#include "chainparams.h"
+#include "main.h"
#include "serialize.h"
#include "streams.h"
#include "util.h"
@@ -193,4 +195,63 @@ BOOST_AUTO_TEST_CASE(AlertNotify)
SetMockTime(0);
}
+static bool falseFunc() { return false; }
+
+BOOST_AUTO_TEST_CASE(PartitionAlert)
+{
+ // Test PartitionCheck
+ CCriticalSection csDummy;
+ CBlockIndex indexDummy[100];
+ CChainParams& params = Params(CBaseChainParams::MAIN);
+ int64_t nPowTargetSpacing = params.GetConsensus().nPowTargetSpacing;
+
+ // Generate fake blockchain timestamps relative to
+ // an arbitrary time:
+ int64_t now = 1427379054;
+ SetMockTime(now);
+ for (int i = 0; i < 100; i++)
+ {
+ indexDummy[i].phashBlock = NULL;
+ if (i == 0) indexDummy[i].pprev = NULL;
+ else indexDummy[i].pprev = &indexDummy[i-1];
+ indexDummy[i].nHeight = i;
+ indexDummy[i].nTime = now - (100-i)*nPowTargetSpacing;
+ // Other members don't matter, the partition check code doesn't
+ // use them
+ }
+
+ // Test 1: chain with blocks every nPowTargetSpacing seconds,
+ // as normal, no worries:
+ PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing);
+ BOOST_CHECK(strMiscWarning.empty());
+
+ // Test 2: go 3.5 hours without a block, expect a warning:
+ now += 3*60*60+30*60;
+ SetMockTime(now);
+ PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing);
+ BOOST_CHECK(!strMiscWarning.empty());
+ BOOST_TEST_MESSAGE(std::string("Got alert text: ")+strMiscWarning);
+ strMiscWarning = "";
+
+ // Test 3: test the "partition alerts only go off once per day"
+ // code:
+ now += 60*10;
+ SetMockTime(now);
+ PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing);
+ BOOST_CHECK(strMiscWarning.empty());
+
+ // Test 4: get 2.5 times as many blocks as expected:
+ now += 60*60*24; // Pretend it is a day later
+ SetMockTime(now);
+ int64_t quickSpacing = nPowTargetSpacing*2/5;
+ for (int i = 0; i < 100; i++) // Tweak chain timestamps:
+ indexDummy[i].nTime = now - (100-i)*quickSpacing;
+ PartitionCheck(falseFunc, csDummy, &indexDummy[99], nPowTargetSpacing);
+ BOOST_CHECK(!strMiscWarning.empty());
+ BOOST_TEST_MESSAGE(std::string("Got alert text: ")+strMiscWarning);
+ strMiscWarning = "";
+
+ SetMockTime(0);
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/base58_tests.cpp b/src/test/base58_tests.cpp
index f07dd7a7db..9e74f5f427 100644
--- a/src/test/base58_tests.cpp
+++ b/src/test/base58_tests.cpp
@@ -17,23 +17,20 @@
#include <boost/foreach.hpp>
#include <boost/test/unit_test.hpp>
-#include "json/json_spirit_reader_template.h"
-#include "json/json_spirit_utils.h"
-#include "json/json_spirit_writer_template.h"
-using namespace json_spirit;
-extern Array read_json(const std::string& jsondata);
+#include "univalue/univalue.h"
+
+extern UniValue read_json(const std::string& jsondata);
BOOST_FIXTURE_TEST_SUITE(base58_tests, BasicTestingSetup)
// Goal: test low-level base58 encoding functionality
BOOST_AUTO_TEST_CASE(base58_EncodeBase58)
{
- Array tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
- BOOST_FOREACH(Value& tv, tests)
- {
- Array test = tv.get_array();
- std::string strTest = write_string(tv, false);
+ UniValue tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
+ for (unsigned int idx = 0; idx < tests.size(); idx++) {
+ UniValue test = tests[idx];
+ std::string strTest = test.write();
if (test.size() < 2) // Allow for extra stuff (useful for comments)
{
BOOST_ERROR("Bad test: " << strTest);
@@ -50,13 +47,12 @@ BOOST_AUTO_TEST_CASE(base58_EncodeBase58)
// Goal: test low-level base58 decoding functionality
BOOST_AUTO_TEST_CASE(base58_DecodeBase58)
{
- Array tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
+ UniValue tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode)));
std::vector<unsigned char> result;
- BOOST_FOREACH(Value& tv, tests)
- {
- Array test = tv.get_array();
- std::string strTest = write_string(tv, false);
+ for (unsigned int idx = 0; idx < tests.size(); idx++) {
+ UniValue test = tests[idx];
+ std::string strTest = test.write();
if (test.size() < 2) // Allow for extra stuff (useful for comments)
{
BOOST_ERROR("Bad test: " << strTest);
@@ -124,16 +120,15 @@ public:
// Goal: check that parsed keys match test payload
BOOST_AUTO_TEST_CASE(base58_keys_valid_parse)
{
- Array tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid)));
+ UniValue tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid)));
std::vector<unsigned char> result;
CBitcoinSecret secret;
CBitcoinAddress addr;
SelectParams(CBaseChainParams::MAIN);
- BOOST_FOREACH(Value& tv, tests)
- {
- Array test = tv.get_array();
- std::string strTest = write_string(tv, false);
+ for (unsigned int idx = 0; idx < tests.size(); idx++) {
+ UniValue test = tests[idx];
+ std::string strTest = test.write();
if (test.size() < 3) // Allow for extra stuff (useful for comments)
{
BOOST_ERROR("Bad test: " << strTest);
@@ -141,7 +136,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_parse)
}
std::string exp_base58string = test[0].get_str();
std::vector<unsigned char> exp_payload = ParseHex(test[1].get_str());
- const Object &metadata = test[2].get_obj();
+ const UniValue &metadata = test[2].get_obj();
bool isPrivkey = find_value(metadata, "isPrivkey").get_bool();
bool isTestnet = find_value(metadata, "isTestnet").get_bool();
if (isTestnet)
@@ -183,12 +178,12 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_parse)
// Goal: check that generated keys match test vectors
BOOST_AUTO_TEST_CASE(base58_keys_valid_gen)
{
- Array tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid)));
+ UniValue tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid)));
std::vector<unsigned char> result;
- BOOST_FOREACH(Value& tv, tests)
- {
- Array test = tv.get_array();
- std::string strTest = write_string(tv, false);
+
+ for (unsigned int idx = 0; idx < tests.size(); idx++) {
+ UniValue test = tests[idx];
+ std::string strTest = test.write();
if (test.size() < 3) // Allow for extra stuff (useful for comments)
{
BOOST_ERROR("Bad test: " << strTest);
@@ -196,7 +191,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen)
}
std::string exp_base58string = test[0].get_str();
std::vector<unsigned char> exp_payload = ParseHex(test[1].get_str());
- const Object &metadata = test[2].get_obj();
+ const UniValue &metadata = test[2].get_obj();
bool isPrivkey = find_value(metadata, "isPrivkey").get_bool();
bool isTestnet = find_value(metadata, "isTestnet").get_bool();
if (isTestnet)
@@ -251,15 +246,14 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen)
// Goal: check that base58 parsing code is robust against a variety of corrupted data
BOOST_AUTO_TEST_CASE(base58_keys_invalid)
{
- Array tests = read_json(std::string(json_tests::base58_keys_invalid, json_tests::base58_keys_invalid + sizeof(json_tests::base58_keys_invalid))); // Negative testcases
+ UniValue tests = read_json(std::string(json_tests::base58_keys_invalid, json_tests::base58_keys_invalid + sizeof(json_tests::base58_keys_invalid))); // Negative testcases
std::vector<unsigned char> result;
CBitcoinSecret secret;
CBitcoinAddress addr;
- BOOST_FOREACH(Value& tv, tests)
- {
- Array test = tv.get_array();
- std::string strTest = write_string(tv, false);
+ for (unsigned int idx = 0; idx < tests.size(); idx++) {
+ UniValue test = tests[idx];
+ std::string strTest = test.write();
if (test.size() < 1) // Allow for extra stuff (useful for comments)
{
BOOST_ERROR("Bad test: " << strTest);
diff --git a/src/test/bip32_tests.cpp b/src/test/bip32_tests.cpp
index d738851c1f..0d815c27fd 100644
--- a/src/test/bip32_tests.cpp
+++ b/src/test/bip32_tests.cpp
@@ -8,6 +8,7 @@
#include "key.h"
#include "uint256.h"
#include "util.h"
+#include "utilstrencodings.h"
#include "test/test_bitcoin.h"
#include <string>
diff --git a/src/test/bloom_tests.cpp b/src/test/bloom_tests.cpp
index 73a146f05c..1bda8a7ea1 100644
--- a/src/test/bloom_tests.cpp
+++ b/src/test/bloom_tests.cpp
@@ -8,6 +8,7 @@
#include "clientversion.h"
#include "key.h"
#include "merkleblock.h"
+#include "random.h"
#include "serialize.h"
#include "streams.h"
#include "uint256.h"
@@ -459,4 +460,81 @@ BOOST_AUTO_TEST_CASE(merkle_block_4_test_update_none)
BOOST_CHECK(!filter.contains(COutPoint(uint256S("0x02981fa052f0481dbc5868f4fc2166035a10f27a03cfd2de67326471df5bc041"), 0)));
}
+static std::vector<unsigned char> RandomData()
+{
+ uint256 r = GetRandHash();
+ return std::vector<unsigned char>(r.begin(), r.end());
+}
+
+BOOST_AUTO_TEST_CASE(rolling_bloom)
+{
+ // last-100-entry, 1% false positive:
+ CRollingBloomFilter rb1(100, 0.01, 0);
+
+ // Overfill:
+ static const int DATASIZE=399;
+ std::vector<unsigned char> data[DATASIZE];
+ for (int i = 0; i < DATASIZE; i++) {
+ data[i] = RandomData();
+ rb1.insert(data[i]);
+ }
+ // Last 100 guaranteed to be remembered:
+ for (int i = 299; i < DATASIZE; i++) {
+ BOOST_CHECK(rb1.contains(data[i]));
+ }
+
+ // false positive rate is 1%, so we should get about 100 hits if
+ // testing 10,000 random keys. We get worst-case false positive
+ // behavior when the filter is as full as possible, which is
+ // when we've inserted one minus an integer multiple of nElement*2.
+ unsigned int nHits = 0;
+ for (int i = 0; i < 10000; i++) {
+ if (rb1.contains(RandomData()))
+ ++nHits;
+ }
+ // Run test_bitcoin with --log_level=message to see BOOST_TEST_MESSAGEs:
+ BOOST_TEST_MESSAGE("RollingBloomFilter got " << nHits << " false positives (~100 expected)");
+
+ // Insanely unlikely to get a fp count outside this range:
+ BOOST_CHECK(nHits > 25);
+ BOOST_CHECK(nHits < 175);
+
+ BOOST_CHECK(rb1.contains(data[DATASIZE-1]));
+ rb1.clear();
+ BOOST_CHECK(!rb1.contains(data[DATASIZE-1]));
+
+ // Now roll through data, make sure last 100 entries
+ // are always remembered:
+ for (int i = 0; i < DATASIZE; i++) {
+ if (i >= 100)
+ BOOST_CHECK(rb1.contains(data[i-100]));
+ rb1.insert(data[i]);
+ }
+
+ // Insert 999 more random entries:
+ for (int i = 0; i < 999; i++) {
+ rb1.insert(RandomData());
+ }
+ // Sanity check to make sure the filter isn't just filling up:
+ nHits = 0;
+ for (int i = 0; i < DATASIZE; i++) {
+ if (rb1.contains(data[i]))
+ ++nHits;
+ }
+ // Expect about 5 false positives, more than 100 means
+ // something is definitely broken.
+ BOOST_TEST_MESSAGE("RollingBloomFilter got " << nHits << " false positives (~5 expected)");
+ BOOST_CHECK(nHits < 100);
+
+ // last-1000-entry, 0.01% false positive:
+ CRollingBloomFilter rb2(1000, 0.001, 0);
+ for (int i = 0; i < DATASIZE; i++) {
+ rb2.insert(data[i]);
+ }
+ // ... room for all of them:
+ for (int i = 0; i < DATASIZE; i++) {
+ BOOST_CHECK(rb2.contains(data[i]));
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/checkblock_tests.cpp b/src/test/checkblock_tests.cpp
index 7abfad151e..51530c4de5 100644
--- a/src/test/checkblock_tests.cpp
+++ b/src/test/checkblock_tests.cpp
@@ -2,16 +2,11 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-//
-// Unit tests for block.CheckBlock()
-//
-
-
-
#include "clientversion.h"
+#include "consensus/validation.h"
#include "main.h"
-#include "utiltime.h"
#include "test/test_bitcoin.h"
+#include "utiltime.h"
#include <cstdio>
diff --git a/src/test/coins_tests.cpp b/src/test/coins_tests.cpp
index 2e2cc2214b..34b311b804 100644
--- a/src/test/coins_tests.cpp
+++ b/src/test/coins_tests.cpp
@@ -59,6 +59,24 @@ public:
bool GetStats(CCoinsStats& stats) const { return false; }
};
+
+class CCoinsViewCacheTest : public CCoinsViewCache
+{
+public:
+ CCoinsViewCacheTest(CCoinsView* base) : CCoinsViewCache(base) {}
+
+ void SelfTest() const
+ {
+ // Manually recompute the dynamic usage of the whole data, and compare it.
+ size_t ret = memusage::DynamicUsage(cacheCoins);
+ for (CCoinsMap::iterator it = cacheCoins.begin(); it != cacheCoins.end(); it++) {
+ ret += memusage::DynamicUsage(it->second.coins);
+ }
+ BOOST_CHECK_EQUAL(memusage::DynamicUsage(*this), ret);
+ }
+
+};
+
}
BOOST_FIXTURE_TEST_SUITE(coins_tests, BasicTestingSetup)
@@ -90,8 +108,8 @@ BOOST_AUTO_TEST_CASE(coins_cache_simulation_test)
// The cache stack.
CCoinsViewTest base; // A CCoinsViewTest at the bottom.
- std::vector<CCoinsViewCache*> stack; // A stack of CCoinsViewCaches on top.
- stack.push_back(new CCoinsViewCache(&base)); // Start with one cache.
+ std::vector<CCoinsViewCacheTest*> stack; // A stack of CCoinsViewCaches on top.
+ stack.push_back(new CCoinsViewCacheTest(&base)); // Start with one cache.
// Use a limited set of random transaction ids, so we do test overwriting entries.
std::vector<uint256> txids;
@@ -136,6 +154,9 @@ BOOST_AUTO_TEST_CASE(coins_cache_simulation_test)
missed_an_entry = true;
}
}
+ BOOST_FOREACH(const CCoinsViewCacheTest *test, stack) {
+ test->SelfTest();
+ }
}
if (insecure_rand() % 100 == 0) {
@@ -152,7 +173,7 @@ BOOST_AUTO_TEST_CASE(coins_cache_simulation_test)
} else {
removed_all_caches = true;
}
- stack.push_back(new CCoinsViewCache(tip));
+ stack.push_back(new CCoinsViewCacheTest(tip));
if (stack.size() == 4) {
reached_4_caches = true;
}
diff --git a/src/test/data/script_invalid.json b/src/test/data/script_invalid.json
index 271bc70f73..7afa2abf49 100644
--- a/src/test/data/script_invalid.json
+++ b/src/test/data/script_invalid.json
@@ -141,6 +141,8 @@
["2 2 0 IF LSHIFT ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "LSHIFT disabled"],
["2 2 0 IF RSHIFT ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "RSHIFT disabled"],
+["", "EQUAL NOT", "P2SH,STRICTENC", "EQUAL must error when there are no stack items"],
+["0", "EQUAL NOT", "P2SH,STRICTENC", "EQUAL must error when there are not 2 stack items"],
["0 1","EQUAL", "P2SH,STRICTENC"],
["1 1 ADD", "0 EQUAL", "P2SH,STRICTENC"],
["11 1 ADD 12 SUB", "11 EQUAL", "P2SH,STRICTENC"],
@@ -368,6 +370,16 @@
["NOP", "HASH160 1", "P2SH,STRICTENC"],
["NOP", "HASH256 1", "P2SH,STRICTENC"],
+["Increase CHECKSIG and CHECKMULTISIG negative test coverage"],
+["", "CHECKSIG NOT", "STRICTENC", "CHECKSIG must error when there are no stack items"],
+["0", "CHECKSIG NOT", "STRICTENC", "CHECKSIG must error when there are not 2 stack items"],
+["", "CHECKMULTISIG NOT", "STRICTENC", "CHECKMULTISIG must error when there are no stack items"],
+["", "-1 CHECKMULTISIG NOT", "STRICTENC", "CHECKMULTISIG must error when the specified number of pubkeys is negative"],
+["", "1 CHECKMULTISIG NOT", "STRICTENC", "CHECKMULTISIG must error when there are not enough pubkeys on the stack"],
+["", "-1 0 CHECKMULTISIG NOT", "STRICTENC", "CHECKMULTISIG must error when the specified number of signatures is negative"],
+["", "1 'pk1' 1 CHECKMULTISIG NOT", "STRICTENC", "CHECKMULTISIG must error when there are not enough signatures on the stack"],
+["", "'dummy' 'sig1' 1 'pk1' 1 CHECKMULTISIG IF 1 ENDIF", "", "CHECKMULTISIG must push false to stack when signature is invalid when NOT in strict enc mode"],
+
["",
"0 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG",
"P2SH,STRICTENC",
@@ -426,7 +438,7 @@
["0x4d 0xFF00 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA",
"PUSHDATA2 of 255 bytes minimally represented by PUSHDATA1"],
-["0x4f 0x00100000 0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA",
+["0x4e 0x00010000 0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA",
"PUSHDATA4 of 256 bytes minimally represented by PUSHDATA2"],
@@ -780,6 +792,12 @@
"P2SH(P2PK) with non-push scriptSig"
],
[
+ "0 0x47 0x304402205451ce65ad844dbb978b8bdedf5082e33b43cae8279c30f2c74d9e9ee49a94f802203fe95a7ccf74da7a232ee523ef4a53cb4d14bdd16289680cdb97a63819b8f42f01 0x46 0x304402205451ce65ad844dbb978b8bdedf5082e33b43cae8279c30f2c74d9e9ee49a94f802203fe95a7ccf74da7a232ee523ef4a53cb4d14bdd16289680cdb97a63819b8f42f",
+ "2 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 0x21 0x02a673638cb9587cb68ea08dbef685c6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5 3 CHECKMULTISIG",
+ "P2SH,STRICTENC",
+ "2-of-3 with one valid and one invalid signature due to parse error, nSigs > validSigs"
+],
+[
"11 0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
"0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG",
"CLEANSTACK,P2SH",
diff --git a/src/test/data/script_valid.json b/src/test/data/script_valid.json
index 064dde8464..a4e15faeaf 100644
--- a/src/test/data/script_valid.json
+++ b/src/test/data/script_valid.json
@@ -74,12 +74,14 @@
["1 1", "VERIFY", "P2SH,STRICTENC"],
["1 0x05 0x01 0x00 0x00 0x00 0x00", "VERIFY", "P2SH,STRICTENC", "values >4 bytes can be cast to boolean"],
+["1 0x01 0x80", "IF 0 ENDIF", "P2SH,STRICTENC", "negative 0 is false"],
["10 0 11 TOALTSTACK DROP FROMALTSTACK", "ADD 21 EQUAL", "P2SH,STRICTENC"],
["'gavin_was_here' TOALTSTACK 11 FROMALTSTACK", "'gavin_was_here' EQUALVERIFY 11 EQUAL", "P2SH,STRICTENC"],
["0 IFDUP", "DEPTH 1 EQUALVERIFY 0 EQUAL", "P2SH,STRICTENC"],
["1 IFDUP", "DEPTH 2 EQUALVERIFY 1 EQUALVERIFY 1 EQUAL", "P2SH,STRICTENC"],
+["0x05 0x0100000000 IFDUP", "DEPTH 2 EQUALVERIFY 0x05 0x0100000000 EQUAL", "P2SH,STRICTENC", "IFDUP dups non ints"],
["0 DROP", "DEPTH 0 EQUAL", "P2SH,STRICTENC"],
["0", "DUP 1 ADD 1 EQUALVERIFY 0 EQUAL", "P2SH,STRICTENC"],
["0 1", "NIP", "P2SH,STRICTENC"],
@@ -408,6 +410,7 @@
["0 0", "EQUAL", "P2SH,STRICTENC"],
["0 0", "EQUALVERIFY 1", "P2SH,STRICTENC"],
+["0 0 1", "EQUAL EQUAL", "P2SH,STRICTENC", "OP_0 and bools must have identical byte representations"],
["0", "1ADD", "P2SH,STRICTENC"],
["2", "1SUB", "P2SH,STRICTENC"],
diff --git a/src/test/data/tx_invalid.json b/src/test/data/tx_invalid.json
index 456e0d2f7b..9def4042da 100644
--- a/src/test/data/tx_invalid.json
+++ b/src/test/data/tx_invalid.json
@@ -19,6 +19,12 @@
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1 0x4c 0x47 0x3044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a01"]],
"01000000010001000000000000000000000000000000000000000000000000000000000000000000006b4c473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000", "P2SH"],
+["This is the nearly-standard transaction with CHECKSIGVERIFY 1 instead of CHECKSIG from tx_valid.json"],
+["but with the signature duplicated in the scriptPubKey with a different hashtype suffix"],
+["See FindAndDelete, which will only remove if the signature, including the hash type, matches"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1 0x47 0x3044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a81"]],
+"01000000010001000000000000000000000000000000000000000000000000000000000000000000006a473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000", "P2SH"],
+
["An invalid P2SH Transaction"],
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x7a052c840ba73af26755de42cf01cc9e0a49fef0 EQUAL"]],
"010000000100010000000000000000000000000000000000000000000000000000000000000000000009085768617420697320ffffffff010000000000000000015100000000", "P2SH"],
@@ -114,6 +120,70 @@
[[["a955032f4d6b0c9bfe8cad8f00a8933790b9c1dc28c82e0f48e75b35da0e4944", 0, "IF CODESEPARATOR ENDIF 0x21 0x0378d430274f8c5ec1321338151e9f27f4c676a008bdf8638d07c0b6be9ab35c71 CHECKSIGVERIFY CODESEPARATOR 1"]],
"010000000144490eda355be7480f2ec828dcc1b9903793a8008fad8cfe9b0c6b4d2f0355a9000000004a483045022100fa4a74ba9fd59c59f46c3960cf90cbe0d2b743c471d24a3d5d6db6002af5eebb02204d70ec490fd0f7055a7c45f86514336e3a7f03503dacecabb247fc23f15c83510100ffffffff010000000000000000016a00000000", "P2SH"],
+["CHECKLOCKTIMEVERIFY tests"],
+
+["By-height locks, with argument just beyond tx nLockTime"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1 NOP2 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 NOP2 1"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000fe64cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["By-time locks, with argument just beyond tx nLockTime (but within numerical boundries)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000001 NOP2 1"]],
+"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 NOP2 1"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000feffffff", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Argument missing"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "NOP2 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Argument negative with by-blockheight nLockTime=0"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "-1 NOP2 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Argument negative with by-blocktime nLockTime=500,000,000"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "-1 NOP2 1"]],
+"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Input locked"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff0100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Another input being unlocked isn't sufficient; the CHECKLOCKTIMEVERIFY-using input must be unlocked"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"] ,
+ ["0000000000000000000000000000000000000000000000000000000000000200", 1, "1"]],
+"010000000200010000000000000000000000000000000000000000000000000000000000000000000000ffffffff00020000000000000000000000000000000000000000000000000000000000000100000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Argument/tx height/time mismatch, both versions"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
+"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 NOP2 1"]],
+"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 NOP2 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 NOP2 1"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Argument 2^32 with nLockTime=2^32-1"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967296 NOP2 1"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Same, but with nLockTime=2^31-1"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483648 NOP2 1"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffff7f", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["6 byte non-minimally-encoded arguments are invalid even in their contents are valid"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x06 0x000000000000 NOP2 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Failure due to failing CHECKLOCKTIMEVERIFY in scriptSig"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1"]],
+"01000000010001000000000000000000000000000000000000000000000000000000000000000000000251b1000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Failure due to failing CHECKLOCKTIMEVERIFY in redeemScript"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0xc5b93064159b3b2d6ab506a41b1f50463771b988 EQUAL"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000030251b1000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
["Make diffs cleaner by leaving a comment here without comma at the end"]
]
diff --git a/src/test/data/tx_valid.json b/src/test/data/tx_valid.json
index 182b88ef67..24fff575c1 100644
--- a/src/test/data/tx_valid.json
+++ b/src/test/data/tx_valid.json
@@ -187,5 +187,47 @@
"0100000002dbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce000000006b4830450221009627444320dc5ef8d7f68f35010b4c050a6ed0d96b67a84db99fda9c9de58b1e02203e4b4aaa019e012e65d69b487fdf8719df72f488fa91506a80c49a33929f1fd50121022b78b756e2258af13779c1a1f37ea6800259716ca4b7f0b87610e0bf3ab52a01ffffffffdbb33bdf185b17f758af243c5d3c6e164cc873f6bb9f40c0677d6e0f8ee5afce010000009300483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303483045022015bd0139bcccf990a6af6ec5c1c52ed8222e03a0d51c334df139968525d2fcd20221009f9efe325476eb64c3958e4713e9eefe49bf1d820ed58d2112721b134e2a1a5303ffffffff01a0860100000000001976a9149bc0bbdd3024da4d0c38ed1aecf5c68dd1d3fa1288ac00000000", "P2SH"],
+["CHECKLOCKTIMEVERIFY tests"],
+
+["By-height locks, with argument == 0 and == tx nLockTime"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 NOP2 1"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ff64cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["By-time locks, with argument just beyond tx nLockTime (but within numerical boundries)"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 NOP2 1"]],
+"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "4294967295 NOP2 1"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff", "P2SH,CHECKLOCKTIMEVERIFY"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "500000000 NOP2 1"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000ffffffff", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Any non-maxint nSequence is fine"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0 NOP2 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000feffffff0100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["The argument can be calculated rather than created directly by a PUSHDATA"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "499999999 1ADD NOP2 1"]],
+"01000000010001000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000065cd1d", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Perhaps even by an ADD producing a 5-byte result that is out of bounds for other opcodes"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "2147483647 2147483647 ADD NOP2 1"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000feffffff", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["5 byte non-minimally-encoded arguments are valid"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x05 0x0000000000 NOP2 1"]],
+"010000000100010000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Valid CHECKLOCKTIMEVERIFY in scriptSig"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "1"]],
+"01000000010001000000000000000000000000000000000000000000000000000000000000000000000251b1000000000100000000000000000001000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+
+["Valid CHECKLOCKTIMEVERIFY in redeemScript"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0xc5b93064159b3b2d6ab506a41b1f50463771b988 EQUAL"]],
+"0100000001000100000000000000000000000000000000000000000000000000000000000000000000030251b1000000000100000000000000000001000000", "P2SH,CHECKLOCKTIMEVERIFY"],
+
["Make diffs cleaner by leaving a comment here without comma at the end"]
]
diff --git a/src/test/main_tests.cpp b/src/test/main_tests.cpp
index 9ec533bcca..21ae46d6e9 100644
--- a/src/test/main_tests.cpp
+++ b/src/test/main_tests.cpp
@@ -2,25 +2,58 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#include "primitives/transaction.h"
+#include "chainparams.h"
#include "main.h"
#include "test/test_bitcoin.h"
+#include <boost/signals2/signal.hpp>
#include <boost/test/unit_test.hpp>
BOOST_FIXTURE_TEST_SUITE(main_tests, TestingSetup)
+static void TestBlockSubsidyHalvings(const Consensus::Params& consensusParams)
+{
+ int maxHalvings = 64;
+ CAmount nInitialSubsidy = 50 * COIN;
+
+ CAmount nPreviousSubsidy = nInitialSubsidy * 2; // for height == 0
+ BOOST_CHECK_EQUAL(nPreviousSubsidy, nInitialSubsidy * 2);
+ for (int nHalvings = 0; nHalvings < maxHalvings; nHalvings++) {
+ int nHeight = nHalvings * consensusParams.nSubsidyHalvingInterval;
+ CAmount nSubsidy = GetBlockSubsidy(nHeight, consensusParams);
+ BOOST_CHECK(nSubsidy <= nInitialSubsidy);
+ BOOST_CHECK_EQUAL(nSubsidy, nPreviousSubsidy / 2);
+ nPreviousSubsidy = nSubsidy;
+ }
+ BOOST_CHECK_EQUAL(GetBlockSubsidy(maxHalvings * consensusParams.nSubsidyHalvingInterval, consensusParams), 0);
+}
+
+static void TestBlockSubsidyHalvings(int nSubsidyHalvingInterval)
+{
+ Consensus::Params consensusParams;
+ consensusParams.nSubsidyHalvingInterval = nSubsidyHalvingInterval;
+ TestBlockSubsidyHalvings(consensusParams);
+}
+
+BOOST_AUTO_TEST_CASE(block_subsidy_test)
+{
+ TestBlockSubsidyHalvings(Params(CBaseChainParams::MAIN).GetConsensus()); // As in main
+ TestBlockSubsidyHalvings(150); // As in regtest
+ TestBlockSubsidyHalvings(1000); // Just another interval
+}
+
BOOST_AUTO_TEST_CASE(subsidy_limit_test)
{
+ const Consensus::Params& consensusParams = Params(CBaseChainParams::MAIN).GetConsensus();
CAmount nSum = 0;
for (int nHeight = 0; nHeight < 14000000; nHeight += 1000) {
- CAmount nSubsidy = GetBlockValue(nHeight, 0);
+ CAmount nSubsidy = GetBlockSubsidy(nHeight, consensusParams);
BOOST_CHECK(nSubsidy <= 50 * COIN);
nSum += nSubsidy * 1000;
BOOST_CHECK(MoneyRange(nSum));
}
- BOOST_CHECK(nSum == 2099999997690000ULL);
+ BOOST_CHECK_EQUAL(nSum, 2099999997690000ULL);
}
bool ReturnFalse() { return false; }
diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp
index 6ab9cb8a44..212be0d2d6 100644
--- a/src/test/miner_tests.cpp
+++ b/src/test/miner_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 "consensus/validation.h"
#include "main.h"
#include "miner.h"
#include "pubkey.h"
@@ -59,7 +60,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
uint256 hash;
LOCK(cs_main);
- Checkpoints::fEnabled = false;
+ fCheckpointsEnabled = false;
// Simple block creation, nothing special yet:
BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey));
@@ -73,6 +74,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
pblock->nVersion = 1;
pblock->nTime = chainActive.Tip()->GetMedianTimePast()+1;
CMutableTransaction txCoinbase(pblock->vtx[0]);
+ txCoinbase.nVersion = 1;
txCoinbase.vin[0].scriptSig = CScript();
txCoinbase.vin[0].scriptSig.push_back(blockinfo[i].extranonce);
txCoinbase.vin[0].scriptSig.push_back(chainActive.Height());
@@ -83,7 +85,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
pblock->hashMerkleRoot = pblock->BuildMerkleTree();
pblock->nNonce = blockinfo[i].nonce;
CValidationState state;
- BOOST_CHECK(ProcessNewBlock(state, NULL, pblock));
+ BOOST_CHECK(ProcessNewBlock(state, NULL, pblock, true, NULL));
BOOST_CHECK(state.IsValid());
pblock->hashPrevBlock = pblock->GetHash();
}
@@ -222,7 +224,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
tx.nLockTime = chainActive.Tip()->nHeight+1;
hash = tx.GetHash();
mempool.addUnchecked(hash, CTxMemPoolEntry(tx, 11, GetTime(), 111.0, 11));
- BOOST_CHECK(!IsFinalTx(tx, chainActive.Tip()->nHeight + 1));
+ BOOST_CHECK(!CheckFinalTx(tx));
// time locked
tx2.vin.resize(1);
@@ -236,7 +238,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
tx2.nLockTime = chainActive.Tip()->GetMedianTimePast()+1;
hash = tx2.GetHash();
mempool.addUnchecked(hash, CTxMemPoolEntry(tx2, 11, GetTime(), 111.0, 11));
- BOOST_CHECK(!IsFinalTx(tx2));
+ BOOST_CHECK(!CheckFinalTx(tx2));
BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey));
@@ -248,8 +250,10 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
chainActive.Tip()->nHeight++;
SetMockTime(chainActive.Tip()->GetMedianTimePast()+2);
- BOOST_CHECK(IsFinalTx(tx, chainActive.Tip()->nHeight + 1));
- BOOST_CHECK(IsFinalTx(tx2));
+ // FIXME: we should *actually* create a new block so the following test
+ // works; CheckFinalTx() isn't fooled by monkey-patching nHeight.
+ //BOOST_CHECK(CheckFinalTx(tx));
+ //BOOST_CHECK(CheckFinalTx(tx2));
BOOST_CHECK(pblocktemplate = CreateNewBlock(scriptPubKey));
BOOST_CHECK_EQUAL(pblocktemplate->block.vtx.size(), 3);
@@ -262,7 +266,7 @@ BOOST_AUTO_TEST_CASE(CreateNewBlock_validity)
BOOST_FOREACH(CTransaction *tx, txFirst)
delete tx;
- Checkpoints::fEnabled = true;
+ fCheckpointsEnabled = true;
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/mruset_tests.cpp b/src/test/mruset_tests.cpp
index bd4e9c1d38..2b68f8899e 100644
--- a/src/test/mruset_tests.cpp
+++ b/src/test/mruset_tests.cpp
@@ -17,83 +17,65 @@
using namespace std;
-class mrutester
-{
-private:
- mruset<int> mru;
- std::set<int> set;
-
-public:
- mrutester() { mru.max_size(MAX_SIZE); }
- int size() const { return set.size(); }
-
- void insert(int n)
- {
- mru.insert(n);
- set.insert(n);
- BOOST_CHECK(mru == set);
- }
-};
-
BOOST_FIXTURE_TEST_SUITE(mruset_tests, BasicTestingSetup)
-// Test that an mruset behaves like a set, as long as no more than MAX_SIZE elements are in it
-BOOST_AUTO_TEST_CASE(mruset_like_set)
-{
-
- for (int nTest=0; nTest<NUM_TESTS; nTest++)
- {
- mrutester tester;
- while (tester.size() < MAX_SIZE)
- tester.insert(GetRandInt(2 * MAX_SIZE));
- }
-
-}
-
-// Test that an mruset's size never exceeds its max_size
-BOOST_AUTO_TEST_CASE(mruset_limited_size)
+BOOST_AUTO_TEST_CASE(mruset_test)
{
- for (int nTest=0; nTest<NUM_TESTS; nTest++)
- {
- mruset<int> mru(MAX_SIZE);
- for (int nAction=0; nAction<3*MAX_SIZE; nAction++)
- {
- int n = GetRandInt(2 * MAX_SIZE);
- mru.insert(n);
- BOOST_CHECK(mru.size() <= MAX_SIZE);
+ // The mruset being tested.
+ mruset<int> mru(5000);
+
+ // Run the test 10 times.
+ for (int test = 0; test < 10; test++) {
+ // Reset mru.
+ mru.clear();
+
+ // A deque + set to simulate the mruset.
+ std::deque<int> rep;
+ std::set<int> all;
+
+ // Insert 10000 random integers below 15000.
+ for (int j=0; j<10000; j++) {
+ int add = GetRandInt(15000);
+ mru.insert(add);
+
+ // Add the number to rep/all as well.
+ if (all.count(add) == 0) {
+ all.insert(add);
+ rep.push_back(add);
+ if (all.size() == 5001) {
+ all.erase(rep.front());
+ rep.pop_front();
+ }
+ }
+
+ // Do a full comparison between mru and the simulated mru every 1000 and every 5001 elements.
+ if (j % 1000 == 0 || j % 5001 == 0) {
+ mruset<int> mru2 = mru; // Also try making a copy
+
+ // Check that all elements that should be in there, are in there.
+ BOOST_FOREACH(int x, rep) {
+ BOOST_CHECK(mru.count(x));
+ BOOST_CHECK(mru2.count(x));
+ }
+
+ // Check that all elements that are in there, should be in there.
+ BOOST_FOREACH(int x, mru) {
+ BOOST_CHECK(all.count(x));
+ }
+
+ // Check that all elements that are in there, should be in there.
+ BOOST_FOREACH(int x, mru2) {
+ BOOST_CHECK(all.count(x));
+ }
+
+ for (int t = 0; t < 10; t++) {
+ int r = GetRandInt(15000);
+ BOOST_CHECK(all.count(r) == mru.count(r));
+ BOOST_CHECK(all.count(r) == mru2.count(r));
+ }
+ }
}
}
}
-// 16-bit permutation function
-int static permute(int n)
-{
- // hexadecimals of pi; verified to be linearly independent
- static const int table[16] = {0x243F, 0x6A88, 0x85A3, 0x08D3, 0x1319, 0x8A2E, 0x0370, 0x7344,
- 0xA409, 0x3822, 0x299F, 0x31D0, 0x082E, 0xFA98, 0xEC4E, 0x6C89};
-
- int ret = 0;
- for (int bit=0; bit<16; bit++)
- if (n & (1<<bit))
- ret ^= table[bit];
-
- return ret;
-}
-
-// Test that an mruset acts like a moving window, if no duplicate elements are added
-BOOST_AUTO_TEST_CASE(mruset_window)
-{
- mruset<int> mru(MAX_SIZE);
- for (int n=0; n<10*MAX_SIZE; n++)
- {
- mru.insert(permute(n));
-
- set<int> tester;
- for (int m=max(0,n-MAX_SIZE+1); m<=n; m++)
- tester.insert(permute(m));
-
- BOOST_CHECK(mru == tester);
- }
-}
-
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/netbase_tests.cpp b/src/test/netbase_tests.cpp
index cb357d295c..0f5e1615c6 100644
--- a/src/test/netbase_tests.cpp
+++ b/src/test/netbase_tests.cpp
@@ -117,6 +117,11 @@ BOOST_AUTO_TEST_CASE(subnet_test)
BOOST_CHECK(CSubNet("1:2:3:4:5:6:7:8").Match(CNetAddr("1:2:3:4:5:6:7:8")));
BOOST_CHECK(!CSubNet("1:2:3:4:5:6:7:8").Match(CNetAddr("1:2:3:4:5:6:7:9")));
BOOST_CHECK(CSubNet("1:2:3:4:5:6:7:0/112").Match(CNetAddr("1:2:3:4:5:6:7:1234")));
+ BOOST_CHECK(CSubNet("192.168.0.1/24").Match(CNetAddr("192.168.0.2")));
+ BOOST_CHECK(CSubNet("192.168.0.20/29").Match(CNetAddr("192.168.0.18")));
+ BOOST_CHECK(CSubNet("1.2.2.1/24").Match(CNetAddr("1.2.2.4")));
+ BOOST_CHECK(CSubNet("1.2.2.110/31").Match(CNetAddr("1.2.2.111")));
+ BOOST_CHECK(CSubNet("1.2.2.20/26").Match(CNetAddr("1.2.2.63")));
// All-Matching IPv6 Matches arbitrary IPv4 and IPv6
BOOST_CHECK(CSubNet("::/0").Match(CNetAddr("1:2:3:4:5:6:7:1234")));
BOOST_CHECK(CSubNet("::/0").Match(CNetAddr("1.2.3.4")));
diff --git a/src/test/policyestimator_tests.cpp b/src/test/policyestimator_tests.cpp
new file mode 100644
index 0000000000..cb64ee7c69
--- /dev/null
+++ b/src/test/policyestimator_tests.cpp
@@ -0,0 +1,186 @@
+// Copyright (c) 2011-2015 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 "txmempool.h"
+#include "uint256.h"
+#include "util.h"
+
+#include "test/test_bitcoin.h"
+
+#include <boost/test/unit_test.hpp>
+
+BOOST_FIXTURE_TEST_SUITE(policyestimator_tests, BasicTestingSetup)
+
+BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
+{
+ CTxMemPool mpool(CFeeRate(1000));
+ CAmount basefee(2000);
+ double basepri = 1e6;
+ CAmount deltaFee(100);
+ double deltaPri=5e5;
+ std::vector<CAmount> feeV[2];
+ std::vector<double> priV[2];
+
+ // Populate vectors of increasing fees or priorities
+ for (int j = 0; j < 10; j++) {
+ //V[0] is for fee transactions
+ feeV[0].push_back(basefee * (j+1));
+ priV[0].push_back(0);
+ //V[1] is for priority transactions
+ feeV[1].push_back(CAmount(0));
+ priV[1].push_back(basepri * pow(10, j+1));
+ }
+
+ // Store the hashes of transactions that have been
+ // added to the mempool by their associate fee/pri
+ // txHashes[j] is populated with transactions either of
+ // fee = basefee * (j+1) OR pri = 10^6 * 10^(j+1)
+ std::vector<uint256> txHashes[10];
+
+ // Create a transaction template
+ CScript garbage;
+ for (unsigned int i = 0; i < 128; i++)
+ garbage.push_back('X');
+ CMutableTransaction tx;
+ std::list<CTransaction> dummyConflicted;
+ tx.vin.resize(1);
+ tx.vin[0].scriptSig = garbage;
+ tx.vout.resize(1);
+ tx.vout[0].nValue=0LL;
+ CFeeRate baseRate(basefee, ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION));
+
+ // Create a fake block
+ std::vector<CTransaction> block;
+ int blocknum = 0;
+
+ // Loop through 200 blocks
+ // At a decay .998 and 4 fee transactions per block
+ // This makes the tx count about 1.33 per bucket, above the 1 threshold
+ while (blocknum < 200) {
+ for (int j = 0; j < 10; j++) { // For each fee/pri multiple
+ for (int k = 0; k < 5; k++) { // add 4 fee txs for every priority tx
+ tx.vin[0].prevout.n = 10000*blocknum+100*j+k; // make transaction unique
+ uint256 hash = tx.GetHash();
+ mpool.addUnchecked(hash, CTxMemPoolEntry(tx, feeV[k/4][j], GetTime(), priV[k/4][j], blocknum, mpool.HasNoInputsOf(tx)));
+ txHashes[j].push_back(hash);
+ }
+ }
+ //Create blocks where higher fee/pri txs are included more often
+ for (int h = 0; h <= blocknum%10; h++) {
+ // 10/10 blocks add highest fee/pri transactions
+ // 9/10 blocks add 2nd highest and so on until ...
+ // 1/10 blocks add lowest fee/pri transactions
+ while (txHashes[9-h].size()) {
+ CTransaction btx;
+ if (mpool.lookup(txHashes[9-h].back(), btx))
+ block.push_back(btx);
+ txHashes[9-h].pop_back();
+ }
+ }
+ mpool.removeForBlock(block, ++blocknum, dummyConflicted);
+ block.clear();
+ if (blocknum == 30) {
+ // At this point we should need to combine 5 buckets to get enough data points
+ // So estimateFee(1) should fail and estimateFee(2) should return somewhere around
+ // 8*baserate
+ BOOST_CHECK(mpool.estimateFee(1) == CFeeRate(0));
+ BOOST_CHECK(mpool.estimateFee(2).GetFeePerK() < 8*baseRate.GetFeePerK() + deltaFee);
+ BOOST_CHECK(mpool.estimateFee(2).GetFeePerK() > 8*baseRate.GetFeePerK() - deltaFee);
+ }
+ }
+
+ std::vector<CAmount> origFeeEst;
+ std::vector<double> origPriEst;
+ // Highest feerate is 10*baseRate and gets in all blocks,
+ // second highest feerate is 9*baseRate and gets in 9/10 blocks = 90%,
+ // third highest feerate is 8*base rate, and gets in 8/10 blocks = 80%,
+ // so estimateFee(1) should return 9*baseRate.
+ // Third highest feerate has 90% chance of being included by 2 blocks,
+ // so estimateFee(2) should return 8*baseRate etc...
+ for (int i = 1; i < 10;i++) {
+ origFeeEst.push_back(mpool.estimateFee(i).GetFeePerK());
+ origPriEst.push_back(mpool.estimatePriority(i));
+ if (i > 1) { // Fee estimates should be monotonically decreasing
+ BOOST_CHECK(origFeeEst[i-1] <= origFeeEst[i-2]);
+ BOOST_CHECK(origPriEst[i-1] <= origPriEst[i-2]);
+ }
+ BOOST_CHECK(origFeeEst[i-1] < (10-i)*baseRate.GetFeePerK() + deltaFee);
+ BOOST_CHECK(origFeeEst[i-1] > (10-i)*baseRate.GetFeePerK() - deltaFee);
+ BOOST_CHECK(origPriEst[i-1] < pow(10,10-i) * basepri + deltaPri);
+ BOOST_CHECK(origPriEst[i-1] > pow(10,10-i) * basepri - deltaPri);
+ }
+
+ // Mine 50 more blocks with no transactions happening, estimates shouldn't change
+ // We haven't decayed the moving average enough so we still have enough data points in every bucket
+ while (blocknum < 250)
+ mpool.removeForBlock(block, ++blocknum, dummyConflicted);
+
+ for (int i = 1; i < 10;i++) {
+ BOOST_CHECK(mpool.estimateFee(i).GetFeePerK() < origFeeEst[i-1] + deltaFee);
+ BOOST_CHECK(mpool.estimateFee(i).GetFeePerK() > origFeeEst[i-1] - deltaFee);
+ BOOST_CHECK(mpool.estimatePriority(i) < origPriEst[i-1] + deltaPri);
+ BOOST_CHECK(mpool.estimatePriority(i) > origPriEst[i-1] - deltaPri);
+ }
+
+
+ // Mine 15 more blocks with lots of transactions happening and not getting mined
+ // Estimates should go up
+ while (blocknum < 265) {
+ for (int j = 0; j < 10; j++) { // For each fee/pri multiple
+ for (int k = 0; k < 5; k++) { // add 4 fee txs for every priority tx
+ tx.vin[0].prevout.n = 10000*blocknum+100*j+k;
+ uint256 hash = tx.GetHash();
+ mpool.addUnchecked(hash, CTxMemPoolEntry(tx, feeV[k/4][j], GetTime(), priV[k/4][j], blocknum, mpool.HasNoInputsOf(tx)));
+ txHashes[j].push_back(hash);
+ }
+ }
+ mpool.removeForBlock(block, ++blocknum, dummyConflicted);
+ }
+
+ for (int i = 1; i < 10;i++) {
+ BOOST_CHECK(mpool.estimateFee(i).GetFeePerK() > origFeeEst[i-1] - deltaFee);
+ BOOST_CHECK(mpool.estimatePriority(i) > origPriEst[i-1] - deltaPri);
+ }
+
+ // Mine all those transactions
+ // Estimates should still not be below original
+ for (int j = 0; j < 10; j++) {
+ while(txHashes[j].size()) {
+ CTransaction btx;
+ if (mpool.lookup(txHashes[j].back(), btx))
+ block.push_back(btx);
+ txHashes[j].pop_back();
+ }
+ }
+ mpool.removeForBlock(block, 265, dummyConflicted);
+ block.clear();
+ for (int i = 1; i < 10;i++) {
+ BOOST_CHECK(mpool.estimateFee(i).GetFeePerK() > origFeeEst[i-1] - deltaFee);
+ BOOST_CHECK(mpool.estimatePriority(i) > origPriEst[i-1] - deltaPri);
+ }
+
+ // Mine 100 more blocks where everything is mined every block
+ // Estimates should be below original estimates (not possible for last estimate)
+ while (blocknum < 365) {
+ for (int j = 0; j < 10; j++) { // For each fee/pri multiple
+ for (int k = 0; k < 5; k++) { // add 4 fee txs for every priority tx
+ tx.vin[0].prevout.n = 10000*blocknum+100*j+k;
+ uint256 hash = tx.GetHash();
+ mpool.addUnchecked(hash, CTxMemPoolEntry(tx, feeV[k/4][j], GetTime(), priV[k/4][j], blocknum, mpool.HasNoInputsOf(tx)));
+ CTransaction btx;
+ if (mpool.lookup(hash, btx))
+ block.push_back(btx);
+ }
+ }
+ mpool.removeForBlock(block, ++blocknum, dummyConflicted);
+ block.clear();
+ }
+ for (int i = 1; i < 9; i++) {
+ BOOST_CHECK(mpool.estimateFee(i).GetFeePerK() < origFeeEst[i-1] - deltaFee);
+ BOOST_CHECK(mpool.estimatePriority(i) < origPriEst[i-1] - deltaPri);
+ }
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/pow_tests.cpp b/src/test/pow_tests.cpp
index 4ce1591c35..a436749287 100644
--- a/src/test/pow_tests.cpp
+++ b/src/test/pow_tests.cpp
@@ -69,4 +69,28 @@ BOOST_AUTO_TEST_CASE(get_next_work_upper_limit_actual)
BOOST_CHECK_EQUAL(CalculateNextWorkRequired(&pindexLast, nLastRetargetTime, params), 0x1d00e1fd);
}
+BOOST_AUTO_TEST_CASE(GetBlockProofEquivalentTime_test)
+{
+ SelectParams(CBaseChainParams::MAIN);
+ const Consensus::Params& params = Params().GetConsensus();
+
+ std::vector<CBlockIndex> blocks(10000);
+ for (int i = 0; i < 10000; i++) {
+ blocks[i].pprev = i ? &blocks[i - 1] : NULL;
+ blocks[i].nHeight = i;
+ blocks[i].nTime = 1269211443 + i * params.nPowTargetSpacing;
+ blocks[i].nBits = 0x207fffff; /* target 0x7fffff000... */
+ blocks[i].nChainWork = i ? blocks[i - 1].nChainWork + GetBlockProof(blocks[i - 1]) : arith_uint256(0);
+ }
+
+ for (int j = 0; j < 1000; j++) {
+ CBlockIndex *p1 = &blocks[GetRand(10000)];
+ CBlockIndex *p2 = &blocks[GetRand(10000)];
+ CBlockIndex *p3 = &blocks[GetRand(10000)];
+
+ int64_t tdiff = GetBlockProofEquivalentTime(*p1, *p2, *p3, params);
+ BOOST_CHECK_EQUAL(tdiff, p1->GetBlockTime() - p2->GetBlockTime());
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/rpc_tests.cpp b/src/test/rpc_tests.cpp
index 45cb551d04..c38df0ecf3 100644
--- a/src/test/rpc_tests.cpp
+++ b/src/test/rpc_tests.cpp
@@ -13,35 +13,36 @@
#include <boost/algorithm/string.hpp>
#include <boost/test/unit_test.hpp>
+#include "univalue/univalue.h"
+
using namespace std;
-using namespace json_spirit;
-Array
+UniValue
createArgs(int nRequired, const char* address1=NULL, const char* address2=NULL)
{
- Array result;
+ UniValue result(UniValue::VARR);
result.push_back(nRequired);
- Array addresses;
+ UniValue addresses(UniValue::VARR);
if (address1) addresses.push_back(address1);
if (address2) addresses.push_back(address2);
result.push_back(addresses);
return result;
}
-Value CallRPC(string args)
+UniValue CallRPC(string args)
{
vector<string> vArgs;
boost::split(vArgs, args, boost::is_any_of(" \t"));
string strMethod = vArgs[0];
vArgs.erase(vArgs.begin());
- Array params = RPCConvertValues(strMethod, vArgs);
+ UniValue params = RPCConvertValues(strMethod, vArgs);
rpcfn_type method = tableRPC[strMethod]->actor;
try {
- Value result = (*method)(params, false);
+ UniValue result = (*method)(params, false);
return result;
}
- catch (const Object& objError) {
+ catch (const UniValue& objError) {
throw runtime_error(find_value(objError, "message").get_str());
}
}
@@ -52,7 +53,7 @@ BOOST_FIXTURE_TEST_SUITE(rpc_tests, TestingSetup)
BOOST_AUTO_TEST_CASE(rpc_rawparams)
{
// Test raw transaction API argument handling
- Value r;
+ UniValue r;
BOOST_CHECK_THROW(CallRPC("getrawtransaction"), runtime_error);
BOOST_CHECK_THROW(CallRPC("getrawtransaction not_hex"), runtime_error);
@@ -92,7 +93,7 @@ BOOST_AUTO_TEST_CASE(rpc_rawparams)
BOOST_AUTO_TEST_CASE(rpc_rawsign)
{
- Value r;
+ UniValue r;
// input is a 1-of-2 multisig (so is output):
string prevout =
"[{\"txid\":\"b4cc287e58f87cdae59417329f710f3ecd75a4ee1d2872b7248f50977c8493f3\","
@@ -111,25 +112,28 @@ BOOST_AUTO_TEST_CASE(rpc_rawsign)
BOOST_AUTO_TEST_CASE(rpc_format_monetary_values)
{
- BOOST_CHECK_EQUAL(write_string(ValueFromAmount(0LL), false), "0.00000000");
- BOOST_CHECK_EQUAL(write_string(ValueFromAmount(1LL), false), "0.00000001");
- BOOST_CHECK_EQUAL(write_string(ValueFromAmount(17622195LL), false), "0.17622195");
- BOOST_CHECK_EQUAL(write_string(ValueFromAmount(50000000LL), false), "0.50000000");
- BOOST_CHECK_EQUAL(write_string(ValueFromAmount(89898989LL), false), "0.89898989");
- BOOST_CHECK_EQUAL(write_string(ValueFromAmount(100000000LL), false), "1.00000000");
- BOOST_CHECK_EQUAL(write_string(ValueFromAmount(2099999999999990LL), false), "20999999.99999990");
- BOOST_CHECK_EQUAL(write_string(ValueFromAmount(2099999999999999LL), false), "20999999.99999999");
+ BOOST_CHECK(ValueFromAmount(0LL).write() == "0.00000000");
+ BOOST_CHECK(ValueFromAmount(1LL).write() == "0.00000001");
+ BOOST_CHECK(ValueFromAmount(17622195LL).write() == "0.17622195");
+ BOOST_CHECK(ValueFromAmount(50000000LL).write() == "0.50000000");
+ BOOST_CHECK(ValueFromAmount(89898989LL).write() == "0.89898989");
+ BOOST_CHECK(ValueFromAmount(100000000LL).write() == "1.00000000");
+ BOOST_CHECK(ValueFromAmount(2099999999999990LL).write() == "20999999.99999990");
+ BOOST_CHECK(ValueFromAmount(2099999999999999LL).write() == "20999999.99999999");
}
-static Value ValueFromString(const std::string &str)
+static UniValue ValueFromString(const std::string &str)
{
- Value value;
- BOOST_CHECK(read_string(str, value));
+ UniValue value;
+ BOOST_CHECK(value.setNumStr(str));
return value;
}
BOOST_AUTO_TEST_CASE(rpc_parse_monetary_values)
{
+ BOOST_CHECK_THROW(AmountFromValue(ValueFromString("-0.00000001")), UniValue);
+ BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0")), 0LL);
+ BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000000")), 0LL);
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.00000001")), 1LL);
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.17622195")), 17622195LL);
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("0.5")), 50000000LL);
@@ -140,6 +144,24 @@ BOOST_AUTO_TEST_CASE(rpc_parse_monetary_values)
BOOST_CHECK_EQUAL(AmountFromValue(ValueFromString("20999999.99999999")), 2099999999999999LL);
}
+BOOST_AUTO_TEST_CASE(json_parse_errors)
+{
+ // Valid
+ BOOST_CHECK_EQUAL(ParseNonRFCJSONValue("1.0").get_real(), 1.0);
+ // Valid, with leading or trailing whitespace
+ BOOST_CHECK_EQUAL(ParseNonRFCJSONValue(" 1.0").get_real(), 1.0);
+ BOOST_CHECK_EQUAL(ParseNonRFCJSONValue("1.0 ").get_real(), 1.0);
+ // Invalid, initial garbage
+ BOOST_CHECK_THROW(ParseNonRFCJSONValue("[1.0"), std::runtime_error);
+ BOOST_CHECK_THROW(ParseNonRFCJSONValue("a1.0"), std::runtime_error);
+ // Invalid, trailing garbage
+ BOOST_CHECK_THROW(ParseNonRFCJSONValue("1.0sds"), std::runtime_error);
+ BOOST_CHECK_THROW(ParseNonRFCJSONValue("1.0]"), std::runtime_error);
+ // BTC addresses should fail parsing
+ BOOST_CHECK_THROW(ParseNonRFCJSONValue("175tWpb8K1S7NmH4Zx6rewF9WQrcZv245W"), std::runtime_error);
+ BOOST_CHECK_THROW(ParseNonRFCJSONValue("3J98t1WpEZ73CNmQviecrnyiWrnqRhWNL"), std::runtime_error);
+}
+
BOOST_AUTO_TEST_CASE(rpc_boostasiotocnetaddr)
{
// Check IPv4 addresses
@@ -155,4 +177,87 @@ BOOST_AUTO_TEST_CASE(rpc_boostasiotocnetaddr)
BOOST_CHECK_EQUAL(BoostAsioToCNetAddr(boost::asio::ip::address::from_string("::ffff:127.0.0.1")).ToString(), "127.0.0.1");
}
+BOOST_AUTO_TEST_CASE(rpc_ban)
+{
+ BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
+
+ UniValue r;
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0 add")));
+ BOOST_CHECK_THROW(r = CallRPC(string("setban 127.0.0.0:8334")), runtime_error); //portnumber for setban not allowed
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
+ UniValue ar = r.get_array();
+ UniValue o1 = ar[0].get_obj();
+ UniValue adr = find_value(o1, "address");
+ BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.255");
+ BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0 remove")));;
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
+ ar = r.get_array();
+ BOOST_CHECK_EQUAL(ar.size(), 0);
+
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0/24 add 1607731200 true")));
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
+ ar = r.get_array();
+ o1 = ar[0].get_obj();
+ adr = find_value(o1, "address");
+ UniValue banned_until = find_value(o1, "banned_untill");
+ BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.0");
+ BOOST_CHECK_EQUAL(banned_until.get_int64(), 1607731200); // absolute time check
+
+ BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
+
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0/24 add 200")));
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
+ ar = r.get_array();
+ o1 = ar[0].get_obj();
+ adr = find_value(o1, "address");
+ banned_until = find_value(o1, "banned_untill");
+ BOOST_CHECK_EQUAL(adr.get_str(), "127.0.0.0/255.255.255.0");
+ int64_t now = GetTime();
+ BOOST_CHECK(banned_until.get_int64() > now);
+ BOOST_CHECK(banned_until.get_int64()-now <= 200);
+
+ // must throw an exception because 127.0.0.1 is in already banned suubnet range
+ BOOST_CHECK_THROW(r = CallRPC(string("setban 127.0.0.1 add")), runtime_error);
+
+ BOOST_CHECK_NO_THROW(CallRPC(string("setban 127.0.0.0/24 remove")));;
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
+ ar = r.get_array();
+ BOOST_CHECK_EQUAL(ar.size(), 0);
+
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 127.0.0.0/255.255.0.0 add")));
+ BOOST_CHECK_THROW(r = CallRPC(string("setban 127.0.1.1 add")), runtime_error);
+
+ BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
+ ar = r.get_array();
+ BOOST_CHECK_EQUAL(ar.size(), 0);
+
+
+ BOOST_CHECK_THROW(r = CallRPC(string("setban test add")), runtime_error); //invalid IP
+
+ //IPv6 tests
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("setban FE80:0000:0000:0000:0202:B3FF:FE1E:8329 add")));
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
+ ar = r.get_array();
+ o1 = ar[0].get_obj();
+ adr = find_value(o1, "address");
+ BOOST_CHECK_EQUAL(adr.get_str(), "fe80::202:b3ff:fe1e:8329/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
+
+ BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 2001:db8::/30 add")));
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
+ ar = r.get_array();
+ o1 = ar[0].get_obj();
+ adr = find_value(o1, "address");
+ BOOST_CHECK_EQUAL(adr.get_str(), "2001:db8::/ffff:fffc:0:0:0:0:0:0");
+
+ BOOST_CHECK_NO_THROW(CallRPC(string("clearbanned")));
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("setban 2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/128 add")));
+ BOOST_CHECK_NO_THROW(r = CallRPC(string("listbanned")));
+ ar = r.get_array();
+ o1 = ar[0].get_obj();
+ adr = find_value(o1, "address");
+ BOOST_CHECK_EQUAL(adr.get_str(), "2001:4d48:ac57:400:cacf:e9ff:fe1d:9c63/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp
index 4d5e92cbd4..9368963ff2 100644
--- a/src/test/rpc_wallet_tests.cpp
+++ b/src/test/rpc_wallet_tests.cpp
@@ -14,11 +14,12 @@
#include <boost/algorithm/string.hpp>
#include <boost/test/unit_test.hpp>
+#include "univalue/univalue.h"
+
using namespace std;
-using namespace json_spirit;
-extern Array createArgs(int nRequired, const char* address1 = NULL, const char* address2 = NULL);
-extern Value CallRPC(string args);
+extern UniValue createArgs(int nRequired, const char* address1 = NULL, const char* address2 = NULL);
+extern UniValue CallRPC(string args);
extern CWallet* pwalletMain;
@@ -35,7 +36,7 @@ BOOST_AUTO_TEST_CASE(rpc_addmultisig)
// new, compressed:
const char address2Hex[] = "0388c2037017c62240b6b72ac1a2a5f94da790596ebd06177c8572752922165cb4";
- Value v;
+ UniValue v;
CBitcoinAddress address;
BOOST_CHECK_NO_THROW(v = addmultisig(createArgs(1, address1Hex), false));
address.SetString(v.get_str());
@@ -66,13 +67,13 @@ BOOST_AUTO_TEST_CASE(rpc_addmultisig)
BOOST_AUTO_TEST_CASE(rpc_wallet)
{
// Test RPC calls for various wallet statistics
- Value r;
+ UniValue r;
LOCK2(cs_main, pwalletMain->cs_wallet);
CPubKey demoPubkey = pwalletMain->GenerateNewKey();
CBitcoinAddress demoAddress = CBitcoinAddress(CTxDestination(demoPubkey.GetID()));
- Value retValue;
+ UniValue retValue;
string strAccount = "walletDemoAccount";
string strPurpose = "receive";
BOOST_CHECK_NO_THROW({ /*Initialize Wallet with an account */
@@ -213,9 +214,15 @@ BOOST_AUTO_TEST_CASE(rpc_wallet)
*********************************/
BOOST_CHECK_THROW(CallRPC("getaddressesbyaccount"), runtime_error);
BOOST_CHECK_NO_THROW(retValue = CallRPC("getaddressesbyaccount " + strAccount));
- Array arr = retValue.get_array();
+ UniValue arr = retValue.get_array();
BOOST_CHECK(arr.size() > 0);
BOOST_CHECK(CBitcoinAddress(arr[0].get_str()).Get() == demoAddress.Get());
+
+ /*********************************
+ * fundrawtransaction
+ *********************************/
+ BOOST_CHECK_THROW(CallRPC("fundrawtransaction 28z"), runtime_error);
+ BOOST_CHECK_THROW(CallRPC("fundrawtransaction 01000000000180969800000000001976a91450ce0a4b0ee0ddeb633da85199728b940ac3fe9488ac00000000"), runtime_error);
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/scheduler_tests.cpp b/src/test/scheduler_tests.cpp
new file mode 100644
index 0000000000..cb1a427db0
--- /dev/null
+++ b/src/test/scheduler_tests.cpp
@@ -0,0 +1,119 @@
+// Copyright (c) 2012-2013 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 "random.h"
+#include "scheduler.h"
+
+#include "test/test_bitcoin.h"
+
+#include <boost/bind.hpp>
+#include <boost/random/mersenne_twister.hpp>
+#include <boost/random/uniform_int_distribution.hpp>
+#include <boost/thread.hpp>
+#include <boost/test/unit_test.hpp>
+
+BOOST_AUTO_TEST_SUITE(scheduler_tests)
+
+static void microTask(CScheduler& s, boost::mutex& mutex, int& counter, int delta, boost::chrono::system_clock::time_point rescheduleTime)
+{
+ {
+ boost::unique_lock<boost::mutex> lock(mutex);
+ counter += delta;
+ }
+ boost::chrono::system_clock::time_point noTime = boost::chrono::system_clock::time_point::min();
+ if (rescheduleTime != noTime) {
+ CScheduler::Function f = boost::bind(&microTask, boost::ref(s), boost::ref(mutex), boost::ref(counter), -delta + 1, noTime);
+ s.schedule(f, rescheduleTime);
+ }
+}
+
+static void MicroSleep(uint64_t n)
+{
+#if defined(HAVE_WORKING_BOOST_SLEEP_FOR)
+ boost::this_thread::sleep_for(boost::chrono::microseconds(n));
+#elif defined(HAVE_WORKING_BOOST_SLEEP)
+ boost::this_thread::sleep(boost::posix_time::microseconds(n));
+#else
+ //should never get here
+ #error missing boost sleep implementation
+#endif
+}
+
+BOOST_AUTO_TEST_CASE(manythreads)
+{
+ seed_insecure_rand(false);
+
+ // Stress test: hundreds of microsecond-scheduled tasks,
+ // serviced by 10 threads.
+ //
+ // So... ten shared counters, which if all the tasks execute
+ // properly will sum to the number of tasks done.
+ // Each task adds or subtracts from one of the counters a
+ // random amount, and then schedules another task 0-1000
+ // microseconds in the future to subtract or add from
+ // the counter -random_amount+1, so in the end the shared
+ // counters should sum to the number of initial tasks performed.
+ CScheduler microTasks;
+
+ boost::mutex counterMutex[10];
+ int counter[10] = { 0 };
+ boost::random::mt19937 rng(insecure_rand());
+ boost::random::uniform_int_distribution<> zeroToNine(0, 9);
+ boost::random::uniform_int_distribution<> randomMsec(-11, 1000);
+ boost::random::uniform_int_distribution<> randomDelta(-1000, 1000);
+
+ boost::chrono::system_clock::time_point start = boost::chrono::system_clock::now();
+ boost::chrono::system_clock::time_point now = start;
+ boost::chrono::system_clock::time_point first, last;
+ size_t nTasks = microTasks.getQueueInfo(first, last);
+ BOOST_CHECK(nTasks == 0);
+
+ for (int i = 0; i < 100; i++) {
+ boost::chrono::system_clock::time_point t = now + boost::chrono::microseconds(randomMsec(rng));
+ boost::chrono::system_clock::time_point tReschedule = now + boost::chrono::microseconds(500 + randomMsec(rng));
+ int whichCounter = zeroToNine(rng);
+ CScheduler::Function f = boost::bind(&microTask, boost::ref(microTasks),
+ boost::ref(counterMutex[whichCounter]), boost::ref(counter[whichCounter]),
+ randomDelta(rng), tReschedule);
+ microTasks.schedule(f, t);
+ }
+ nTasks = microTasks.getQueueInfo(first, last);
+ BOOST_CHECK(nTasks == 100);
+ BOOST_CHECK(first < last);
+ BOOST_CHECK(last > now);
+
+ // As soon as these are created they will start running and servicing the queue
+ boost::thread_group microThreads;
+ for (int i = 0; i < 5; i++)
+ microThreads.create_thread(boost::bind(&CScheduler::serviceQueue, &microTasks));
+
+ MicroSleep(600);
+ now = boost::chrono::system_clock::now();
+
+ // More threads and more tasks:
+ for (int i = 0; i < 5; i++)
+ microThreads.create_thread(boost::bind(&CScheduler::serviceQueue, &microTasks));
+ for (int i = 0; i < 100; i++) {
+ boost::chrono::system_clock::time_point t = now + boost::chrono::microseconds(randomMsec(rng));
+ boost::chrono::system_clock::time_point tReschedule = now + boost::chrono::microseconds(500 + randomMsec(rng));
+ int whichCounter = zeroToNine(rng);
+ CScheduler::Function f = boost::bind(&microTask, boost::ref(microTasks),
+ boost::ref(counterMutex[whichCounter]), boost::ref(counter[whichCounter]),
+ randomDelta(rng), tReschedule);
+ microTasks.schedule(f, t);
+ }
+
+ // Drain the task queue then exit threads
+ microTasks.stop(true);
+ microThreads.join_all(); // ... wait until all the threads are done
+
+ int counterSum = 0;
+ for (int i = 0; i < 10; i++) {
+ BOOST_CHECK(counter[i] != 0);
+ counterSum += counter[i];
+ }
+ BOOST_CHECK_EQUAL(counterSum, 200);
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp
index c0614cca43..3733425699 100644
--- a/src/test/script_tests.cpp
+++ b/src/test/script_tests.cpp
@@ -26,12 +26,10 @@
#include <boost/foreach.hpp>
#include <boost/test/unit_test.hpp>
-#include "json/json_spirit_reader_template.h"
-#include "json/json_spirit_utils.h"
-#include "json/json_spirit_writer_template.h"
+
+#include "univalue/univalue.h"
using namespace std;
-using namespace json_spirit;
// Uncomment if you want to output updated JSON tests.
// #define UPDATE_JSON_TESTS
@@ -41,15 +39,15 @@ static const unsigned int flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC;
unsigned int ParseScriptFlags(string strFlags);
string FormatScriptFlags(unsigned int flags);
-Array
+UniValue
read_json(const std::string& jsondata)
{
- Value v;
+ UniValue v;
- if (!read_string(jsondata, v) || v.type() != array_type)
+ if (!v.read(jsondata) || !v.isArray())
{
BOOST_ERROR("Parse error.");
- return Array();
+ return UniValue(UniValue::VARR);
}
return v.get_array();
}
@@ -295,10 +293,10 @@ public:
return *this;
}
- Array GetJSON()
+ UniValue GetJSON()
{
DoPush();
- Array array;
+ UniValue array(UniValue::VARR);
array.push_back(FormatScript(spendTx.vin[0].scriptSig));
array.push_back(FormatScript(creditTx.vout[0].scriptPubKey));
array.push_back(FormatScriptFlags(flags));
@@ -582,14 +580,16 @@ BOOST_AUTO_TEST_CASE(script_build)
std::set<std::string> tests_bad;
{
- Array json_good = read_json(std::string(json_tests::script_valid, json_tests::script_valid + sizeof(json_tests::script_valid)));
- Array json_bad = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid)));
+ UniValue json_good = read_json(std::string(json_tests::script_valid, json_tests::script_valid + sizeof(json_tests::script_valid)));
+ UniValue json_bad = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid)));
- BOOST_FOREACH(Value& tv, json_good) {
- tests_good.insert(write_string(Value(tv.get_array()), true));
+ for (unsigned int idx = 0; idx < json_good.size(); idx++) {
+ const UniValue& tv = json_good[idx];
+ tests_good.insert(tv.get_array().write());
}
- BOOST_FOREACH(Value& tv, json_bad) {
- tests_bad.insert(write_string(Value(tv.get_array()), true));
+ for (unsigned int idx = 0; idx < json_bad.size(); idx++) {
+ const UniValue& tv = json_bad[idx];
+ tests_bad.insert(tv.get_array().write());
}
}
@@ -598,7 +598,7 @@ BOOST_AUTO_TEST_CASE(script_build)
BOOST_FOREACH(TestBuilder& test, good) {
test.Test(true);
- std::string str = write_string(Value(test.GetJSON()), true);
+ std::string str = test.GetJSON().write();
#ifndef UPDATE_JSON_TESTS
if (tests_good.count(str) == 0) {
BOOST_CHECK_MESSAGE(false, "Missing auto script_valid test: " + test.GetComment());
@@ -608,7 +608,7 @@ BOOST_AUTO_TEST_CASE(script_build)
}
BOOST_FOREACH(TestBuilder& test, bad) {
test.Test(false);
- std::string str = write_string(Value(test.GetJSON()), true);
+ std::string str = test.GetJSON().write();
#ifndef UPDATE_JSON_TESTS
if (tests_bad.count(str) == 0) {
BOOST_CHECK_MESSAGE(false, "Missing auto script_invalid test: " + test.GetComment());
@@ -634,12 +634,11 @@ BOOST_AUTO_TEST_CASE(script_valid)
// Inner arrays are [ "scriptSig", "scriptPubKey", "flags" ]
// ... where scriptSig and scriptPubKey are stringified
// scripts.
- Array tests = read_json(std::string(json_tests::script_valid, json_tests::script_valid + sizeof(json_tests::script_valid)));
+ UniValue tests = read_json(std::string(json_tests::script_valid, json_tests::script_valid + sizeof(json_tests::script_valid)));
- BOOST_FOREACH(Value& tv, tests)
- {
- Array test = tv.get_array();
- string strTest = write_string(tv, false);
+ for (unsigned int idx = 0; idx < tests.size(); idx++) {
+ UniValue test = tests[idx];
+ string strTest = test.write();
if (test.size() < 3) // Allow size > 3; extra stuff ignored (useful for comments)
{
if (test.size() != 1) {
@@ -660,13 +659,12 @@ BOOST_AUTO_TEST_CASE(script_valid)
BOOST_AUTO_TEST_CASE(script_invalid)
{
// Scripts that should evaluate as invalid
- Array tests = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid)));
+ UniValue tests = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid)));
- BOOST_FOREACH(Value& tv, tests)
- {
- Array test = tv.get_array();
- string strTest = write_string(tv, false);
- if (test.size() < 3) // Allow size > 3; extra stuff ignored (useful for comments)
+ for (unsigned int idx = 0; idx < tests.size(); idx++) {
+ UniValue test = tests[idx];
+ string strTest = test.write();
+ if (test.size() < 3) // Allow size > 2; extra stuff ignored (useful for comments)
{
if (test.size() != 1) {
BOOST_ERROR("Bad test: " << strTest);
diff --git a/src/test/scriptnum_tests.cpp b/src/test/scriptnum_tests.cpp
index 24c7dd3d5a..d95724dbe1 100644
--- a/src/test/scriptnum_tests.cpp
+++ b/src/test/scriptnum_tests.cpp
@@ -145,7 +145,7 @@ static void RunCreate(const int64_t& num)
{
CheckCreateInt(num);
CScriptNum scriptnum(num);
- if (scriptnum.getvch().size() <= CScriptNum::nMaxNumSize)
+ if (scriptnum.getvch().size() <= CScriptNum::nDefaultMaxNumSize)
CheckCreateVch(num);
else
{
diff --git a/src/test/sighash_tests.cpp b/src/test/sighash_tests.cpp
index afb7a41bbd..a0797d5f3f 100644
--- a/src/test/sighash_tests.cpp
+++ b/src/test/sighash_tests.cpp
@@ -2,25 +2,24 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#include "consensus/validation.h"
#include "data/sighash.json.h"
#include "main.h"
#include "random.h"
-#include "serialize.h"
-#include "script/script.h"
#include "script/interpreter.h"
+#include "script/script.h"
+#include "serialize.h"
+#include "test/test_bitcoin.h"
#include "util.h"
#include "version.h"
-#include "test/test_bitcoin.h"
#include <iostream>
#include <boost/test/unit_test.hpp>
-#include "json/json_spirit_reader_template.h"
-#include "json/json_spirit_utils.h"
-#include "json/json_spirit_writer_template.h"
-using namespace json_spirit;
-extern Array read_json(const std::string& jsondata);
+#include "univalue/univalue.h"
+
+extern UniValue read_json(const std::string& jsondata);
// Old script.cpp SignatureHash function
uint256 static SignatureHashOld(CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType)
@@ -167,12 +166,11 @@ BOOST_AUTO_TEST_CASE(sighash_test)
// Goal: check that SignatureHash generates correct hash
BOOST_AUTO_TEST_CASE(sighash_from_data)
{
- Array tests = read_json(std::string(json_tests::sighash, json_tests::sighash + sizeof(json_tests::sighash)));
+ UniValue tests = read_json(std::string(json_tests::sighash, json_tests::sighash + sizeof(json_tests::sighash)));
- BOOST_FOREACH(Value& tv, tests)
- {
- Array test = tv.get_array();
- std::string strTest = write_string(tv, false);
+ for (unsigned int idx = 0; idx < tests.size(); idx++) {
+ UniValue test = tests[idx];
+ std::string strTest = test.write();
if (test.size() < 1) // Allow for extra stuff (useful for comments)
{
BOOST_ERROR("Bad test: " << strTest);
diff --git a/src/test/test_bitcoin.cpp b/src/test/test_bitcoin.cpp
index a2cb78c989..c727303ea1 100644
--- a/src/test/test_bitcoin.cpp
+++ b/src/test/test_bitcoin.cpp
@@ -6,6 +6,7 @@
#include "test_bitcoin.h"
+#include "key.h"
#include "main.h"
#include "random.h"
#include "txdb.h"
@@ -20,7 +21,7 @@
#include <boost/test/unit_test.hpp>
#include <boost/thread.hpp>
-CClientUIInterface uiInterface;
+CClientUIInterface uiInterface; // Declared but not defined in ui_interface.h
CWallet* pwalletMain;
extern bool fPrintToConsole;
@@ -28,6 +29,7 @@ extern void noui_connect();
BasicTestingSetup::BasicTestingSetup()
{
+ ECC_Start();
SetupEnvironment();
fPrintToDebugLog = false; // don't want to write to debug.log file
fCheckBlockIndex = true;
@@ -35,6 +37,7 @@ BasicTestingSetup::BasicTestingSetup()
}
BasicTestingSetup::~BasicTestingSetup()
{
+ ECC_Stop();
}
TestingSetup::TestingSetup()
diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp
index 2a3083316e..9ce7aae966 100644
--- a/src/test/transaction_tests.cpp
+++ b/src/test/transaction_tests.cpp
@@ -7,27 +7,29 @@
#include "test/test_bitcoin.h"
#include "clientversion.h"
+#include "consensus/validation.h"
+#include "core_io.h"
#include "key.h"
#include "keystore.h"
#include "main.h"
#include "script/script.h"
#include "script/script_error.h"
-#include "core_io.h"
#include <map>
#include <string>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
+#include <boost/assign/list_of.hpp>
#include <boost/test/unit_test.hpp>
#include <boost/assign/list_of.hpp>
-#include "json/json_spirit_writer_template.h"
+
+#include "univalue/univalue.h"
using namespace std;
-using namespace json_spirit;
// In script_tests.cpp
-extern Array read_json(const std::string& jsondata);
+extern UniValue read_json(const std::string& jsondata);
static std::map<string, unsigned int> mapFlagNames = boost::assign::map_list_of
(string("NONE"), (unsigned int)SCRIPT_VERIFY_NONE)
@@ -39,7 +41,8 @@ static std::map<string, unsigned int> mapFlagNames = boost::assign::map_list_of
(string("MINIMALDATA"), (unsigned int)SCRIPT_VERIFY_MINIMALDATA)
(string("NULLDUMMY"), (unsigned int)SCRIPT_VERIFY_NULLDUMMY)
(string("DISCOURAGE_UPGRADABLE_NOPS"), (unsigned int)SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS)
- (string("CLEANSTACK"), (unsigned int)SCRIPT_VERIFY_CLEANSTACK);
+ (string("CLEANSTACK"), (unsigned int)SCRIPT_VERIFY_CLEANSTACK)
+ (string("CHECKLOCKTIMEVERIFY"), (unsigned int)SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY);
unsigned int ParseScriptFlags(string strFlags)
{
@@ -87,32 +90,31 @@ BOOST_AUTO_TEST_CASE(tx_valid)
// ... where all scripts are stringified scripts.
//
// verifyFlags is a comma separated list of script verification flags to apply, or "NONE"
- Array tests = read_json(std::string(json_tests::tx_valid, json_tests::tx_valid + sizeof(json_tests::tx_valid)));
+ UniValue tests = read_json(std::string(json_tests::tx_valid, json_tests::tx_valid + sizeof(json_tests::tx_valid)));
ScriptError err;
- BOOST_FOREACH(Value& tv, tests)
- {
- Array test = tv.get_array();
- string strTest = write_string(tv, false);
- if (test[0].type() == array_type)
+ for (unsigned int idx = 0; idx < tests.size(); idx++) {
+ UniValue test = tests[idx];
+ string strTest = test.write();
+ if (test[0].isArray())
{
- if (test.size() != 3 || test[1].type() != str_type || test[2].type() != str_type)
+ if (test.size() != 3 || !test[1].isStr() || !test[2].isStr())
{
BOOST_ERROR("Bad test: " << strTest);
continue;
}
map<COutPoint, CScript> mapprevOutScriptPubKeys;
- Array inputs = test[0].get_array();
+ UniValue inputs = test[0].get_array();
bool fValid = true;
- BOOST_FOREACH(Value& input, inputs)
- {
- if (input.type() != array_type)
+ for (unsigned int inpIdx = 0; inpIdx < inputs.size(); inpIdx++) {
+ const UniValue& input = inputs[inpIdx];
+ if (!input.isArray())
{
fValid = false;
break;
}
- Array vinput = input.get_array();
+ UniValue vinput = input.get_array();
if (vinput.size() != 3)
{
fValid = false;
@@ -163,32 +165,31 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
// ... where all scripts are stringified scripts.
//
// verifyFlags is a comma separated list of script verification flags to apply, or "NONE"
- Array tests = read_json(std::string(json_tests::tx_invalid, json_tests::tx_invalid + sizeof(json_tests::tx_invalid)));
+ UniValue tests = read_json(std::string(json_tests::tx_invalid, json_tests::tx_invalid + sizeof(json_tests::tx_invalid)));
ScriptError err;
- BOOST_FOREACH(Value& tv, tests)
- {
- Array test = tv.get_array();
- string strTest = write_string(tv, false);
- if (test[0].type() == array_type)
+ for (unsigned int idx = 0; idx < tests.size(); idx++) {
+ UniValue test = tests[idx];
+ string strTest = test.write();
+ if (test[0].isArray())
{
- if (test.size() != 3 || test[1].type() != str_type || test[2].type() != str_type)
+ if (test.size() != 3 || !test[1].isStr() || !test[2].isStr())
{
BOOST_ERROR("Bad test: " << strTest);
continue;
}
map<COutPoint, CScript> mapprevOutScriptPubKeys;
- Array inputs = test[0].get_array();
+ UniValue inputs = test[0].get_array();
bool fValid = true;
- BOOST_FOREACH(Value& input, inputs)
- {
- if (input.type() != array_type)
+ for (unsigned int inpIdx = 0; inpIdx < inputs.size(); inpIdx++) {
+ const UniValue& input = inputs[inpIdx];
+ if (!input.isArray())
{
fValid = false;
break;
}
- Array vinput = input.get_array();
+ UniValue vinput = input.get_array();
if (vinput.size() != 3)
{
fValid = false;
diff --git a/src/test/univalue_tests.cpp b/src/test/univalue_tests.cpp
index 8cecfbf651..16bc8d30f6 100644
--- a/src/test/univalue_tests.cpp
+++ b/src/test/univalue_tests.cpp
@@ -49,7 +49,7 @@ BOOST_AUTO_TEST_CASE(univalue_constructor)
double vd = -7.21;
UniValue v7(vd);
- BOOST_CHECK(v7.isNum());
+ BOOST_CHECK(v7.isReal());
BOOST_CHECK_EQUAL(v7.getValStr(), "-7.21");
string vs("yawn");
@@ -63,6 +63,48 @@ BOOST_AUTO_TEST_CASE(univalue_constructor)
BOOST_CHECK_EQUAL(v9.getValStr(), "zappa");
}
+BOOST_AUTO_TEST_CASE(univalue_typecheck)
+{
+ UniValue v1;
+ BOOST_CHECK(v1.setNumStr("1"));
+ BOOST_CHECK(v1.isNum());
+ BOOST_CHECK_THROW(v1.get_bool(), runtime_error);
+
+ UniValue v2;
+ BOOST_CHECK(v2.setBool(true));
+ BOOST_CHECK_EQUAL(v2.get_bool(), true);
+ BOOST_CHECK_THROW(v2.get_int(), runtime_error);
+
+ UniValue v3;
+ BOOST_CHECK(v3.setNumStr("32482348723847471234"));
+ BOOST_CHECK_THROW(v3.get_int64(), runtime_error);
+ BOOST_CHECK(v3.setNumStr("1000"));
+ BOOST_CHECK_EQUAL(v3.get_int64(), 1000);
+
+ UniValue v4;
+ BOOST_CHECK(v4.setNumStr("2147483648"));
+ BOOST_CHECK_EQUAL(v4.get_int64(), 2147483648);
+ BOOST_CHECK_THROW(v4.get_int(), runtime_error);
+ BOOST_CHECK(v4.setNumStr("1000"));
+ BOOST_CHECK_EQUAL(v4.get_int(), 1000);
+ BOOST_CHECK_THROW(v4.get_str(), runtime_error);
+ BOOST_CHECK_EQUAL(v4.get_real(), 1000);
+ BOOST_CHECK_THROW(v4.get_array(), runtime_error);
+ BOOST_CHECK_THROW(v4.getKeys(), runtime_error);
+ BOOST_CHECK_THROW(v4.getValues(), runtime_error);
+ BOOST_CHECK_THROW(v4.get_obj(), runtime_error);
+
+ UniValue v5;
+ BOOST_CHECK(v5.read("[true, 10]"));
+ BOOST_CHECK_NO_THROW(v5.get_array());
+ std::vector<UniValue> vals = v5.getValues();
+ BOOST_CHECK_THROW(vals[0].get_int(), runtime_error);
+ BOOST_CHECK_EQUAL(vals[0].get_bool(), true);
+
+ BOOST_CHECK_EQUAL(vals[1].get_int(), 10);
+ BOOST_CHECK_THROW(vals[1].get_bool(), runtime_error);
+}
+
BOOST_AUTO_TEST_CASE(univalue_set)
{
UniValue v(UniValue::VSTR, "foo");
@@ -72,20 +114,20 @@ BOOST_AUTO_TEST_CASE(univalue_set)
BOOST_CHECK(v.setObject());
BOOST_CHECK(v.isObject());
- BOOST_CHECK_EQUAL(v.count(), 0);
+ BOOST_CHECK_EQUAL(v.size(), 0);
BOOST_CHECK_EQUAL(v.getType(), UniValue::VOBJ);
BOOST_CHECK(v.empty());
BOOST_CHECK(v.setArray());
BOOST_CHECK(v.isArray());
- BOOST_CHECK_EQUAL(v.count(), 0);
+ BOOST_CHECK_EQUAL(v.size(), 0);
BOOST_CHECK(v.setStr("zum"));
BOOST_CHECK(v.isStr());
BOOST_CHECK_EQUAL(v.getValStr(), "zum");
BOOST_CHECK(v.setFloat(-1.01));
- BOOST_CHECK(v.isNum());
+ BOOST_CHECK(v.isReal());
BOOST_CHECK_EQUAL(v.getValStr(), "-1.01");
BOOST_CHECK(v.setInt((int)1023));
@@ -145,7 +187,7 @@ BOOST_AUTO_TEST_CASE(univalue_array)
BOOST_CHECK(arr.push_backV(vec));
BOOST_CHECK_EQUAL(arr.empty(), false);
- BOOST_CHECK_EQUAL(arr.count(), 5);
+ BOOST_CHECK_EQUAL(arr.size(), 5);
BOOST_CHECK_EQUAL(arr[0].getValStr(), "1023");
BOOST_CHECK_EQUAL(arr[1].getValStr(), "zippy");
@@ -157,7 +199,7 @@ BOOST_AUTO_TEST_CASE(univalue_array)
arr.clear();
BOOST_CHECK(arr.empty());
- BOOST_CHECK_EQUAL(arr.count(), 0);
+ BOOST_CHECK_EQUAL(arr.size(), 0);
}
BOOST_AUTO_TEST_CASE(univalue_object)
@@ -197,7 +239,7 @@ BOOST_AUTO_TEST_CASE(univalue_object)
BOOST_CHECK(obj.pushKVs(obj2));
BOOST_CHECK_EQUAL(obj.empty(), false);
- BOOST_CHECK_EQUAL(obj.count(), 9);
+ BOOST_CHECK_EQUAL(obj.size(), 9);
BOOST_CHECK_EQUAL(obj["age"].getValStr(), "100");
BOOST_CHECK_EQUAL(obj["first"].getValStr(), "John");
@@ -230,7 +272,7 @@ BOOST_AUTO_TEST_CASE(univalue_object)
objTypes["distance"] = UniValue::VNUM;
objTypes["time"] = UniValue::VNUM;
objTypes["calories"] = UniValue::VNUM;
- objTypes["temperature"] = UniValue::VNUM;
+ objTypes["temperature"] = UniValue::VREAL;
objTypes["cat1"] = UniValue::VNUM;
objTypes["cat2"] = UniValue::VNUM;
BOOST_CHECK(obj.checkObject(objTypes));
@@ -240,11 +282,11 @@ BOOST_AUTO_TEST_CASE(univalue_object)
obj.clear();
BOOST_CHECK(obj.empty());
- BOOST_CHECK_EQUAL(obj.count(), 0);
+ BOOST_CHECK_EQUAL(obj.size(), 0);
}
static const char *json1 =
-"[1.1,{\"key1\":\"str\",\"key2\":800,\"key3\":{\"name\":\"martian\"}}]";
+"[1.10000000,{\"key1\":\"str\\u0000\",\"key2\":800,\"key3\":{\"name\":\"martian http://test.com\"}}]";
BOOST_AUTO_TEST_CASE(univalue_readwrite)
{
@@ -255,16 +297,18 @@ BOOST_AUTO_TEST_CASE(univalue_readwrite)
BOOST_CHECK(v.read(strJson1));
BOOST_CHECK(v.isArray());
- BOOST_CHECK_EQUAL(v.count(), 2);
+ BOOST_CHECK_EQUAL(v.size(), 2);
- BOOST_CHECK_EQUAL(v[0].getValStr(), "1.1");
+ BOOST_CHECK_EQUAL(v[0].getValStr(), "1.10000000");
UniValue obj = v[1];
BOOST_CHECK(obj.isObject());
- BOOST_CHECK_EQUAL(obj.count(), 3);
+ BOOST_CHECK_EQUAL(obj.size(), 3);
BOOST_CHECK(obj["key1"].isStr());
- BOOST_CHECK_EQUAL(obj["key1"].getValStr(), "str");
+ std::string correctValue("str");
+ correctValue.push_back('\0');
+ BOOST_CHECK_EQUAL(obj["key1"].getValStr(), correctValue);
BOOST_CHECK(obj["key2"].isNum());
BOOST_CHECK_EQUAL(obj["key2"].getValStr(), "800");
BOOST_CHECK(obj["key3"].isObject());
diff --git a/src/test/util_tests.cpp b/src/test/util_tests.cpp
index 3309e2e387..5cb5894251 100644
--- a/src/test/util_tests.cpp
+++ b/src/test/util_tests.cpp
@@ -146,29 +146,27 @@ BOOST_AUTO_TEST_CASE(util_GetArg)
BOOST_AUTO_TEST_CASE(util_FormatMoney)
{
- BOOST_CHECK_EQUAL(FormatMoney(0, false), "0.00");
- BOOST_CHECK_EQUAL(FormatMoney((COIN/10000)*123456789, false), "12345.6789");
- BOOST_CHECK_EQUAL(FormatMoney(COIN, true), "+1.00");
- BOOST_CHECK_EQUAL(FormatMoney(-COIN, false), "-1.00");
- BOOST_CHECK_EQUAL(FormatMoney(-COIN, true), "-1.00");
-
- BOOST_CHECK_EQUAL(FormatMoney(COIN*100000000, false), "100000000.00");
- BOOST_CHECK_EQUAL(FormatMoney(COIN*10000000, false), "10000000.00");
- BOOST_CHECK_EQUAL(FormatMoney(COIN*1000000, false), "1000000.00");
- BOOST_CHECK_EQUAL(FormatMoney(COIN*100000, false), "100000.00");
- BOOST_CHECK_EQUAL(FormatMoney(COIN*10000, false), "10000.00");
- BOOST_CHECK_EQUAL(FormatMoney(COIN*1000, false), "1000.00");
- BOOST_CHECK_EQUAL(FormatMoney(COIN*100, false), "100.00");
- BOOST_CHECK_EQUAL(FormatMoney(COIN*10, false), "10.00");
- BOOST_CHECK_EQUAL(FormatMoney(COIN, false), "1.00");
- BOOST_CHECK_EQUAL(FormatMoney(COIN/10, false), "0.10");
- BOOST_CHECK_EQUAL(FormatMoney(COIN/100, false), "0.01");
- BOOST_CHECK_EQUAL(FormatMoney(COIN/1000, false), "0.001");
- BOOST_CHECK_EQUAL(FormatMoney(COIN/10000, false), "0.0001");
- BOOST_CHECK_EQUAL(FormatMoney(COIN/100000, false), "0.00001");
- BOOST_CHECK_EQUAL(FormatMoney(COIN/1000000, false), "0.000001");
- BOOST_CHECK_EQUAL(FormatMoney(COIN/10000000, false), "0.0000001");
- BOOST_CHECK_EQUAL(FormatMoney(COIN/100000000, false), "0.00000001");
+ BOOST_CHECK_EQUAL(FormatMoney(0), "0.00");
+ BOOST_CHECK_EQUAL(FormatMoney((COIN/10000)*123456789), "12345.6789");
+ BOOST_CHECK_EQUAL(FormatMoney(-COIN), "-1.00");
+
+ BOOST_CHECK_EQUAL(FormatMoney(COIN*100000000), "100000000.00");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN*10000000), "10000000.00");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN*1000000), "1000000.00");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN*100000), "100000.00");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN*10000), "10000.00");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN*1000), "1000.00");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN*100), "100.00");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN*10), "10.00");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN), "1.00");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN/10), "0.10");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN/100), "0.01");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN/1000), "0.001");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN/10000), "0.0001");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN/100000), "0.00001");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN/1000000), "0.000001");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN/10000000), "0.0000001");
+ BOOST_CHECK_EQUAL(FormatMoney(COIN/100000000), "0.00000001");
}
BOOST_AUTO_TEST_CASE(util_ParseMoney)
@@ -322,9 +320,16 @@ BOOST_AUTO_TEST_CASE(test_ParseInt32)
BOOST_CHECK(ParseInt32("-2147483648", &n) && n == -2147483648);
BOOST_CHECK(ParseInt32("-1234", &n) && n == -1234);
// Invalid values
+ BOOST_CHECK(!ParseInt32("", &n));
+ BOOST_CHECK(!ParseInt32(" 1", &n)); // no padding inside
+ BOOST_CHECK(!ParseInt32("1 ", &n));
BOOST_CHECK(!ParseInt32("1a", &n));
BOOST_CHECK(!ParseInt32("aap", &n));
BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex
+ BOOST_CHECK(!ParseInt32("0x1", &n)); // no hex
+ const char test_bytes[] = {'1', 0, '1'};
+ std::string teststr(test_bytes, sizeof(test_bytes));
+ BOOST_CHECK(!ParseInt32(teststr, &n)); // no embedded NULs
// Overflow and underflow
BOOST_CHECK(!ParseInt32("-2147483649", NULL));
BOOST_CHECK(!ParseInt32("2147483648", NULL));
@@ -332,6 +337,64 @@ BOOST_AUTO_TEST_CASE(test_ParseInt32)
BOOST_CHECK(!ParseInt32("32482348723847471234", NULL));
}
+BOOST_AUTO_TEST_CASE(test_ParseInt64)
+{
+ int64_t n;
+ // Valid values
+ BOOST_CHECK(ParseInt64("1234", NULL));
+ BOOST_CHECK(ParseInt64("0", &n) && n == 0LL);
+ BOOST_CHECK(ParseInt64("1234", &n) && n == 1234LL);
+ BOOST_CHECK(ParseInt64("01234", &n) && n == 1234LL); // no octal
+ BOOST_CHECK(ParseInt64("2147483647", &n) && n == 2147483647LL);
+ BOOST_CHECK(ParseInt64("-2147483648", &n) && n == -2147483648LL);
+ BOOST_CHECK(ParseInt64("9223372036854775807", &n) && n == (int64_t)9223372036854775807);
+ BOOST_CHECK(ParseInt64("-9223372036854775808", &n) && n == (int64_t)-9223372036854775807-1);
+ BOOST_CHECK(ParseInt64("-1234", &n) && n == -1234LL);
+ // Invalid values
+ BOOST_CHECK(!ParseInt64("", &n));
+ BOOST_CHECK(!ParseInt64(" 1", &n)); // no padding inside
+ BOOST_CHECK(!ParseInt64("1 ", &n));
+ BOOST_CHECK(!ParseInt64("1a", &n));
+ BOOST_CHECK(!ParseInt64("aap", &n));
+ BOOST_CHECK(!ParseInt64("0x1", &n)); // no hex
+ const char test_bytes[] = {'1', 0, '1'};
+ std::string teststr(test_bytes, sizeof(test_bytes));
+ BOOST_CHECK(!ParseInt64(teststr, &n)); // no embedded NULs
+ // Overflow and underflow
+ BOOST_CHECK(!ParseInt64("-9223372036854775809", NULL));
+ BOOST_CHECK(!ParseInt64("9223372036854775808", NULL));
+ BOOST_CHECK(!ParseInt64("-32482348723847471234", NULL));
+ BOOST_CHECK(!ParseInt64("32482348723847471234", NULL));
+}
+
+BOOST_AUTO_TEST_CASE(test_ParseDouble)
+{
+ double n;
+ // Valid values
+ BOOST_CHECK(ParseDouble("1234", NULL));
+ BOOST_CHECK(ParseDouble("0", &n) && n == 0.0);
+ BOOST_CHECK(ParseDouble("1234", &n) && n == 1234.0);
+ BOOST_CHECK(ParseDouble("01234", &n) && n == 1234.0); // no octal
+ BOOST_CHECK(ParseDouble("2147483647", &n) && n == 2147483647.0);
+ BOOST_CHECK(ParseDouble("-2147483648", &n) && n == -2147483648.0);
+ BOOST_CHECK(ParseDouble("-1234", &n) && n == -1234.0);
+ BOOST_CHECK(ParseDouble("1e6", &n) && n == 1e6);
+ BOOST_CHECK(ParseDouble("-1e6", &n) && n == -1e6);
+ // Invalid values
+ BOOST_CHECK(!ParseDouble("", &n));
+ BOOST_CHECK(!ParseDouble(" 1", &n)); // no padding inside
+ BOOST_CHECK(!ParseDouble("1 ", &n));
+ BOOST_CHECK(!ParseDouble("1a", &n));
+ BOOST_CHECK(!ParseDouble("aap", &n));
+ BOOST_CHECK(!ParseDouble("0x1", &n)); // no hex
+ const char test_bytes[] = {'1', 0, '1'};
+ std::string teststr(test_bytes, sizeof(test_bytes));
+ BOOST_CHECK(!ParseDouble(teststr, &n)); // no embedded NULs
+ // Overflow and underflow
+ BOOST_CHECK(!ParseDouble("-1e10000", NULL));
+ BOOST_CHECK(!ParseDouble("1e10000", NULL));
+}
+
BOOST_AUTO_TEST_CASE(test_FormatParagraph)
{
BOOST_CHECK_EQUAL(FormatParagraph("", 79, 0), "");
diff --git a/src/txdb.cpp b/src/txdb.cpp
index df9ff8d8c9..935b784676 100644
--- a/src/txdb.cpp
+++ b/src/txdb.cpp
@@ -147,7 +147,10 @@ bool CCoinsViewDB::GetStats(CCoinsStats &stats) const {
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
}
}
- stats.nHeight = mapBlockIndex.find(GetBestBlock())->second->nHeight;
+ {
+ LOCK(cs_main);
+ stats.nHeight = mapBlockIndex.find(stats.hashBlock)->second->nHeight;
+ }
stats.hashSerialized = ss.GetHash();
stats.nTotalAmount = nTotalAmount;
return true;
diff --git a/src/txdb.h b/src/txdb.h
index 86e1c5d831..bef5dc9fd1 100644
--- a/src/txdb.h
+++ b/src/txdb.h
@@ -22,7 +22,7 @@ class uint256;
//! -dbcache default (MiB)
static const int64_t nDefaultDbCache = 100;
//! max. -dbcache in (MiB)
-static const int64_t nMaxDbCache = sizeof(void*) > 4 ? 4096 : 1024;
+static const int64_t nMaxDbCache = sizeof(void*) > 4 ? 16384 : 1024;
//! min. -dbcache in (MiB)
static const int64_t nMinDbCache = 4;
diff --git a/src/txmempool.cpp b/src/txmempool.cpp
index 85ea3f77b5..2292191be4 100644
--- a/src/txmempool.cpp
+++ b/src/txmempool.cpp
@@ -6,29 +6,30 @@
#include "txmempool.h"
#include "clientversion.h"
+#include "consensus/consensus.h"
+#include "consensus/validation.h"
#include "main.h"
+#include "policy/fees.h"
#include "streams.h"
#include "util.h"
#include "utilmoneystr.h"
#include "version.h"
-#include <boost/circular_buffer.hpp>
-
using namespace std;
CTxMemPoolEntry::CTxMemPoolEntry():
- nFee(0), nTxSize(0), nModSize(0), nTime(0), dPriority(0.0)
+ nFee(0), nTxSize(0), nModSize(0), nTime(0), dPriority(0.0), hadNoDependencies(false)
{
nHeight = MEMPOOL_HEIGHT;
}
CTxMemPoolEntry::CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee,
int64_t _nTime, double _dPriority,
- unsigned int _nHeight):
- tx(_tx), nFee(_nFee), nTime(_nTime), dPriority(_dPriority), nHeight(_nHeight)
+ unsigned int _nHeight, bool poolHasNoInputsOf):
+ tx(_tx), nFee(_nFee), nTime(_nTime), dPriority(_dPriority), nHeight(_nHeight),
+ hadNoDependencies(poolHasNoInputsOf)
{
nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
-
nModSize = tx.CalculateModifiedSize(nTxSize);
}
@@ -46,346 +47,15 @@ CTxMemPoolEntry::GetPriority(unsigned int currentHeight) const
return dResult;
}
-/**
- * Keep track of fee/priority for transactions confirmed within N blocks
- */
-class CBlockAverage
-{
-private:
- boost::circular_buffer<CFeeRate> feeSamples;
- boost::circular_buffer<double> prioritySamples;
-
- template<typename T> std::vector<T> buf2vec(boost::circular_buffer<T> buf) const
- {
- std::vector<T> vec(buf.begin(), buf.end());
- return vec;
- }
-
-public:
- CBlockAverage() : feeSamples(100), prioritySamples(100) { }
-
- void RecordFee(const CFeeRate& feeRate) {
- feeSamples.push_back(feeRate);
- }
-
- void RecordPriority(double priority) {
- prioritySamples.push_back(priority);
- }
-
- size_t FeeSamples() const { return feeSamples.size(); }
- size_t GetFeeSamples(std::vector<CFeeRate>& insertInto) const
- {
- BOOST_FOREACH(const CFeeRate& f, feeSamples)
- insertInto.push_back(f);
- return feeSamples.size();
- }
- size_t PrioritySamples() const { return prioritySamples.size(); }
- size_t GetPrioritySamples(std::vector<double>& insertInto) const
- {
- BOOST_FOREACH(double d, prioritySamples)
- insertInto.push_back(d);
- return prioritySamples.size();
- }
-
- /**
- * Used as belt-and-suspenders check when reading to detect
- * file corruption
- */
- static bool AreSane(const CFeeRate fee, const CFeeRate& minRelayFee)
- {
- if (fee < CFeeRate(0))
- return false;
- if (fee.GetFeePerK() > minRelayFee.GetFeePerK() * 10000)
- return false;
- return true;
- }
- static bool AreSane(const std::vector<CFeeRate>& vecFee, const CFeeRate& minRelayFee)
- {
- BOOST_FOREACH(CFeeRate fee, vecFee)
- {
- if (!AreSane(fee, minRelayFee))
- return false;
- }
- return true;
- }
- static bool AreSane(const double priority)
- {
- return priority >= 0;
- }
- static bool AreSane(const std::vector<double> vecPriority)
- {
- BOOST_FOREACH(double priority, vecPriority)
- {
- if (!AreSane(priority))
- return false;
- }
- return true;
- }
-
- void Write(CAutoFile& fileout) const
- {
- std::vector<CFeeRate> vecFee = buf2vec(feeSamples);
- fileout << vecFee;
- std::vector<double> vecPriority = buf2vec(prioritySamples);
- fileout << vecPriority;
- }
-
- void Read(CAutoFile& filein, const CFeeRate& minRelayFee) {
- std::vector<CFeeRate> vecFee;
- filein >> vecFee;
- if (AreSane(vecFee, minRelayFee))
- feeSamples.insert(feeSamples.end(), vecFee.begin(), vecFee.end());
- else
- throw runtime_error("Corrupt fee value in estimates file.");
- std::vector<double> vecPriority;
- filein >> vecPriority;
- if (AreSane(vecPriority))
- prioritySamples.insert(prioritySamples.end(), vecPriority.begin(), vecPriority.end());
- else
- throw runtime_error("Corrupt priority value in estimates file.");
- if (feeSamples.size() + prioritySamples.size() > 0)
- LogPrint("estimatefee", "Read %d fee samples and %d priority samples\n",
- feeSamples.size(), prioritySamples.size());
- }
-};
-
-class CMinerPolicyEstimator
-{
-private:
- /**
- * Records observed averages transactions that confirmed within one block, two blocks,
- * three blocks etc.
- */
- std::vector<CBlockAverage> history;
- std::vector<CFeeRate> sortedFeeSamples;
- std::vector<double> sortedPrioritySamples;
-
- int nBestSeenHeight;
-
- /**
- * nBlocksAgo is 0 based, i.e. transactions that confirmed in the highest seen block are
- * nBlocksAgo == 0, transactions in the block before that are nBlocksAgo == 1 etc.
- */
- void seenTxConfirm(const CFeeRate& feeRate, const CFeeRate& minRelayFee, double dPriority, int nBlocksAgo)
- {
- // Last entry records "everything else".
- int nBlocksTruncated = min(nBlocksAgo, (int) history.size() - 1);
- assert(nBlocksTruncated >= 0);
-
- // We need to guess why the transaction was included in a block-- either
- // because it is high-priority or because it has sufficient fees.
- bool sufficientFee = (feeRate > minRelayFee);
- bool sufficientPriority = AllowFree(dPriority);
- const char* assignedTo = "unassigned";
- if (sufficientFee && !sufficientPriority && CBlockAverage::AreSane(feeRate, minRelayFee))
- {
- history[nBlocksTruncated].RecordFee(feeRate);
- assignedTo = "fee";
- }
- else if (sufficientPriority && !sufficientFee && CBlockAverage::AreSane(dPriority))
- {
- history[nBlocksTruncated].RecordPriority(dPriority);
- assignedTo = "priority";
- }
- else
- {
- // Neither or both fee and priority sufficient to get confirmed:
- // don't know why they got confirmed.
- }
- LogPrint("estimatefee", "Seen TX confirm: %s: %s fee/%g priority, took %d blocks\n",
- assignedTo, feeRate.ToString(), dPriority, nBlocksAgo);
- }
-
-public:
- CMinerPolicyEstimator(int nEntries) : nBestSeenHeight(0)
- {
- history.resize(nEntries);
- }
-
- void seenBlock(const std::vector<CTxMemPoolEntry>& entries, int nBlockHeight, const CFeeRate minRelayFee)
- {
- if (nBlockHeight <= nBestSeenHeight)
- {
- // Ignore side chains and re-orgs; assuming they are random
- // they don't affect the estimate.
- // And if an attacker can re-org the chain at will, then
- // you've got much bigger problems than "attacker can influence
- // transaction fees."
- return;
- }
- nBestSeenHeight = nBlockHeight;
-
- // Fill up the history buckets based on how long transactions took
- // to confirm.
- std::vector<std::vector<const CTxMemPoolEntry*> > entriesByConfirmations;
- entriesByConfirmations.resize(history.size());
- BOOST_FOREACH(const CTxMemPoolEntry& entry, entries)
- {
- // How many blocks did it take for miners to include this transaction?
- int delta = nBlockHeight - entry.GetHeight();
- if (delta <= 0)
- {
- // Re-org made us lose height, this should only happen if we happen
- // to re-org on a difficulty transition point: very rare!
- continue;
- }
- if ((delta-1) >= (int)history.size())
- delta = history.size(); // Last bucket is catch-all
- entriesByConfirmations.at(delta-1).push_back(&entry);
- }
- for (size_t i = 0; i < entriesByConfirmations.size(); i++)
- {
- std::vector<const CTxMemPoolEntry*> &e = entriesByConfirmations.at(i);
- // Insert at most 10 random entries per bucket, otherwise a single block
- // can dominate an estimate:
- if (e.size() > 10) {
- std::random_shuffle(e.begin(), e.end());
- e.resize(10);
- }
- BOOST_FOREACH(const CTxMemPoolEntry* entry, e)
- {
- // Fees are stored and reported as BTC-per-kb:
- CFeeRate feeRate(entry->GetFee(), entry->GetTxSize());
- double dPriority = entry->GetPriority(entry->GetHeight()); // Want priority when it went IN
- seenTxConfirm(feeRate, minRelayFee, dPriority, i);
- }
- }
-
- // After new samples are added, we have to clear the sorted lists,
- // so they'll be resorted the next time someone asks for an estimate
- sortedFeeSamples.clear();
- sortedPrioritySamples.clear();
-
- for (size_t i = 0; i < history.size(); i++) {
- if (history[i].FeeSamples() + history[i].PrioritySamples() > 0)
- LogPrint("estimatefee", "estimates: for confirming within %d blocks based on %d/%d samples, fee=%s, prio=%g\n",
- i,
- history[i].FeeSamples(), history[i].PrioritySamples(),
- estimateFee(i+1).ToString(), estimatePriority(i+1));
- }
- }
-
- /**
- * Can return CFeeRate(0) if we don't have any data for that many blocks back. nBlocksToConfirm is 1 based.
- */
- CFeeRate estimateFee(int nBlocksToConfirm)
- {
- nBlocksToConfirm--;
-
- if (nBlocksToConfirm < 0 || nBlocksToConfirm >= (int)history.size())
- return CFeeRate(0);
-
- if (sortedFeeSamples.size() == 0)
- {
- for (size_t i = 0; i < history.size(); i++)
- history.at(i).GetFeeSamples(sortedFeeSamples);
- std::sort(sortedFeeSamples.begin(), sortedFeeSamples.end(),
- std::greater<CFeeRate>());
- }
- if (sortedFeeSamples.size() < 11)
- {
- // Eleven is Gavin's Favorite Number
- // ... but we also take a maximum of 10 samples per block so eleven means
- // we're getting samples from at least two different blocks
- return CFeeRate(0);
- }
-
- int nBucketSize = history.at(nBlocksToConfirm).FeeSamples();
-
- // Estimates should not increase as number of confirmations goes up,
- // but the estimates are noisy because confirmations happen discretely
- // in blocks. To smooth out the estimates, use all samples in the history
- // and use the nth highest where n is (number of samples in previous bucket +
- // half the samples in nBlocksToConfirm bucket):
- size_t nPrevSize = 0;
- for (int i = 0; i < nBlocksToConfirm; i++)
- nPrevSize += history.at(i).FeeSamples();
- size_t index = min(nPrevSize + nBucketSize/2, sortedFeeSamples.size()-1);
- return sortedFeeSamples[index];
- }
- double estimatePriority(int nBlocksToConfirm)
- {
- nBlocksToConfirm--;
-
- if (nBlocksToConfirm < 0 || nBlocksToConfirm >= (int)history.size())
- return -1;
-
- if (sortedPrioritySamples.size() == 0)
- {
- for (size_t i = 0; i < history.size(); i++)
- history.at(i).GetPrioritySamples(sortedPrioritySamples);
- std::sort(sortedPrioritySamples.begin(), sortedPrioritySamples.end(),
- std::greater<double>());
- }
- if (sortedPrioritySamples.size() < 11)
- return -1.0;
-
- int nBucketSize = history.at(nBlocksToConfirm).PrioritySamples();
-
- // Estimates should not increase as number of confirmations needed goes up,
- // but the estimates are noisy because confirmations happen discretely
- // in blocks. To smooth out the estimates, use all samples in the history
- // and use the nth highest where n is (number of samples in previous buckets +
- // half the samples in nBlocksToConfirm bucket).
- size_t nPrevSize = 0;
- for (int i = 0; i < nBlocksToConfirm; i++)
- nPrevSize += history.at(i).PrioritySamples();
- size_t index = min(nPrevSize + nBucketSize/2, sortedPrioritySamples.size()-1);
- return sortedPrioritySamples[index];
- }
-
- void Write(CAutoFile& fileout) const
- {
- fileout << nBestSeenHeight;
- fileout << (uint32_t)history.size();
- BOOST_FOREACH(const CBlockAverage& entry, history)
- {
- entry.Write(fileout);
- }
- }
-
- void Read(CAutoFile& filein, const CFeeRate& minRelayFee)
- {
- int nFileBestSeenHeight;
- filein >> nFileBestSeenHeight;
- uint32_t numEntries;
- filein >> numEntries;
- if (numEntries <= 0 || numEntries > 10000)
- throw runtime_error("Corrupt estimates file. Must have between 1 and 10k entries.");
-
- std::vector<CBlockAverage> fileHistory;
-
- for (size_t i = 0; i < numEntries; i++)
- {
- CBlockAverage entry;
- entry.Read(filein, minRelayFee);
- fileHistory.push_back(entry);
- }
-
- // Now that we've processed the entire fee estimate data file and not
- // thrown any errors, we can copy it to our history
- nBestSeenHeight = nFileBestSeenHeight;
- history = fileHistory;
- assert(history.size() > 0);
- }
-};
-
-
CTxMemPool::CTxMemPool(const CFeeRate& _minRelayFee) :
- nTransactionsUpdated(0),
- minRelayFee(_minRelayFee)
+ nTransactionsUpdated(0)
{
// Sanity checks off by default for performance, because otherwise
// accepting transactions becomes O(N^2) where N is the number
// of transactions in the pool
fSanityCheck = false;
- // 25 blocks is a compromise between using a lot of disk/memory and
- // trying to give accurate estimates to people who might be willing
- // to wait a day or two to save a fraction of a penny in fees.
- // Confirmation times for very-low-fee transactions that take more
- // than an hour or three to confirm are highly variable.
- minerPolicyEstimator = new CMinerPolicyEstimator(25);
+ minerPolicyEstimator = new CBlockPolicyEstimator(_minRelayFee);
}
CTxMemPool::~CTxMemPool()
@@ -419,20 +89,20 @@ void CTxMemPool::AddTransactionsUpdated(unsigned int n)
}
-bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry)
+bool CTxMemPool::addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, bool fCurrentEstimate)
{
// Add to memory pool without checking anything.
// Used by main.cpp AcceptToMemoryPool(), which DOES do
// all the appropriate checks.
LOCK(cs);
- {
- mapTx[hash] = entry;
- const CTransaction& tx = mapTx[hash].GetTx();
- for (unsigned int i = 0; i < tx.vin.size(); i++)
- mapNextTx[tx.vin[i].prevout] = CInPoint(&tx, i);
- nTransactionsUpdated++;
- totalTxSize += entry.GetTxSize();
- }
+ mapTx[hash] = entry;
+ const CTransaction& tx = mapTx[hash].GetTx();
+ for (unsigned int i = 0; i < tx.vin.size(); i++)
+ mapNextTx[tx.vin[i].prevout] = CInPoint(&tx, i);
+ nTransactionsUpdated++;
+ totalTxSize += entry.GetTxSize();
+ minerPolicyEstimator->processTransaction(entry, fCurrentEstimate);
+
return true;
}
@@ -478,6 +148,7 @@ void CTxMemPool::remove(const CTransaction &origTx, std::list<CTransaction>& rem
totalTxSize -= mapTx[hash].GetTxSize();
mapTx.erase(hash);
nTransactionsUpdated++;
+ minerPolicyEstimator->removeTx(hash);
}
}
}
@@ -495,7 +166,7 @@ void CTxMemPool::removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned in
continue;
const CCoins *coins = pcoins->AccessCoins(txin.prevout.hash);
if (fSanityCheck) assert(coins);
- if (!coins || (coins->IsCoinBase() && nMemPoolHeight - coins->nHeight < COINBASE_MATURITY)) {
+ if (!coins || (coins->IsCoinBase() && ((signed long)nMemPoolHeight) - coins->nHeight < COINBASE_MATURITY)) {
transactionsToRemove.push_back(tx);
break;
}
@@ -528,7 +199,7 @@ void CTxMemPool::removeConflicts(const CTransaction &tx, std::list<CTransaction>
* Called when a block is connected. Removes from mempool and updates the miner fee estimator.
*/
void CTxMemPool::removeForBlock(const std::vector<CTransaction>& vtx, unsigned int nBlockHeight,
- std::list<CTransaction>& conflicts)
+ std::list<CTransaction>& conflicts, bool fCurrentEstimate)
{
LOCK(cs);
std::vector<CTxMemPoolEntry> entries;
@@ -538,7 +209,6 @@ void CTxMemPool::removeForBlock(const std::vector<CTransaction>& vtx, unsigned i
if (mapTx.count(hash))
entries.push_back(mapTx[hash]);
}
- minerPolicyEstimator->seenBlock(entries, nBlockHeight, minRelayFee);
BOOST_FOREACH(const CTransaction& tx, vtx)
{
std::list<CTransaction> dummy;
@@ -546,9 +216,10 @@ void CTxMemPool::removeForBlock(const std::vector<CTransaction>& vtx, unsigned i
removeConflicts(tx, conflicts);
ClearPrioritisation(tx.GetHash());
}
+ // After the txs in the new block have been removed from the mempool, update policy estimates
+ minerPolicyEstimator->processBlock(nBlockHeight, entries, fCurrentEstimate);
}
-
void CTxMemPool::clear()
{
LOCK(cs);
@@ -665,7 +336,7 @@ CTxMemPool::WriteFeeEstimates(CAutoFile& fileout) const
{
try {
LOCK(cs);
- fileout << 99900; // version required to read: 0.9.99 or later
+ fileout << 109900; // version required to read: 0.10.99 or later
fileout << CLIENT_VERSION; // version that wrote the file
minerPolicyEstimator->Write(fileout);
}
@@ -686,7 +357,7 @@ CTxMemPool::ReadFeeEstimates(CAutoFile& filein)
return error("CTxMemPool::ReadFeeEstimates(): up-version (%d) fee estimate file", nVersionRequired);
LOCK(cs);
- minerPolicyEstimator->Read(filein, minRelayFee);
+ minerPolicyEstimator->Read(filein);
}
catch (const std::exception&) {
LogPrintf("CTxMemPool::ReadFeeEstimates(): unable to read policy estimator data (non-fatal)");
@@ -723,6 +394,13 @@ void CTxMemPool::ClearPrioritisation(const uint256 hash)
mapDeltas.erase(hash);
}
+bool CTxMemPool::HasNoInputsOf(const CTransaction &tx) const
+{
+ for (unsigned int i = 0; i < tx.vin.size(); i++)
+ if (exists(tx.vin[i].prevout.hash))
+ return false;
+ return true;
+}
CCoinsViewMemPool::CCoinsViewMemPool(CCoinsView *baseIn, CTxMemPool &mempoolIn) : CCoinsViewBacked(baseIn), mempool(mempoolIn) { }
diff --git a/src/txmempool.h b/src/txmempool.h
index 0732af67e6..7271a5f603 100644
--- a/src/txmempool.h
+++ b/src/txmempool.h
@@ -43,10 +43,11 @@ private:
int64_t nTime; //! Local time when entering the mempool
double dPriority; //! Priority when entering the mempool
unsigned int nHeight; //! Chain height when entering the mempool
+ bool hadNoDependencies; //! Not dependent on any other txs when it entered the mempool
public:
CTxMemPoolEntry(const CTransaction& _tx, const CAmount& _nFee,
- int64_t _nTime, double _dPriority, unsigned int _nHeight);
+ int64_t _nTime, double _dPriority, unsigned int _nHeight, bool poolHasNoInputsOf = false);
CTxMemPoolEntry();
CTxMemPoolEntry(const CTxMemPoolEntry& other);
@@ -56,9 +57,10 @@ public:
size_t GetTxSize() const { return nTxSize; }
int64_t GetTime() const { return nTime; }
unsigned int GetHeight() const { return nHeight; }
+ bool WasClearAtEntry() const { return hadNoDependencies; }
};
-class CMinerPolicyEstimator;
+class CBlockPolicyEstimator;
/** An inpoint - a combination of a transaction and an index n into its vin */
class CInPoint
@@ -88,9 +90,8 @@ class CTxMemPool
private:
bool fSanityCheck; //! Normally false, true if -checkmempool or -regtest
unsigned int nTransactionsUpdated;
- CMinerPolicyEstimator* minerPolicyEstimator;
+ CBlockPolicyEstimator* minerPolicyEstimator;
- CFeeRate minRelayFee; //! Passed to constructor to avoid dependency on main
uint64_t totalTxSize; //! sum of all mempool tx' byte sizes
public:
@@ -111,17 +112,22 @@ public:
void check(const CCoinsViewCache *pcoins) const;
void setSanityCheck(bool _fSanityCheck) { fSanityCheck = _fSanityCheck; }
- bool addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry);
+ bool addUnchecked(const uint256& hash, const CTxMemPoolEntry &entry, bool fCurrentEstimate = true);
void remove(const CTransaction &tx, std::list<CTransaction>& removed, bool fRecursive = false);
void removeCoinbaseSpends(const CCoinsViewCache *pcoins, unsigned int nMemPoolHeight);
void removeConflicts(const CTransaction &tx, std::list<CTransaction>& removed);
void removeForBlock(const std::vector<CTransaction>& vtx, unsigned int nBlockHeight,
- std::list<CTransaction>& conflicts);
+ std::list<CTransaction>& conflicts, bool fCurrentEstimate = true);
void clear();
void queryHashes(std::vector<uint256>& vtxid);
void pruneSpent(const uint256& hash, CCoins &coins);
unsigned int GetTransactionsUpdated() const;
void AddTransactionsUpdated(unsigned int n);
+ /**
+ * Check that none of this transactions inputs are in the mempool, and thus
+ * the tx is not dependent on other mempool transactions to be included in a block.
+ */
+ bool HasNoInputsOf(const CTransaction& tx) const;
/** Affect CreateNewBlock prioritisation of transactions */
void PrioritiseTransaction(const uint256 hash, const std::string strHash, double dPriorityDelta, const CAmount& nFeeDelta);
@@ -139,7 +145,7 @@ public:
return totalTxSize;
}
- bool exists(uint256 hash)
+ bool exists(uint256 hash) const
{
LOCK(cs);
return (mapTx.count(hash) != 0);
diff --git a/src/ui_interface.h b/src/ui_interface.h
index 3f11a1ddab..32a92a4b81 100644
--- a/src/ui_interface.h
+++ b/src/ui_interface.h
@@ -78,9 +78,6 @@ public:
/** Progress message during initialization. */
boost::signals2::signal<void (const std::string &message)> InitMessage;
- /** Translate a message to the native language of the user. */
- boost::signals2::signal<std::string (const char* psz)> Translate;
-
/** Number of network connections changed. */
boost::signals2::signal<void (int newNumConnections)> NotifyNumConnectionsChanged;
@@ -102,14 +99,4 @@ public:
extern CClientUIInterface uiInterface;
-/**
- * Translation function: Call Translate signal on UI interface, which returns a boost::optional result.
- * If no translation slot is registered, nothing is returned, and simply return the input.
- */
-inline std::string _(const char* psz)
-{
- boost::optional<std::string> rv = uiInterface.Translate(psz);
- return rv ? (*rv) : psz;
-}
-
#endif // BITCOIN_UI_INTERFACE_H
diff --git a/src/univalue/gen.cpp b/src/univalue/gen.cpp
index abebe88634..5e5a4d4aed 100644
--- a/src/univalue/gen.cpp
+++ b/src/univalue/gen.cpp
@@ -22,7 +22,6 @@ static void initJsonEscape()
{
escapes[(int)'"'] = "\\\"";
escapes[(int)'\\'] = "\\\\";
- escapes[(int)'/'] = "\\/";
escapes[(int)'\b'] = "\\b";
escapes[(int)'\f'] = "\\f";
escapes[(int)'\n'] = "\\n";
diff --git a/src/univalue/univalue.cpp b/src/univalue/univalue.cpp
index 4e445a542a..6920c44c96 100644
--- a/src/univalue/univalue.cpp
+++ b/src/univalue/univalue.cpp
@@ -4,12 +4,17 @@
#include <stdint.h>
#include <ctype.h>
+#include <iomanip>
#include <sstream>
+#include <stdexcept> // std::runtime_error
+
#include "univalue.h"
+#include "utilstrencodings.h" // ParseXX
+
using namespace std;
-static const UniValue nullValue;
+const UniValue NullUniValue;
void UniValue::clear()
{
@@ -78,9 +83,11 @@ bool UniValue::setFloat(double val)
string s;
ostringstream oss;
- oss << val;
+ oss << std::setprecision(16) << val;
- return setNumStr(oss.str());
+ bool ret = setNumStr(oss.str());
+ typ = VREAL;
+ return ret;
}
bool UniValue::setStr(const string& val_)
@@ -175,11 +182,11 @@ bool UniValue::checkObject(const std::map<std::string,UniValue::VType>& t)
const UniValue& UniValue::operator[](const std::string& key) const
{
if (typ != VOBJ)
- return nullValue;
+ return NullUniValue;
int index = findKey(key);
if (index < 0)
- return nullValue;
+ return NullUniValue;
return values[index];
}
@@ -187,9 +194,9 @@ const UniValue& UniValue::operator[](const std::string& key) const
const UniValue& UniValue::operator[](unsigned int index) const
{
if (typ != VOBJ && typ != VARR)
- return nullValue;
+ return NullUniValue;
if (index >= values.size())
- return nullValue;
+ return NullUniValue;
return values[index];
}
@@ -203,9 +210,95 @@ const char *uvTypeName(UniValue::VType t)
case UniValue::VARR: return "array";
case UniValue::VSTR: return "string";
case UniValue::VNUM: return "number";
+ case UniValue::VREAL: return "number";
}
// not reached
return NULL;
}
+const UniValue& find_value( const UniValue& obj, const std::string& name)
+{
+ for (unsigned int i = 0; i < obj.keys.size(); i++)
+ {
+ if( obj.keys[i] == name )
+ {
+ return obj.values[i];
+ }
+ }
+
+ return NullUniValue;
+}
+
+std::vector<std::string> UniValue::getKeys() const
+{
+ if (typ != VOBJ)
+ throw std::runtime_error("JSON value is not an object as expected");
+ return keys;
+}
+
+std::vector<UniValue> UniValue::getValues() const
+{
+ if (typ != VOBJ && typ != VARR)
+ throw std::runtime_error("JSON value is not an object or array as expected");
+ return values;
+}
+
+bool UniValue::get_bool() const
+{
+ if (typ != VBOOL)
+ throw std::runtime_error("JSON value is not a boolean as expected");
+ return getBool();
+}
+
+std::string UniValue::get_str() const
+{
+ if (typ != VSTR)
+ throw std::runtime_error("JSON value is not a string as expected");
+ return getValStr();
+}
+
+int UniValue::get_int() const
+{
+ if (typ != VNUM)
+ throw std::runtime_error("JSON value is not an integer as expected");
+ int32_t retval;
+ if (!ParseInt32(getValStr(), &retval))
+ throw std::runtime_error("JSON integer out of range");
+ return retval;
+}
+
+int64_t UniValue::get_int64() const
+{
+ if (typ != VNUM)
+ throw std::runtime_error("JSON value is not an integer as expected");
+ int64_t retval;
+ if (!ParseInt64(getValStr(), &retval))
+ throw std::runtime_error("JSON integer out of range");
+ return retval;
+}
+
+double UniValue::get_real() const
+{
+ if (typ != VREAL && typ != VNUM)
+ throw std::runtime_error("JSON value is not a number as expected");
+ double retval;
+ if (!ParseDouble(getValStr(), &retval))
+ throw std::runtime_error("JSON double out of range");
+ return retval;
+}
+
+const UniValue& UniValue::get_obj() const
+{
+ if (typ != VOBJ)
+ throw std::runtime_error("JSON value is not an object as expected");
+ return *this;
+}
+
+const UniValue& UniValue::get_array() const
+{
+ if (typ != VARR)
+ throw std::runtime_error("JSON value is not an array as expected");
+ return *this;
+}
+
diff --git a/src/univalue/univalue.h b/src/univalue/univalue.h
index 88d73b8c64..54239741e2 100644
--- a/src/univalue/univalue.h
+++ b/src/univalue/univalue.h
@@ -11,9 +11,12 @@
#include <map>
#include <cassert>
+#include <sstream> // .get_int64()
+#include <utility> // std::pair
+
class UniValue {
public:
- enum VType { VNULL, VOBJ, VARR, VSTR, VNUM, VBOOL, };
+ enum VType { VNULL, VOBJ, VARR, VSTR, VNUM, VREAL, VBOOL, };
UniValue() { typ = VNULL; }
UniValue(UniValue::VType initialType, const std::string& initialStr = "") {
@@ -26,6 +29,9 @@ public:
UniValue(int64_t val_) {
setInt(val_);
}
+ UniValue(bool val_) {
+ setBool(val_);
+ }
UniValue(int val_) {
setInt(val_);
}
@@ -55,10 +61,10 @@ public:
bool setObject();
enum VType getType() const { return typ; }
- std::string getValStr() const { return val; }
+ const std::string& getValStr() const { return val; }
bool empty() const { return (values.size() == 0); }
- size_t count() const { return values.size(); }
+ size_t size() const { return values.size(); }
bool getBool() const { return isTrue(); }
bool checkObject(const std::map<std::string,UniValue::VType>& memberTypes);
@@ -68,10 +74,11 @@ public:
bool isNull() const { return (typ == VNULL); }
bool isTrue() const { return (typ == VBOOL) && (val == "1"); }
- bool isFalse() const { return (!isTrue()); }
+ bool isFalse() const { return (typ == VBOOL) && (val != "1"); }
bool isBool() const { return (typ == VBOOL); }
bool isStr() const { return (typ == VSTR); }
bool isNum() const { return (typ == VNUM); }
+ bool isReal() const { return (typ == VREAL); }
bool isArray() const { return (typ == VARR); }
bool isObject() const { return (typ == VOBJ); }
@@ -130,8 +137,91 @@ private:
int findKey(const std::string& key) const;
void writeArray(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const;
void writeObject(unsigned int prettyIndent, unsigned int indentLevel, std::string& s) const;
+
+public:
+ // Strict type-specific getters, these throw std::runtime_error if the
+ // value is of unexpected type
+ std::vector<std::string> getKeys() const;
+ std::vector<UniValue> getValues() const;
+ bool get_bool() const;
+ std::string get_str() const;
+ int get_int() const;
+ int64_t get_int64() const;
+ double get_real() const;
+ const UniValue& get_obj() const;
+ const UniValue& get_array() const;
+
+ enum VType type() const { return getType(); }
+ bool push_back(std::pair<std::string,UniValue> pear) {
+ return pushKV(pear.first, pear.second);
+ }
+ friend const UniValue& find_value( const UniValue& obj, const std::string& name);
};
+//
+// The following were added for compatibility with json_spirit.
+// Most duplicate other methods, and should be removed.
+//
+static inline std::pair<std::string,UniValue> Pair(const char *cKey, const char *cVal)
+{
+ std::string key(cKey);
+ UniValue uVal(cVal);
+ return std::make_pair(key, uVal);
+}
+
+static inline std::pair<std::string,UniValue> Pair(const char *cKey, std::string strVal)
+{
+ std::string key(cKey);
+ UniValue uVal(strVal);
+ return std::make_pair(key, uVal);
+}
+
+static inline std::pair<std::string,UniValue> Pair(const char *cKey, uint64_t u64Val)
+{
+ std::string key(cKey);
+ UniValue uVal(u64Val);
+ return std::make_pair(key, uVal);
+}
+
+static inline std::pair<std::string,UniValue> Pair(const char *cKey, int64_t i64Val)
+{
+ std::string key(cKey);
+ UniValue uVal(i64Val);
+ return std::make_pair(key, uVal);
+}
+
+static inline std::pair<std::string,UniValue> Pair(const char *cKey, bool iVal)
+{
+ std::string key(cKey);
+ UniValue uVal(iVal);
+ return std::make_pair(key, uVal);
+}
+
+static inline std::pair<std::string,UniValue> Pair(const char *cKey, int iVal)
+{
+ std::string key(cKey);
+ UniValue uVal(iVal);
+ return std::make_pair(key, uVal);
+}
+
+static inline std::pair<std::string,UniValue> Pair(const char *cKey, double dVal)
+{
+ std::string key(cKey);
+ UniValue uVal(dVal);
+ return std::make_pair(key, uVal);
+}
+
+static inline std::pair<std::string,UniValue> Pair(const char *cKey, const UniValue& uVal)
+{
+ std::string key(cKey);
+ return std::make_pair(key, uVal);
+}
+
+static inline std::pair<std::string,UniValue> Pair(std::string key, const UniValue& uVal)
+{
+ return std::make_pair(key, uVal);
+}
+
enum jtokentype {
JTOK_ERR = -1,
JTOK_NONE = 0, // eof
@@ -152,4 +242,8 @@ extern enum jtokentype getJsonToken(std::string& tokenVal,
unsigned int& consumed, const char *raw);
extern const char *uvTypeName(UniValue::VType t);
+extern const UniValue NullUniValue;
+
+const UniValue& find_value( const UniValue& obj, const std::string& name);
+
#endif // BITCOIN_UNIVALUE_UNIVALUE_H
diff --git a/src/univalue/univalue_escapes.h b/src/univalue/univalue_escapes.h
index 0514118285..4133b24ca1 100644
--- a/src/univalue/univalue_escapes.h
+++ b/src/univalue/univalue_escapes.h
@@ -49,7 +49,7 @@ static const char *escapes[256] = {
NULL,
NULL,
NULL,
- "\\/",
+ NULL,
NULL,
NULL,
NULL,
diff --git a/src/univalue/univalue_read.cpp b/src/univalue/univalue_read.cpp
index 5cea778996..261771811d 100644
--- a/src/univalue/univalue_read.cpp
+++ b/src/univalue/univalue_read.cpp
@@ -188,25 +188,22 @@ enum jtokentype getJsonToken(string& tokenVal, unsigned int& consumed,
case 't': valStr += "\t"; break;
case 'u': {
- char buf[4] = {0,0,0,0};
- char *last = &buf[0];
unsigned int codepoint;
if (hatoui(raw + 1, raw + 1 + 4, codepoint) !=
raw + 1 + 4)
return JTOK_ERR;
if (codepoint <= 0x7f)
- *last = (char)codepoint;
+ valStr.push_back((char)codepoint);
else if (codepoint <= 0x7FF) {
- *last++ = (char)(0xC0 | (codepoint >> 6));
- *last = (char)(0x80 | (codepoint & 0x3F));
+ valStr.push_back((char)(0xC0 | (codepoint >> 6)));
+ valStr.push_back((char)(0x80 | (codepoint & 0x3F)));
} else if (codepoint <= 0xFFFF) {
- *last++ = (char)(0xE0 | (codepoint >> 12));
- *last++ = (char)(0x80 | ((codepoint >> 6) & 0x3F));
- *last = (char)(0x80 | (codepoint & 0x3F));
+ valStr.push_back((char)(0xE0 | (codepoint >> 12)));
+ valStr.push_back((char)(0x80 | ((codepoint >> 6) & 0x3F)));
+ valStr.push_back((char)(0x80 | (codepoint & 0x3F)));
}
- valStr += buf;
raw += 4;
break;
}
diff --git a/src/univalue/univalue_write.cpp b/src/univalue/univalue_write.cpp
index 9a1d364c95..d360c253b0 100644
--- a/src/univalue/univalue_write.cpp
+++ b/src/univalue/univalue_write.cpp
@@ -3,6 +3,8 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <ctype.h>
+#include <iomanip>
+#include <sstream>
#include <stdio.h>
#include "univalue.h"
#include "univalue_escapes.h"
@@ -59,6 +61,13 @@ string UniValue::write(unsigned int prettyIndent,
case VSTR:
s += "\"" + json_escape(val) + "\"";
break;
+ case VREAL:
+ {
+ std::stringstream ss;
+ ss << std::showpoint << std::fixed << std::setprecision(8) << get_real();
+ s += ss.str();
+ }
+ break;
case VNUM:
s += val;
break;
diff --git a/src/util.cpp b/src/util.cpp
index 5fef3a40dd..da5821e530 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -18,6 +18,11 @@
#include <stdarg.h>
+#if (defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__))
+#include <pthread.h>
+#include <pthread_np.h>
+#endif
+
#ifndef WIN32
// for posix_fallocate
#ifdef __linux__
@@ -104,6 +109,7 @@ string strMiscWarning;
bool fLogTimestamps = false;
bool fLogIPs = false;
volatile bool fReopenDebugLog = false;
+CTranslationInterface translationInterface;
/** Init OpenSSL library multithreading support */
static CCriticalSection** ppmutexOpenSSL;
@@ -202,6 +208,7 @@ bool LogAcceptCategory(const char* category)
// if not debugging everything and not debugging specific category, LogPrint does nothing.
if (setCategories.count(string("")) == 0 &&
+ setCategories.count(string("1")) == 0 &&
setCategories.count(string(category)) == 0)
return false;
}
@@ -695,7 +702,7 @@ boost::filesystem::path GetTempPath() {
#endif
}
-void runCommand(std::string strCommand)
+void runCommand(const std::string& strCommand)
{
int nErr = ::system(strCommand.c_str());
if (nErr)
@@ -707,10 +714,7 @@ void RenameThread(const char* name)
#if defined(PR_SET_NAME)
// Only the first 15 characters are used (16 - NUL terminator)
::prctl(PR_SET_NAME, name, 0, 0, 0);
-#elif 0 && (defined(__FreeBSD__) || defined(__OpenBSD__))
- // TODO: This is currently disabled because it needs to be verified to work
- // on FreeBSD or OpenBSD first. When verified the '0 &&' part can be
- // removed.
+#elif (defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__))
pthread_set_name_np(pthread_self(), name);
#elif defined(MAC_OSX)
@@ -723,18 +727,20 @@ void RenameThread(const char* name)
void SetupEnvironment()
{
- std::locale loc("C");
// On most POSIX systems (e.g. Linux, but not BSD) the environment's locale
// may be invalid, in which case the "C" locale is used as fallback.
#if !defined(WIN32) && !defined(MAC_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
try {
- loc = std::locale(""); // Raises a runtime error if current locale is invalid
+ std::locale(""); // Raises a runtime error if current locale is invalid
} catch (const std::runtime_error&) {
setenv("LC_ALL", "C", 1);
}
#endif
- // The path locale is lazy initialized and to avoid deinitialization errors
+ // The path locale is lazy initialized and to avoid deinitialization errors
// in multithreading environments, it is set explicitly by the main thread.
+ // A dummy locale is used to extract the internal default locale, used by
+ // boost::filesystem::path, which is then used to explicitly imbue the path.
+ std::locale loc = boost::filesystem::path::imbue(std::locale::classic());
boost::filesystem::path::imbue(loc);
}
diff --git a/src/util.h b/src/util.h
index 9b5a4153dd..6ec81698ea 100644
--- a/src/util.h
+++ b/src/util.h
@@ -25,8 +25,17 @@
#include <vector>
#include <boost/filesystem/path.hpp>
+#include <boost/signals2/signal.hpp>
#include <boost/thread/exceptions.hpp>
+/** Signals for translation. */
+class CTranslationInterface
+{
+public:
+ /** Translate a message to the native language of the user. */
+ boost::signals2::signal<std::string (const char* psz)> Translate;
+};
+
extern std::map<std::string, std::string> mapArgs;
extern std::map<std::string, std::vector<std::string> > mapMultiArgs;
extern bool fDebug;
@@ -37,6 +46,17 @@ extern std::string strMiscWarning;
extern bool fLogTimestamps;
extern bool fLogIPs;
extern volatile bool fReopenDebugLog;
+extern CTranslationInterface translationInterface;
+
+/**
+ * Translation function: Call Translate signal on UI interface, which returns a boost::optional result.
+ * If no translation slot is registered, nothing is returned, and simply return the input.
+ */
+inline std::string _(const char* psz)
+{
+ boost::optional<std::string> rv = translationInterface.Translate(psz);
+ return rv ? (*rv) : psz;
+}
void SetupEnvironment();
@@ -106,7 +126,7 @@ boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate = true);
#endif
boost::filesystem::path GetTempPath();
void ShrinkDebugFile();
-void runCommand(std::string strCommand);
+void runCommand(const std::string& strCommand);
inline bool IsSwitchChar(char c)
{
@@ -183,43 +203,6 @@ void SetThreadPriority(int nPriority);
void RenameThread(const char* name);
/**
- * Standard wrapper for do-something-forever thread functions.
- * "Forever" really means until the thread is interrupted.
- * Use it like:
- * new boost::thread(boost::bind(&LoopForever<void (*)()>, "dumpaddr", &DumpAddresses, 900000));
- * or maybe:
- * boost::function<void()> f = boost::bind(&FunctionWithArg, argument);
- * threadGroup.create_thread(boost::bind(&LoopForever<boost::function<void()> >, "nothing", f, milliseconds));
- */
-template <typename Callable> void LoopForever(const char* name, Callable func, int64_t msecs)
-{
- std::string s = strprintf("bitcoin-%s", name);
- RenameThread(s.c_str());
- LogPrintf("%s thread start\n", name);
- try
- {
- while (1)
- {
- MilliSleep(msecs);
- func();
- }
- }
- catch (const boost::thread_interrupted&)
- {
- LogPrintf("%s thread stop\n", name);
- throw;
- }
- catch (const std::exception& e) {
- PrintExceptionContinue(&e, name);
- throw;
- }
- catch (...) {
- PrintExceptionContinue(NULL, name);
- throw;
- }
-}
-
-/**
* .. and a wrapper that just calls func once
*/
template <typename Callable> void TraceThread(const char* name, Callable func)
diff --git a/src/utilmoneystr.cpp b/src/utilmoneystr.cpp
index 2fbc048878..0f3203432f 100644
--- a/src/utilmoneystr.cpp
+++ b/src/utilmoneystr.cpp
@@ -11,7 +11,7 @@
using namespace std;
-string FormatMoney(const CAmount& n, bool fPlus)
+std::string FormatMoney(const CAmount& n)
{
// Note: not using straight sprintf here because we do NOT want
// localized number formatting.
@@ -29,8 +29,6 @@ string FormatMoney(const CAmount& n, bool fPlus)
if (n < 0)
str.insert((unsigned int)0, 1, '-');
- else if (fPlus && n > 0)
- str.insert((unsigned int)0, 1, '+');
return str;
}
diff --git a/src/utilmoneystr.h b/src/utilmoneystr.h
index cd9b04810d..99c3ba8306 100644
--- a/src/utilmoneystr.h
+++ b/src/utilmoneystr.h
@@ -14,7 +14,7 @@
#include "amount.h"
-std::string FormatMoney(const CAmount& n, bool fPlus=false);
+std::string FormatMoney(const CAmount& n);
bool ParseMoney(const std::string& str, CAmount& nRet);
bool ParseMoney(const char* pszIn, CAmount& nRet);
diff --git a/src/utilstrencodings.cpp b/src/utilstrencodings.cpp
index c15bddc6fb..7d1de7d6a8 100644
--- a/src/utilstrencodings.cpp
+++ b/src/utilstrencodings.cpp
@@ -416,12 +416,25 @@ string DecodeBase32(const string& str)
return (vchRet.size() == 0) ? string() : string((const char*)&vchRet[0], vchRet.size());
}
+static bool ParsePrechecks(const std::string& str)
+{
+ if (str.empty()) // No empty string allowed
+ return false;
+ if (str.size() >= 1 && (isspace(str[0]) || isspace(str[str.size()-1]))) // No padding allowed
+ return false;
+ if (str.size() != strlen(str.c_str())) // No embedded NUL characters allowed
+ return false;
+ return true;
+}
+
bool ParseInt32(const std::string& str, int32_t *out)
{
+ if (!ParsePrechecks(str))
+ return false;
char *endp = NULL;
errno = 0; // strtol will not set errno if valid
long int n = strtol(str.c_str(), &endp, 10);
- if(out) *out = (int)n;
+ if(out) *out = (int32_t)n;
// Note that strtol returns a *long int*, so even if strtol doesn't report a over/underflow
// we still have to check that the returned value is within the range of an *int32_t*. On 64-bit
// platforms the size of these types may be different.
@@ -430,7 +443,35 @@ bool ParseInt32(const std::string& str, int32_t *out)
n <= std::numeric_limits<int32_t>::max();
}
-std::string FormatParagraph(const std::string in, size_t width, size_t indent)
+bool ParseInt64(const std::string& str, int64_t *out)
+{
+ if (!ParsePrechecks(str))
+ return false;
+ char *endp = NULL;
+ errno = 0; // strtoll will not set errno if valid
+ long long int n = strtoll(str.c_str(), &endp, 10);
+ if(out) *out = (int64_t)n;
+ // Note that strtoll returns a *long long int*, so even if strtol doesn't report a over/underflow
+ // we still have to check that the returned value is within the range of an *int64_t*.
+ return endp && *endp == 0 && !errno &&
+ n >= std::numeric_limits<int64_t>::min() &&
+ n <= std::numeric_limits<int64_t>::max();
+}
+
+bool ParseDouble(const std::string& str, double *out)
+{
+ if (!ParsePrechecks(str))
+ return false;
+ if (str.size() >= 2 && str[0] == '0' && str[1] == 'x') // No hexadecimal floats allowed
+ return false;
+ char *endp = NULL;
+ errno = 0; // strtod will not set errno if valid
+ double n = strtod(str.c_str(), &endp);
+ if(out) *out = n;
+ return endp && *endp == 0 && !errno;
+}
+
+std::string FormatParagraph(const std::string& in, size_t width, size_t indent)
{
std::stringstream out;
size_t col = 0;
diff --git a/src/utilstrencodings.h b/src/utilstrencodings.h
index b0edd8b542..58329b51bb 100644
--- a/src/utilstrencodings.h
+++ b/src/utilstrencodings.h
@@ -49,6 +49,20 @@ int atoi(const std::string& str);
*/
bool ParseInt32(const std::string& str, int32_t *out);
+/**
+ * Convert string to signed 64-bit integer with strict parse error feedback.
+ * @returns true if the entire string could be parsed as valid integer,
+ * false if not the entire string could be parsed or when overflow or underflow occurred.
+ */
+bool ParseInt64(const std::string& str, int64_t *out);
+
+/**
+ * Convert string to double with strict parse error feedback.
+ * @returns true if the entire string could be parsed as valid double,
+ * false if not the entire string could be parsed or when overflow or underflow occurred.
+ */
+bool ParseDouble(const std::string& str, double *out);
+
template<typename T>
std::string HexStr(const T itbegin, const T itend, bool fSpaces=false)
{
@@ -74,11 +88,11 @@ inline std::string HexStr(const T& vch, bool fSpaces=false)
return HexStr(vch.begin(), vch.end(), fSpaces);
}
-/**
+/**
* Format a paragraph of text to a fixed width, adding spaces for
* indentation to any added line.
*/
-std::string FormatParagraph(const std::string in, size_t width=79, size_t indent=0);
+std::string FormatParagraph(const std::string& in, size_t width = 79, size_t indent = 0);
/**
* Timing-attack-resistant comparison.
diff --git a/src/utiltime.cpp b/src/utiltime.cpp
index 8f0dcae29d..d316288999 100644
--- a/src/utiltime.cpp
+++ b/src/utiltime.cpp
@@ -30,13 +30,13 @@ void SetMockTime(int64_t nMockTimeIn)
int64_t GetTimeMillis()
{
- return (boost::posix_time::ptime(boost::posix_time::microsec_clock::universal_time()) -
+ return (boost::posix_time::microsec_clock::universal_time() -
boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_milliseconds();
}
int64_t GetTimeMicros()
{
- return (boost::posix_time::ptime(boost::posix_time::microsec_clock::universal_time()) -
+ return (boost::posix_time::microsec_clock::universal_time() -
boost::posix_time::ptime(boost::gregorian::date(1970,1,1))).total_microseconds();
}
diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp
index aa9aefb0de..d365f03008 100644
--- a/src/validationinterface.cpp
+++ b/src/validationinterface.cpp
@@ -14,31 +14,34 @@ CMainSignals& GetMainSignals()
void RegisterValidationInterface(CValidationInterface* pwalletIn) {
g_signals.SyncTransaction.connect(boost::bind(&CValidationInterface::SyncTransaction, pwalletIn, _1, _2));
- g_signals.EraseTransaction.connect(boost::bind(&CValidationInterface::EraseFromWallet, pwalletIn, _1));
g_signals.UpdatedTransaction.connect(boost::bind(&CValidationInterface::UpdatedTransaction, pwalletIn, _1));
g_signals.SetBestChain.connect(boost::bind(&CValidationInterface::SetBestChain, pwalletIn, _1));
g_signals.Inventory.connect(boost::bind(&CValidationInterface::Inventory, pwalletIn, _1));
g_signals.Broadcast.connect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1));
g_signals.BlockChecked.connect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
+ g_signals.ScriptForMining.connect(boost::bind(&CValidationInterface::GetScriptForMining, pwalletIn, _1));
+ g_signals.BlockFound.connect(boost::bind(&CValidationInterface::ResetRequestCount, pwalletIn, _1));
}
void UnregisterValidationInterface(CValidationInterface* pwalletIn) {
+ g_signals.BlockFound.disconnect(boost::bind(&CValidationInterface::ResetRequestCount, pwalletIn, _1));
+ g_signals.ScriptForMining.disconnect(boost::bind(&CValidationInterface::GetScriptForMining, pwalletIn, _1));
g_signals.BlockChecked.disconnect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2));
g_signals.Broadcast.disconnect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1));
g_signals.Inventory.disconnect(boost::bind(&CValidationInterface::Inventory, pwalletIn, _1));
g_signals.SetBestChain.disconnect(boost::bind(&CValidationInterface::SetBestChain, pwalletIn, _1));
g_signals.UpdatedTransaction.disconnect(boost::bind(&CValidationInterface::UpdatedTransaction, pwalletIn, _1));
- g_signals.EraseTransaction.disconnect(boost::bind(&CValidationInterface::EraseFromWallet, pwalletIn, _1));
g_signals.SyncTransaction.disconnect(boost::bind(&CValidationInterface::SyncTransaction, pwalletIn, _1, _2));
}
void UnregisterAllValidationInterfaces() {
+ g_signals.BlockFound.disconnect_all_slots();
+ g_signals.ScriptForMining.disconnect_all_slots();
g_signals.BlockChecked.disconnect_all_slots();
g_signals.Broadcast.disconnect_all_slots();
g_signals.Inventory.disconnect_all_slots();
g_signals.SetBestChain.disconnect_all_slots();
g_signals.UpdatedTransaction.disconnect_all_slots();
- g_signals.EraseTransaction.disconnect_all_slots();
g_signals.SyncTransaction.disconnect_all_slots();
}
diff --git a/src/validationinterface.h b/src/validationinterface.h
index b4c93d72ca..fb0ce0bdaa 100644
--- a/src/validationinterface.h
+++ b/src/validationinterface.h
@@ -7,9 +7,11 @@
#define BITCOIN_VALIDATIONINTERFACE_H
#include <boost/signals2/signal.hpp>
+#include <boost/shared_ptr.hpp>
class CBlock;
struct CBlockLocator;
+class CReserveScript;
class CTransaction;
class CValidationInterface;
class CValidationState;
@@ -28,13 +30,14 @@ void SyncWithWallets(const CTransaction& tx, const CBlock* pblock = NULL);
class CValidationInterface {
protected:
- virtual void SyncTransaction(const CTransaction &tx, const CBlock *pblock) {};
- virtual void EraseFromWallet(const uint256 &hash) {};
- virtual void SetBestChain(const CBlockLocator &locator) {};
- virtual void UpdatedTransaction(const uint256 &hash) {};
- virtual void Inventory(const uint256 &hash) {};
- virtual void ResendWalletTransactions(int64_t nBestBlockTime) {};
- virtual void BlockChecked(const CBlock&, const CValidationState&) {};
+ virtual void SyncTransaction(const CTransaction &tx, const CBlock *pblock) {}
+ virtual void SetBestChain(const CBlockLocator &locator) {}
+ virtual void UpdatedTransaction(const uint256 &hash) {}
+ virtual void Inventory(const uint256 &hash) {}
+ virtual void ResendWalletTransactions(int64_t nBestBlockTime) {}
+ virtual void BlockChecked(const CBlock&, const CValidationState&) {}
+ virtual void GetScriptForMining(boost::shared_ptr<CReserveScript>&) {};
+ virtual void ResetRequestCount(const uint256 &hash) {};
friend void ::RegisterValidationInterface(CValidationInterface*);
friend void ::UnregisterValidationInterface(CValidationInterface*);
friend void ::UnregisterAllValidationInterfaces();
@@ -43,8 +46,6 @@ protected:
struct CMainSignals {
/** Notifies listeners of updated transaction data (transaction, and optionally the block it is found in. */
boost::signals2::signal<void (const CTransaction &, const CBlock *)> SyncTransaction;
- /** Notifies listeners of an erased transaction (currently disabled, requires transaction replacement). */
- boost::signals2::signal<void (const uint256 &)> EraseTransaction;
/** Notifies listeners of an updated transaction without new data (for now: a coinbase potentially becoming visible). */
boost::signals2::signal<void (const uint256 &)> UpdatedTransaction;
/** Notifies listeners of a new active block chain. */
@@ -55,6 +56,10 @@ struct CMainSignals {
boost::signals2::signal<void (int64_t nBestBlockTime)> Broadcast;
/** Notifies listeners of a block validation result */
boost::signals2::signal<void (const CBlock&, const CValidationState&)> BlockChecked;
+ /** Notifies listeners that a key for mining is required (coinbase) */
+ boost::signals2::signal<void (boost::shared_ptr<CReserveScript>&)> ScriptForMining;
+ /** Notifies listeners that a block has been successfully mined */
+ boost::signals2::signal<void (const uint256 &)> BlockFound;
};
CMainSignals& GetMainSignals();
diff --git a/src/wallet/crypter.h b/src/wallet/crypter.h
index 32746b00df..70aeb76723 100644
--- a/src/wallet/crypter.h
+++ b/src/wallet/crypter.h
@@ -2,8 +2,8 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_CRYPTER_H
-#define BITCOIN_CRYPTER_H
+#ifndef BITCOIN_WALLET_CRYPTER_H
+#define BITCOIN_WALLET_CRYPTER_H
#include "keystore.h"
#include "serialize.h"
@@ -193,4 +193,4 @@ public:
boost::signals2::signal<void (CCryptoKeyStore* wallet)> NotifyStatusChanged;
};
-#endif // BITCOIN_CRYPTER_H
+#endif // BITCOIN_WALLET_CRYPTER_H
diff --git a/src/wallet/db.cpp b/src/wallet/db.cpp
index 53cfcf0961..e5bc653c33 100644
--- a/src/wallet/db.cpp
+++ b/src/wallet/db.cpp
@@ -43,7 +43,7 @@ void CDBEnv::EnvShutdown()
if (ret != 0)
LogPrintf("CDBEnv::EnvShutdown: Error %d shutting down database environment: %s\n", ret, DbEnv::strerror(ret));
if (!fMockDb)
- DbEnv(0).remove(path.string().c_str(), 0);
+ DbEnv(0).remove(strPath.c_str(), 0);
}
void CDBEnv::Reset()
@@ -78,10 +78,10 @@ bool CDBEnv::Open(const boost::filesystem::path& pathIn)
boost::this_thread::interruption_point();
- path = pathIn;
- boost::filesystem::path pathLogDir = path / "database";
+ strPath = pathIn.string();
+ boost::filesystem::path pathLogDir = pathIn / "database";
TryCreateDirectory(pathLogDir);
- boost::filesystem::path pathErrorFile = path / "db.log";
+ boost::filesystem::path pathErrorFile = pathIn / "db.log";
LogPrintf("CDBEnv::Open: LogDir=%s ErrorFile=%s\n", pathLogDir.string(), pathErrorFile.string());
unsigned int nEnvFlags = 0;
@@ -98,7 +98,7 @@ bool CDBEnv::Open(const boost::filesystem::path& pathIn)
dbenv->set_flags(DB_AUTO_COMMIT, 1);
dbenv->set_flags(DB_TXN_WRITE_NOSYNC, 1);
dbenv->log_set_config(DB_LOG_AUTO_REMOVE, 1);
- int ret = dbenv->open(path.string().c_str(),
+ int ret = dbenv->open(strPath.c_str(),
DB_CREATE |
DB_INIT_LOCK |
DB_INIT_LOG |
@@ -455,7 +455,7 @@ void CDBEnv::Flush(bool fShutdown)
dbenv->log_archive(&listp, DB_ARCH_REMOVE);
Close();
if (!fMockDb)
- boost::filesystem::remove_all(path / "database");
+ boost::filesystem::remove_all(boost::filesystem::path(strPath) / "database");
}
}
}
diff --git a/src/wallet/db.h b/src/wallet/db.h
index 0c2c139d89..64071caa3a 100644
--- a/src/wallet/db.h
+++ b/src/wallet/db.h
@@ -3,8 +3,8 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_DB_H
-#define BITCOIN_DB_H
+#ifndef BITCOIN_WALLET_DB_H
+#define BITCOIN_WALLET_DB_H
#include "clientversion.h"
#include "serialize.h"
@@ -20,20 +20,16 @@
#include <db_cxx.h>
-class CDiskBlockIndex;
-class COutPoint;
-
extern unsigned int nWalletDBUpdated;
-void ThreadFlushWalletDB(const std::string& strWalletFile);
-
-
class CDBEnv
{
private:
bool fDbEnvInit;
bool fMockDb;
- boost::filesystem::path path;
+ // Don't change into boost::filesystem::path, as that can result in
+ // shutdown problems/crashes caused by a static initialized internal pointer.
+ std::string strPath;
void EnvShutdown();
@@ -310,4 +306,4 @@ public:
bool static Rewrite(const std::string& strFile, const char* pszSkip = NULL);
};
-#endif // BITCOIN_DB_H
+#endif // BITCOIN_WALLET_DB_H
diff --git a/src/wallet/rpcdump.cpp b/src/wallet/rpcdump.cpp
index b9c92a06c5..5f800474a0 100644
--- a/src/wallet/rpcdump.cpp
+++ b/src/wallet/rpcdump.cpp
@@ -19,12 +19,12 @@
#include <boost/algorithm/string.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
-#include "json/json_spirit_value.h"
+#include "univalue/univalue.h"
-using namespace json_spirit;
using namespace std;
void EnsureWalletIsUnlocked();
+bool EnsureWalletIsAvailable(bool avoidException);
std::string static EncodeDumpTime(int64_t nTime) {
return DateTimeStrFormat("%Y-%m-%dT%H:%M:%SZ", nTime);
@@ -69,8 +69,11 @@ std::string DecodeDumpString(const std::string &str) {
return ret.str();
}
-Value importprivkey(const Array& params, bool fHelp)
+UniValue importprivkey(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 1 || params.size() > 3)
throw runtime_error(
"importprivkey \"bitcoinprivkey\" ( \"label\" rescan )\n"
@@ -91,6 +94,9 @@ Value importprivkey(const Array& params, bool fHelp)
+ HelpExampleRpc("importprivkey", "\"mykey\", \"testing\", false")
);
+ if (fPruneMode)
+ throw JSONRPCError(RPC_WALLET_ERROR, "Importing keys is disabled in pruned mode");
+
LOCK2(cs_main, pwalletMain->cs_wallet);
EnsureWalletIsUnlocked();
@@ -122,7 +128,7 @@ Value importprivkey(const Array& params, bool fHelp)
// Don't throw error in case a key is already there
if (pwalletMain->HaveKey(vchAddress))
- return Value::null;
+ return NullUniValue;
pwalletMain->mapKeyMetadata[vchAddress].nCreateTime = 1;
@@ -137,11 +143,14 @@ Value importprivkey(const Array& params, bool fHelp)
}
}
- return Value::null;
+ return NullUniValue;
}
-Value importaddress(const Array& params, bool fHelp)
+UniValue importaddress(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 1 || params.size() > 3)
throw runtime_error(
"importaddress \"address\" ( \"label\" rescan )\n"
@@ -160,6 +169,9 @@ Value importaddress(const Array& params, bool fHelp)
+ HelpExampleRpc("importaddress", "\"myaddress\", \"testing\", false")
);
+ if (fPruneMode)
+ throw JSONRPCError(RPC_WALLET_ERROR, "Importing addresses is disabled in pruned mode");
+
LOCK2(cs_main, pwalletMain->cs_wallet);
CScript script;
@@ -193,7 +205,7 @@ Value importaddress(const Array& params, bool fHelp)
// Don't throw error in case an address is already there
if (pwalletMain->HaveWatchOnly(script))
- return Value::null;
+ return NullUniValue;
pwalletMain->MarkDirty();
@@ -207,11 +219,14 @@ Value importaddress(const Array& params, bool fHelp)
}
}
- return Value::null;
+ return NullUniValue;
}
-Value importwallet(const Array& params, bool fHelp)
+UniValue importwallet(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"importwallet \"filename\"\n"
@@ -227,6 +242,9 @@ Value importwallet(const Array& params, bool fHelp)
+ HelpExampleRpc("importwallet", "\"test\"")
);
+ if (fPruneMode)
+ throw JSONRPCError(RPC_WALLET_ERROR, "Importing wallets is disabled in pruned mode");
+
LOCK2(cs_main, pwalletMain->cs_wallet);
EnsureWalletIsUnlocked();
@@ -308,11 +326,14 @@ Value importwallet(const Array& params, bool fHelp)
if (!fGood)
throw JSONRPCError(RPC_WALLET_ERROR, "Error adding some keys to wallet");
- return Value::null;
+ return NullUniValue;
}
-Value dumpprivkey(const Array& params, bool fHelp)
+UniValue dumpprivkey(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"dumpprivkey \"bitcoinaddress\"\n"
@@ -346,8 +367,11 @@ Value dumpprivkey(const Array& params, bool fHelp)
}
-Value dumpwallet(const Array& params, bool fHelp)
+UniValue dumpwallet(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"dumpwallet \"filename\"\n"
@@ -405,5 +429,5 @@ Value dumpwallet(const Array& params, bool fHelp)
file << "\n";
file << "# End of dump\n";
file.close();
- return Value::null;
+ return NullUniValue;
}
diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp
index 29f3eda15d..8d88933878 100644
--- a/src/wallet/rpcwallet.cpp
+++ b/src/wallet/rpcwallet.cpp
@@ -21,11 +21,9 @@
#include <boost/assign/list_of.hpp>
-#include "json/json_spirit_utils.h"
-#include "json/json_spirit_value.h"
+#include "univalue/univalue.h"
using namespace std;
-using namespace json_spirit;
int64_t nWalletUnlockTime;
static CCriticalSection cs_nWalletUnlockTime;
@@ -37,13 +35,25 @@ std::string HelpRequiringPassphrase()
: "";
}
+bool EnsureWalletIsAvailable(bool avoidException)
+{
+ if (!pwalletMain)
+ {
+ if (!avoidException)
+ throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
+ else
+ return false;
+ }
+ return true;
+}
+
void EnsureWalletIsUnlocked()
{
if (pwalletMain->IsLocked())
throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Error: Please enter the wallet passphrase with walletpassphrase first.");
}
-void WalletTxToJSON(const CWalletTx& wtx, Object& entry)
+void WalletTxToJSON(const CWalletTx& wtx, UniValue& entry)
{
int confirms = wtx.GetDepthInMainChain();
entry.push_back(Pair("confirmations", confirms));
@@ -57,7 +67,7 @@ void WalletTxToJSON(const CWalletTx& wtx, Object& entry)
}
uint256 hash = wtx.GetHash();
entry.push_back(Pair("txid", hash.GetHex()));
- Array conflicts;
+ UniValue conflicts(UniValue::VARR);
BOOST_FOREACH(const uint256& conflict, wtx.GetConflicts())
conflicts.push_back(conflict.GetHex());
entry.push_back(Pair("walletconflicts", conflicts));
@@ -67,7 +77,7 @@ void WalletTxToJSON(const CWalletTx& wtx, Object& entry)
entry.push_back(Pair(item.first, item.second));
}
-string AccountFromValue(const Value& value)
+string AccountFromValue(const UniValue& value)
{
string strAccount = value.get_str();
if (strAccount == "*")
@@ -75,8 +85,11 @@ string AccountFromValue(const Value& value)
return strAccount;
}
-Value getnewaddress(const Array& params, bool fHelp)
+UniValue getnewaddress(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() > 1)
throw runtime_error(
"getnewaddress ( \"account\" )\n"
@@ -151,8 +164,11 @@ CBitcoinAddress GetAccountAddress(string strAccount, bool bForceNew=false)
return CBitcoinAddress(account.vchPubKey.GetID());
}
-Value getaccountaddress(const Array& params, bool fHelp)
+UniValue getaccountaddress(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"getaccountaddress \"account\"\n"
@@ -173,15 +189,18 @@ Value getaccountaddress(const Array& params, bool fHelp)
// Parse the account first so we don't generate a key if there's an error
string strAccount = AccountFromValue(params[0]);
- Value ret;
+ UniValue ret(UniValue::VSTR);
ret = GetAccountAddress(strAccount).ToString();
return ret;
}
-Value getrawchangeaddress(const Array& params, bool fHelp)
+UniValue getrawchangeaddress(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() > 1)
throw runtime_error(
"getrawchangeaddress\n"
@@ -212,8 +231,11 @@ Value getrawchangeaddress(const Array& params, bool fHelp)
}
-Value setaccount(const Array& params, bool fHelp)
+UniValue setaccount(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
"setaccount \"bitcoinaddress\" \"account\"\n"
@@ -251,12 +273,15 @@ Value setaccount(const Array& params, bool fHelp)
else
throw JSONRPCError(RPC_MISC_ERROR, "setaccount can only be used with own address");
- return Value::null;
+ return NullUniValue;
}
-Value getaccount(const Array& params, bool fHelp)
+UniValue getaccount(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"getaccount \"bitcoinaddress\"\n"
@@ -284,8 +309,11 @@ Value getaccount(const Array& params, bool fHelp)
}
-Value getaddressesbyaccount(const Array& params, bool fHelp)
+UniValue getaddressesbyaccount(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"getaddressesbyaccount \"account\"\n"
@@ -307,7 +335,7 @@ Value getaddressesbyaccount(const Array& params, bool fHelp)
string strAccount = AccountFromValue(params[0]);
// Find all addresses that have the given account
- Array ret;
+ UniValue ret(UniValue::VARR);
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, CAddressBookData)& item, pwalletMain->mapAddressBook)
{
const CBitcoinAddress& address = item.first;
@@ -349,8 +377,11 @@ static void SendMoney(const CTxDestination &address, CAmount nValue, bool fSubtr
throw JSONRPCError(RPC_WALLET_ERROR, "Error: The transaction was rejected! This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here.");
}
-Value sendtoaddress(const Array& params, bool fHelp)
+UniValue sendtoaddress(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 2 || params.size() > 5)
throw runtime_error(
"sendtoaddress \"bitcoinaddress\" amount ( \"comment\" \"comment-to\" subtractfeefromamount )\n"
@@ -383,12 +414,14 @@ Value sendtoaddress(const Array& params, bool fHelp)
// Amount
CAmount nAmount = AmountFromValue(params[1]);
+ if (nAmount <= 0)
+ throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount for send");
// Wallet comments
CWalletTx wtx;
- if (params.size() > 2 && params[2].type() != null_type && !params[2].get_str().empty())
+ if (params.size() > 2 && !params[2].isNull() && !params[2].get_str().empty())
wtx.mapValue["comment"] = params[2].get_str();
- if (params.size() > 3 && params[3].type() != null_type && !params[3].get_str().empty())
+ if (params.size() > 3 && !params[3].isNull() && !params[3].get_str().empty())
wtx.mapValue["to"] = params[3].get_str();
bool fSubtractFeeFromAmount = false;
@@ -402,8 +435,11 @@ Value sendtoaddress(const Array& params, bool fHelp)
return wtx.GetHash().GetHex();
}
-Value listaddressgroupings(const Array& params, bool fHelp)
+UniValue listaddressgroupings(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp)
throw runtime_error(
"listaddressgroupings\n"
@@ -429,14 +465,14 @@ Value listaddressgroupings(const Array& params, bool fHelp)
LOCK2(cs_main, pwalletMain->cs_wallet);
- Array jsonGroupings;
+ UniValue jsonGroupings(UniValue::VARR);
map<CTxDestination, CAmount> balances = pwalletMain->GetAddressBalances();
BOOST_FOREACH(set<CTxDestination> grouping, pwalletMain->GetAddressGroupings())
{
- Array jsonGrouping;
+ UniValue jsonGrouping(UniValue::VARR);
BOOST_FOREACH(CTxDestination address, grouping)
{
- Array addressInfo;
+ UniValue addressInfo(UniValue::VARR);
addressInfo.push_back(CBitcoinAddress(address).ToString());
addressInfo.push_back(ValueFromAmount(balances[address]));
{
@@ -451,8 +487,11 @@ Value listaddressgroupings(const Array& params, bool fHelp)
return jsonGroupings;
}
-Value signmessage(const Array& params, bool fHelp)
+UniValue signmessage(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() != 2)
throw runtime_error(
"signmessage \"bitcoinaddress\" \"message\"\n"
@@ -504,8 +543,11 @@ Value signmessage(const Array& params, bool fHelp)
return EncodeBase64(&vchSig[0], vchSig.size());
}
-Value getreceivedbyaddress(const Array& params, bool fHelp)
+UniValue getreceivedbyaddress(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
"getreceivedbyaddress \"bitcoinaddress\" ( minconf )\n"
@@ -546,7 +588,7 @@ Value getreceivedbyaddress(const Array& params, bool fHelp)
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
{
const CWalletTx& wtx = (*it).second;
- if (wtx.IsCoinBase() || !IsFinalTx(wtx))
+ if (wtx.IsCoinBase() || !CheckFinalTx(wtx))
continue;
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
@@ -559,8 +601,11 @@ Value getreceivedbyaddress(const Array& params, bool fHelp)
}
-Value getreceivedbyaccount(const Array& params, bool fHelp)
+UniValue getreceivedbyaccount(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
"getreceivedbyaccount \"account\" ( minconf )\n"
@@ -597,7 +642,7 @@ Value getreceivedbyaccount(const Array& params, bool fHelp)
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
{
const CWalletTx& wtx = (*it).second;
- if (wtx.IsCoinBase() || !IsFinalTx(wtx))
+ if (wtx.IsCoinBase() || !CheckFinalTx(wtx))
continue;
BOOST_FOREACH(const CTxOut& txout, wtx.vout)
@@ -621,7 +666,7 @@ CAmount GetAccountBalance(CWalletDB& walletdb, const string& strAccount, int nMi
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
{
const CWalletTx& wtx = (*it).second;
- if (!IsFinalTx(wtx) || wtx.GetBlocksToMaturity() > 0 || wtx.GetDepthInMainChain() < 0)
+ if (!CheckFinalTx(wtx) || wtx.GetBlocksToMaturity() > 0 || wtx.GetDepthInMainChain() < 0)
continue;
CAmount nReceived, nSent, nFee;
@@ -645,8 +690,11 @@ CAmount GetAccountBalance(const string& strAccount, int nMinDepth, const isminef
}
-Value getbalance(const Array& params, bool fHelp)
+UniValue getbalance(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() > 3)
throw runtime_error(
"getbalance ( \"account\" minconf includeWatchonly )\n"
@@ -685,12 +733,12 @@ Value getbalance(const Array& params, bool fHelp)
if (params[0].get_str() == "*") {
// Calculate total balance a different way from GetBalance()
// (GetBalance() sums up all unspent TxOuts)
- // getbalance and getbalance '*' 0 should return the same number
+ // getbalance and "getbalance * 1 true" should return the same number
CAmount nBalance = 0;
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); ++it)
{
const CWalletTx& wtx = (*it).second;
- if (!wtx.IsTrusted() || wtx.GetBlocksToMaturity() > 0)
+ if (!CheckFinalTx(wtx) || wtx.GetBlocksToMaturity() > 0 || wtx.GetDepthInMainChain() < 0)
continue;
CAmount allFee;
@@ -717,8 +765,11 @@ Value getbalance(const Array& params, bool fHelp)
return ValueFromAmount(nBalance);
}
-Value getunconfirmedbalance(const Array &params, bool fHelp)
+UniValue getunconfirmedbalance(const UniValue &params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() > 0)
throw runtime_error(
"getunconfirmedbalance\n"
@@ -730,8 +781,11 @@ Value getunconfirmedbalance(const Array &params, bool fHelp)
}
-Value movecmd(const Array& params, bool fHelp)
+UniValue movecmd(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 3 || params.size() > 5)
throw runtime_error(
"move \"fromaccount\" \"toaccount\" amount ( minconf \"comment\" )\n"
@@ -757,6 +811,8 @@ Value movecmd(const Array& params, bool fHelp)
string strFrom = AccountFromValue(params[0]);
string strTo = AccountFromValue(params[1]);
CAmount nAmount = AmountFromValue(params[2]);
+ if (nAmount <= 0)
+ throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount for send");
if (params.size() > 3)
// unused parameter, used to be nMinDepth, keep type-checking it though
(void)params[3].get_int();
@@ -797,8 +853,11 @@ Value movecmd(const Array& params, bool fHelp)
}
-Value sendfrom(const Array& params, bool fHelp)
+UniValue sendfrom(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 3 || params.size() > 6)
throw runtime_error(
"sendfrom \"fromaccount\" \"tobitcoinaddress\" amount ( minconf \"comment\" \"comment-to\" )\n"
@@ -833,15 +892,17 @@ Value sendfrom(const Array& params, bool fHelp)
if (!address.IsValid())
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid Bitcoin address");
CAmount nAmount = AmountFromValue(params[2]);
+ if (nAmount <= 0)
+ throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount for send");
int nMinDepth = 1;
if (params.size() > 3)
nMinDepth = params[3].get_int();
CWalletTx wtx;
wtx.strFromAccount = strAccount;
- if (params.size() > 4 && params[4].type() != null_type && !params[4].get_str().empty())
+ if (params.size() > 4 && !params[4].isNull() && !params[4].get_str().empty())
wtx.mapValue["comment"] = params[4].get_str();
- if (params.size() > 5 && params[5].type() != null_type && !params[5].get_str().empty())
+ if (params.size() > 5 && !params[5].isNull() && !params[5].get_str().empty())
wtx.mapValue["to"] = params[5].get_str();
EnsureWalletIsUnlocked();
@@ -857,8 +918,11 @@ Value sendfrom(const Array& params, bool fHelp)
}
-Value sendmany(const Array& params, bool fHelp)
+UniValue sendmany(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 2 || params.size() > 5)
throw runtime_error(
"sendmany \"fromaccount\" {\"address\":amount,...} ( minconf \"comment\" [\"address\",...] )\n"
@@ -898,17 +962,17 @@ Value sendmany(const Array& params, bool fHelp)
LOCK2(cs_main, pwalletMain->cs_wallet);
string strAccount = AccountFromValue(params[0]);
- Object sendTo = params[1].get_obj();
+ UniValue sendTo = params[1].get_obj();
int nMinDepth = 1;
if (params.size() > 2)
nMinDepth = params[2].get_int();
CWalletTx wtx;
wtx.strFromAccount = strAccount;
- if (params.size() > 3 && params[3].type() != null_type && !params[3].get_str().empty())
+ if (params.size() > 3 && !params[3].isNull() && !params[3].get_str().empty())
wtx.mapValue["comment"] = params[3].get_str();
- Array subtractFeeFromAmount;
+ UniValue subtractFeeFromAmount(UniValue::VARR);
if (params.size() > 4)
subtractFeeFromAmount = params[4].get_array();
@@ -916,24 +980,29 @@ Value sendmany(const Array& params, bool fHelp)
vector<CRecipient> vecSend;
CAmount totalAmount = 0;
- BOOST_FOREACH(const Pair& s, sendTo)
+ vector<string> keys = sendTo.getKeys();
+ BOOST_FOREACH(const string& name_, keys)
{
- CBitcoinAddress address(s.name_);
+ CBitcoinAddress address(name_);
if (!address.IsValid())
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+s.name_);
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+name_);
if (setAddress.count(address))
- throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+s.name_);
+ throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+name_);
setAddress.insert(address);
CScript scriptPubKey = GetScriptForDestination(address.Get());
- CAmount nAmount = AmountFromValue(s.value_);
+ CAmount nAmount = AmountFromValue(sendTo[name_]);
+ if (nAmount <= 0)
+ throw JSONRPCError(RPC_TYPE_ERROR, "Invalid amount for send");
totalAmount += nAmount;
bool fSubtractFeeFromAmount = false;
- BOOST_FOREACH(const Value& addr, subtractFeeFromAmount)
- if (addr.get_str() == s.name_)
+ for (unsigned int idx = 0; idx < subtractFeeFromAmount.size(); idx++) {
+ const UniValue& addr = subtractFeeFromAmount[idx];
+ if (addr.get_str() == name_)
fSubtractFeeFromAmount = true;
+ }
CRecipient recipient = {scriptPubKey, nAmount, fSubtractFeeFromAmount};
vecSend.push_back(recipient);
@@ -961,10 +1030,13 @@ Value sendmany(const Array& params, bool fHelp)
}
// Defined in rpcmisc.cpp
-extern CScript _createmultisig_redeemScript(const Array& params);
+extern CScript _createmultisig_redeemScript(const UniValue& params);
-Value addmultisigaddress(const Array& params, bool fHelp)
+UniValue addmultisigaddress(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 2 || params.size() > 3)
{
string msg = "addmultisigaddress nrequired [\"key\",...] ( \"account\" )\n"
@@ -1023,7 +1095,7 @@ struct tallyitem
}
};
-Value ListReceived(const Array& params, bool fByAccounts)
+UniValue ListReceived(const UniValue& params, bool fByAccounts)
{
// Minimum confirmations
int nMinDepth = 1;
@@ -1046,7 +1118,7 @@ Value ListReceived(const Array& params, bool fByAccounts)
{
const CWalletTx& wtx = (*it).second;
- if (wtx.IsCoinBase() || !IsFinalTx(wtx))
+ if (wtx.IsCoinBase() || !CheckFinalTx(wtx))
continue;
int nDepth = wtx.GetDepthInMainChain();
@@ -1073,7 +1145,7 @@ Value ListReceived(const Array& params, bool fByAccounts)
}
// Reply
- Array ret;
+ UniValue ret(UniValue::VARR);
map<string, tallyitem> mapAccountTally;
BOOST_FOREACH(const PAIRTYPE(CBitcoinAddress, CAddressBookData)& item, pwalletMain->mapAddressBook)
{
@@ -1102,14 +1174,14 @@ Value ListReceived(const Array& params, bool fByAccounts)
}
else
{
- Object obj;
+ UniValue obj(UniValue::VOBJ);
if(fIsWatchonly)
obj.push_back(Pair("involvesWatchonly", true));
obj.push_back(Pair("address", address.ToString()));
obj.push_back(Pair("account", strAccount));
obj.push_back(Pair("amount", ValueFromAmount(nAmount)));
obj.push_back(Pair("confirmations", (nConf == std::numeric_limits<int>::max() ? 0 : nConf)));
- Array transactions;
+ UniValue transactions(UniValue::VARR);
if (it != mapTally.end())
{
BOOST_FOREACH(const uint256& item, (*it).second.txids)
@@ -1128,7 +1200,7 @@ Value ListReceived(const Array& params, bool fByAccounts)
{
CAmount nAmount = (*it).second.nAmount;
int nConf = (*it).second.nConf;
- Object obj;
+ UniValue obj(UniValue::VOBJ);
if((*it).second.fIsWatchonly)
obj.push_back(Pair("involvesWatchonly", true));
obj.push_back(Pair("account", (*it).first));
@@ -1141,8 +1213,11 @@ Value ListReceived(const Array& params, bool fByAccounts)
return ret;
}
-Value listreceivedbyaddress(const Array& params, bool fHelp)
+UniValue listreceivedbyaddress(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() > 3)
throw runtime_error(
"listreceivedbyaddress ( minconf includeempty includeWatchonly)\n"
@@ -1175,8 +1250,11 @@ Value listreceivedbyaddress(const Array& params, bool fHelp)
return ListReceived(params, false);
}
-Value listreceivedbyaccount(const Array& params, bool fHelp)
+UniValue listreceivedbyaccount(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() > 3)
throw runtime_error(
"listreceivedbyaccount ( minconf includeempty includeWatchonly)\n"
@@ -1208,14 +1286,14 @@ Value listreceivedbyaccount(const Array& params, bool fHelp)
return ListReceived(params, true);
}
-static void MaybePushAddress(Object & entry, const CTxDestination &dest)
+static void MaybePushAddress(UniValue & entry, const CTxDestination &dest)
{
CBitcoinAddress addr;
if (addr.Set(dest))
entry.push_back(Pair("address", addr.ToString()));
}
-void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDepth, bool fLong, Array& ret, const isminefilter& filter)
+void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDepth, bool fLong, UniValue& ret, const isminefilter& filter)
{
CAmount nFee;
string strSentAccount;
@@ -1232,7 +1310,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe
{
BOOST_FOREACH(const COutputEntry& s, listSent)
{
- Object entry;
+ UniValue entry(UniValue::VOBJ);
if(involvesWatchonly || (::IsMine(*pwalletMain, s.destination) & ISMINE_WATCH_ONLY))
entry.push_back(Pair("involvesWatchonly", true));
entry.push_back(Pair("account", strSentAccount));
@@ -1257,7 +1335,7 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe
account = pwalletMain->mapAddressBook[r.destination].name;
if (fAllAccounts || (account == strAccount))
{
- Object entry;
+ UniValue entry(UniValue::VOBJ);
if(involvesWatchonly || (::IsMine(*pwalletMain, r.destination) & ISMINE_WATCH_ONLY))
entry.push_back(Pair("involvesWatchonly", true));
entry.push_back(Pair("account", account));
@@ -1285,13 +1363,13 @@ void ListTransactions(const CWalletTx& wtx, const string& strAccount, int nMinDe
}
}
-void AcentryToJSON(const CAccountingEntry& acentry, const string& strAccount, Array& ret)
+void AcentryToJSON(const CAccountingEntry& acentry, const string& strAccount, UniValue& ret)
{
bool fAllAccounts = (strAccount == string("*"));
if (fAllAccounts || acentry.strAccount == strAccount)
{
- Object entry;
+ UniValue entry(UniValue::VOBJ);
entry.push_back(Pair("account", acentry.strAccount));
entry.push_back(Pair("category", "move"));
entry.push_back(Pair("time", acentry.nTime));
@@ -1302,8 +1380,11 @@ void AcentryToJSON(const CAccountingEntry& acentry, const string& strAccount, Ar
}
}
-Value listtransactions(const Array& params, bool fHelp)
+UniValue listtransactions(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() > 4)
throw runtime_error(
"listtransactions ( \"account\" count from includeWatchonly)\n"
@@ -1377,7 +1458,7 @@ Value listtransactions(const Array& params, bool fHelp)
if (nFrom < 0)
throw JSONRPCError(RPC_INVALID_PARAMETER, "Negative from");
- Array ret;
+ UniValue ret(UniValue::VARR);
std::list<CAccountingEntry> acentries;
CWallet::TxItems txOrdered = pwalletMain->OrderedTxItems(acentries, strAccount);
@@ -1400,21 +1481,31 @@ Value listtransactions(const Array& params, bool fHelp)
nFrom = ret.size();
if ((nFrom + nCount) > (int)ret.size())
nCount = ret.size() - nFrom;
- Array::iterator first = ret.begin();
+
+ vector<UniValue> arrTmp = ret.getValues();
+
+ vector<UniValue>::iterator first = arrTmp.begin();
std::advance(first, nFrom);
- Array::iterator last = ret.begin();
+ vector<UniValue>::iterator last = arrTmp.begin();
std::advance(last, nFrom+nCount);
- if (last != ret.end()) ret.erase(last, ret.end());
- if (first != ret.begin()) ret.erase(ret.begin(), first);
+ if (last != arrTmp.end()) arrTmp.erase(last, arrTmp.end());
+ if (first != arrTmp.begin()) arrTmp.erase(arrTmp.begin(), first);
+
+ std::reverse(arrTmp.begin(), arrTmp.end()); // Return oldest to newest
- std::reverse(ret.begin(), ret.end()); // Return oldest to newest
+ ret.clear();
+ ret.setArray();
+ ret.push_backV(arrTmp);
return ret;
}
-Value listaccounts(const Array& params, bool fHelp)
+UniValue listaccounts(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() > 2)
throw runtime_error(
"listaccounts ( minconf includeWatchonly)\n"
@@ -1483,15 +1574,18 @@ Value listaccounts(const Array& params, bool fHelp)
BOOST_FOREACH(const CAccountingEntry& entry, acentries)
mapAccountBalances[entry.strAccount] += entry.nCreditDebit;
- Object ret;
+ UniValue ret(UniValue::VOBJ);
BOOST_FOREACH(const PAIRTYPE(string, CAmount)& accountBalance, mapAccountBalances) {
ret.push_back(Pair(accountBalance.first, ValueFromAmount(accountBalance.second)));
}
return ret;
}
-Value listsinceblock(const Array& params, bool fHelp)
+UniValue listsinceblock(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp)
throw runtime_error(
"listsinceblock ( \"blockhash\" target-confirmations includeWatchonly)\n"
@@ -1558,7 +1652,7 @@ Value listsinceblock(const Array& params, bool fHelp)
int depth = pindex ? (1 + chainActive.Height() - pindex->nHeight) : -1;
- Array transactions;
+ UniValue transactions(UniValue::VARR);
for (map<uint256, CWalletTx>::iterator it = pwalletMain->mapWallet.begin(); it != pwalletMain->mapWallet.end(); it++)
{
@@ -1571,15 +1665,18 @@ Value listsinceblock(const Array& params, bool fHelp)
CBlockIndex *pblockLast = chainActive[chainActive.Height() + 1 - target_confirms];
uint256 lastblock = pblockLast ? pblockLast->GetBlockHash() : uint256();
- Object ret;
+ UniValue ret(UniValue::VOBJ);
ret.push_back(Pair("transactions", transactions));
ret.push_back(Pair("lastblock", lastblock.GetHex()));
return ret;
}
-Value gettransaction(const Array& params, bool fHelp)
+UniValue gettransaction(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
"gettransaction \"txid\" ( includeWatchonly )\n"
@@ -1626,7 +1723,7 @@ Value gettransaction(const Array& params, bool fHelp)
if(params[1].get_bool())
filter = filter | ISMINE_WATCH_ONLY;
- Object entry;
+ UniValue entry(UniValue::VOBJ);
if (!pwalletMain->mapWallet.count(hash))
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Invalid or non-wallet transaction id");
const CWalletTx& wtx = pwalletMain->mapWallet[hash];
@@ -1642,7 +1739,7 @@ Value gettransaction(const Array& params, bool fHelp)
WalletTxToJSON(wtx, entry);
- Array details;
+ UniValue details(UniValue::VARR);
ListTransactions(wtx, "*", 0, false, details, filter);
entry.push_back(Pair("details", details));
@@ -1653,8 +1750,11 @@ Value gettransaction(const Array& params, bool fHelp)
}
-Value backupwallet(const Array& params, bool fHelp)
+UniValue backupwallet(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() != 1)
throw runtime_error(
"backupwallet \"destination\"\n"
@@ -1672,12 +1772,15 @@ Value backupwallet(const Array& params, bool fHelp)
if (!BackupWallet(*pwalletMain, strDest))
throw JSONRPCError(RPC_WALLET_ERROR, "Error: Wallet backup failed!");
- return Value::null;
+ return NullUniValue;
}
-Value keypoolrefill(const Array& params, bool fHelp)
+UniValue keypoolrefill(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() > 1)
throw runtime_error(
"keypoolrefill ( newsize )\n"
@@ -1706,7 +1809,7 @@ Value keypoolrefill(const Array& params, bool fHelp)
if (pwalletMain->GetKeyPoolSize() < kpSize)
throw JSONRPCError(RPC_WALLET_ERROR, "Error refreshing keypool.");
- return Value::null;
+ return NullUniValue;
}
@@ -1717,8 +1820,11 @@ static void LockWallet(CWallet* pWallet)
pWallet->Lock();
}
-Value walletpassphrase(const Array& params, bool fHelp)
+UniValue walletpassphrase(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2))
throw runtime_error(
"walletpassphrase \"passphrase\" timeout\n"
@@ -1770,12 +1876,15 @@ Value walletpassphrase(const Array& params, bool fHelp)
nWalletUnlockTime = GetTime() + nSleepTime;
RPCRunLater("lockwallet", boost::bind(LockWallet, pwalletMain), nSleepTime);
- return Value::null;
+ return NullUniValue;
}
-Value walletpassphrasechange(const Array& params, bool fHelp)
+UniValue walletpassphrasechange(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (pwalletMain->IsCrypted() && (fHelp || params.size() != 2))
throw runtime_error(
"walletpassphrasechange \"oldpassphrase\" \"newpassphrase\"\n"
@@ -1813,12 +1922,15 @@ Value walletpassphrasechange(const Array& params, bool fHelp)
if (!pwalletMain->ChangeWalletPassphrase(strOldWalletPass, strNewWalletPass))
throw JSONRPCError(RPC_WALLET_PASSPHRASE_INCORRECT, "Error: The wallet passphrase entered was incorrect.");
- return Value::null;
+ return NullUniValue;
}
-Value walletlock(const Array& params, bool fHelp)
+UniValue walletlock(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (pwalletMain->IsCrypted() && (fHelp || params.size() != 0))
throw runtime_error(
"walletlock\n"
@@ -1849,12 +1961,15 @@ Value walletlock(const Array& params, bool fHelp)
nWalletUnlockTime = 0;
}
- return Value::null;
+ return NullUniValue;
}
-Value encryptwallet(const Array& params, bool fHelp)
+UniValue encryptwallet(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (!pwalletMain->IsCrypted() && (fHelp || params.size() != 1))
throw runtime_error(
"encryptwallet \"passphrase\"\n"
@@ -1907,8 +2022,11 @@ Value encryptwallet(const Array& params, bool fHelp)
return "wallet encrypted; Bitcoin server stopping, restart to run with encrypted wallet. The keypool has been flushed, you need to make a new backup.";
}
-Value lockunspent(const Array& params, bool fHelp)
+UniValue lockunspent(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 1 || params.size() > 2)
throw runtime_error(
"lockunspent unlock [{\"txid\":\"txid\",\"vout\":n},...]\n"
@@ -1948,9 +2066,9 @@ Value lockunspent(const Array& params, bool fHelp)
LOCK2(cs_main, pwalletMain->cs_wallet);
if (params.size() == 1)
- RPCTypeCheck(params, boost::assign::list_of(bool_type));
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VBOOL));
else
- RPCTypeCheck(params, boost::assign::list_of(bool_type)(array_type));
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VBOOL)(UniValue::VARR));
bool fUnlock = params[0].get_bool();
@@ -1960,14 +2078,14 @@ Value lockunspent(const Array& params, bool fHelp)
return true;
}
- Array outputs = params[1].get_array();
- BOOST_FOREACH(Value& output, outputs)
- {
- if (output.type() != obj_type)
+ UniValue outputs = params[1].get_array();
+ for (unsigned int idx = 0; idx < outputs.size(); idx++) {
+ const UniValue& output = outputs[idx];
+ if (!output.isObject())
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected object");
- const Object& o = output.get_obj();
+ const UniValue& o = output.get_obj();
- RPCTypeCheck(o, boost::assign::map_list_of("txid", str_type)("vout", int_type));
+ RPCTypeCheckObj(o, boost::assign::map_list_of("txid", UniValue::VSTR)("vout", UniValue::VNUM));
string txid = find_value(o, "txid").get_str();
if (!IsHex(txid))
@@ -1988,8 +2106,11 @@ Value lockunspent(const Array& params, bool fHelp)
return true;
}
-Value listlockunspent(const Array& params, bool fHelp)
+UniValue listlockunspent(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() > 0)
throw runtime_error(
"listlockunspent\n"
@@ -2021,10 +2142,10 @@ Value listlockunspent(const Array& params, bool fHelp)
vector<COutPoint> vOutpts;
pwalletMain->ListLockedCoins(vOutpts);
- Array ret;
+ UniValue ret(UniValue::VARR);
BOOST_FOREACH(COutPoint &outpt, vOutpts) {
- Object o;
+ UniValue o(UniValue::VOBJ);
o.push_back(Pair("txid", outpt.hash.GetHex()));
o.push_back(Pair("vout", (int)outpt.n));
@@ -2034,8 +2155,11 @@ Value listlockunspent(const Array& params, bool fHelp)
return ret;
}
-Value settxfee(const Array& params, bool fHelp)
+UniValue settxfee(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() < 1 || params.size() > 1)
throw runtime_error(
"settxfee amount\n"
@@ -2052,16 +2176,17 @@ Value settxfee(const Array& params, bool fHelp)
LOCK2(cs_main, pwalletMain->cs_wallet);
// Amount
- CAmount nAmount = 0;
- if (params[0].get_real() != 0.0)
- nAmount = AmountFromValue(params[0]); // rejects 0.0 amounts
+ CAmount nAmount = AmountFromValue(params[0]);
payTxFee = CFeeRate(nAmount, 1000);
return true;
}
-Value getwalletinfo(const Array& params, bool fHelp)
+UniValue getwalletinfo(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() != 0)
throw runtime_error(
"getwalletinfo\n"
@@ -2076,6 +2201,7 @@ Value getwalletinfo(const Array& params, bool fHelp)
" \"keypoololdest\": xxxxxx, (numeric) the timestamp (seconds since GMT epoch) of the oldest pre-generated key in the key pool\n"
" \"keypoolsize\": xxxx, (numeric) how many new keys are pre-generated\n"
" \"unlocked_until\": ttt, (numeric) the timestamp in seconds since epoch (midnight Jan 1 1970 GMT) that the wallet is unlocked for transfers, or 0 if the wallet is locked\n"
+ " \"paytxfee\": x.xxxx, (numeric) the transaction fee configuration, set in btc/kb\n"
"}\n"
"\nExamples:\n"
+ HelpExampleCli("getwalletinfo", "")
@@ -2084,7 +2210,7 @@ Value getwalletinfo(const Array& params, bool fHelp)
LOCK2(cs_main, pwalletMain->cs_wallet);
- Object obj;
+ UniValue obj(UniValue::VOBJ);
obj.push_back(Pair("walletversion", pwalletMain->GetVersion()));
obj.push_back(Pair("balance", ValueFromAmount(pwalletMain->GetBalance())));
obj.push_back(Pair("unconfirmed_balance", ValueFromAmount(pwalletMain->GetUnconfirmedBalance())));
@@ -2094,11 +2220,15 @@ Value getwalletinfo(const Array& params, bool fHelp)
obj.push_back(Pair("keypoolsize", (int)pwalletMain->GetKeyPoolSize()));
if (pwalletMain->IsCrypted())
obj.push_back(Pair("unlocked_until", nWalletUnlockTime));
+ obj.push_back(Pair("paytxfee", ValueFromAmount(payTxFee.GetFeePerK())));
return obj;
}
-Value resendwallettransactions(const Array& params, bool fHelp)
+UniValue resendwallettransactions(const UniValue& params, bool fHelp)
{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
if (fHelp || params.size() != 0)
throw runtime_error(
"resendwallettransactions\n"
@@ -2111,10 +2241,177 @@ Value resendwallettransactions(const Array& params, bool fHelp)
LOCK2(cs_main, pwalletMain->cs_wallet);
std::vector<uint256> txids = pwalletMain->ResendWalletTransactionsBefore(GetTime());
- Array result;
+ UniValue result(UniValue::VARR);
BOOST_FOREACH(const uint256& txid, txids)
{
result.push_back(txid.ToString());
}
return result;
}
+
+UniValue listunspent(const UniValue& params, bool fHelp)
+{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
+ if (fHelp || params.size() > 3)
+ throw runtime_error(
+ "listunspent ( minconf maxconf [\"address\",...] )\n"
+ "\nReturns array of unspent transaction outputs\n"
+ "with between minconf and maxconf (inclusive) confirmations.\n"
+ "Optionally filter to only include txouts paid to specified addresses.\n"
+ "Results are an array of Objects, each of which has:\n"
+ "{txid, vout, scriptPubKey, amount, confirmations}\n"
+ "\nArguments:\n"
+ "1. minconf (numeric, optional, default=1) The minimum confirmations to filter\n"
+ "2. maxconf (numeric, optional, default=9999999) The maximum confirmations to filter\n"
+ "3. \"addresses\" (string) A json array of bitcoin addresses to filter\n"
+ " [\n"
+ " \"address\" (string) bitcoin address\n"
+ " ,...\n"
+ " ]\n"
+ "\nResult\n"
+ "[ (array of json object)\n"
+ " {\n"
+ " \"txid\" : \"txid\", (string) the transaction id \n"
+ " \"vout\" : n, (numeric) the vout value\n"
+ " \"address\" : \"address\", (string) the bitcoin address\n"
+ " \"account\" : \"account\", (string) DEPRECATED. The associated account, or \"\" for the default account\n"
+ " \"scriptPubKey\" : \"key\", (string) the script key\n"
+ " \"amount\" : x.xxx, (numeric) the transaction amount in btc\n"
+ " \"confirmations\" : n (numeric) The number of confirmations\n"
+ " }\n"
+ " ,...\n"
+ "]\n"
+
+ "\nExamples\n"
+ + HelpExampleCli("listunspent", "")
+ + HelpExampleCli("listunspent", "6 9999999 \"[\\\"1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"")
+ + HelpExampleRpc("listunspent", "6, 9999999 \"[\\\"1PGFqEzfmQch1gKD3ra4k18PNj3tTUUSqg\\\",\\\"1LtvqCaApEdUGFkpKMM4MstjcaL4dKg8SP\\\"]\"")
+ );
+
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VNUM)(UniValue::VNUM)(UniValue::VARR));
+
+ int nMinDepth = 1;
+ if (params.size() > 0)
+ nMinDepth = params[0].get_int();
+
+ int nMaxDepth = 9999999;
+ if (params.size() > 1)
+ nMaxDepth = params[1].get_int();
+
+ set<CBitcoinAddress> setAddress;
+ if (params.size() > 2) {
+ UniValue inputs = params[2].get_array();
+ for (unsigned int idx = 0; idx < inputs.size(); idx++) {
+ const UniValue& input = inputs[idx];
+ CBitcoinAddress address(input.get_str());
+ if (!address.IsValid())
+ throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, string("Invalid Bitcoin address: ")+input.get_str());
+ if (setAddress.count(address))
+ throw JSONRPCError(RPC_INVALID_PARAMETER, string("Invalid parameter, duplicated address: ")+input.get_str());
+ setAddress.insert(address);
+ }
+ }
+
+ UniValue results(UniValue::VARR);
+ vector<COutput> vecOutputs;
+ assert(pwalletMain != NULL);
+ LOCK2(cs_main, pwalletMain->cs_wallet);
+ pwalletMain->AvailableCoins(vecOutputs, false, NULL, true);
+ BOOST_FOREACH(const COutput& out, vecOutputs) {
+ if (out.nDepth < nMinDepth || out.nDepth > nMaxDepth)
+ continue;
+
+ if (setAddress.size()) {
+ CTxDestination address;
+ if (!ExtractDestination(out.tx->vout[out.i].scriptPubKey, address))
+ continue;
+
+ if (!setAddress.count(address))
+ continue;
+ }
+
+ CAmount nValue = out.tx->vout[out.i].nValue;
+ const CScript& pk = out.tx->vout[out.i].scriptPubKey;
+ UniValue entry(UniValue::VOBJ);
+ entry.push_back(Pair("txid", out.tx->GetHash().GetHex()));
+ entry.push_back(Pair("vout", out.i));
+ CTxDestination address;
+ if (ExtractDestination(out.tx->vout[out.i].scriptPubKey, address)) {
+ entry.push_back(Pair("address", CBitcoinAddress(address).ToString()));
+ if (pwalletMain->mapAddressBook.count(address))
+ entry.push_back(Pair("account", pwalletMain->mapAddressBook[address].name));
+ }
+ entry.push_back(Pair("scriptPubKey", HexStr(pk.begin(), pk.end())));
+ if (pk.IsPayToScriptHash()) {
+ CTxDestination address;
+ if (ExtractDestination(pk, address)) {
+ const CScriptID& hash = boost::get<CScriptID>(address);
+ CScript redeemScript;
+ if (pwalletMain->GetCScript(hash, redeemScript))
+ entry.push_back(Pair("redeemScript", HexStr(redeemScript.begin(), redeemScript.end())));
+ }
+ }
+ entry.push_back(Pair("amount",ValueFromAmount(nValue)));
+ entry.push_back(Pair("confirmations",out.nDepth));
+ entry.push_back(Pair("spendable", out.fSpendable));
+ results.push_back(entry);
+ }
+
+ return results;
+}
+
+UniValue fundrawtransaction(const UniValue& params, bool fHelp)
+{
+ if (!EnsureWalletIsAvailable(fHelp))
+ return NullUniValue;
+
+ if (fHelp || params.size() != 1)
+ throw runtime_error(
+ "fundrawtransaction \"hexstring\"\n"
+ "\nAdd inputs to a transaction until it has enough in value to meet its out value.\n"
+ "This will not modify existing inputs, and will add one change output to the outputs.\n"
+ "Note that inputs which were signed may need to be resigned after completion since in/outputs have been added.\n"
+ "The inputs added will not be signed, use signrawtransaction for that.\n"
+ "\nArguments:\n"
+ "1. \"hexstring\" (string, required) The hex string of the raw transaction\n"
+ "\nResult:\n"
+ "{\n"
+ " \"hex\": \"value\", (string) The resulting raw transaction (hex-encoded string)\n"
+ " \"fee\": n, (numeric) The fee added to the transaction\n"
+ " \"changepos\": n (numeric) The position of the added change output, or -1\n"
+ "}\n"
+ "\"hex\" \n"
+ "\nExamples:\n"
+ "\nCreate a transaction with no inputs\n"
+ + HelpExampleCli("createrawtransaction", "\"[]\" \"{\\\"myaddress\\\":0.01}\"") +
+ "\nAdd sufficient unsigned inputs to meet the output value\n"
+ + HelpExampleCli("fundrawtransaction", "\"rawtransactionhex\"") +
+ "\nSign the transaction\n"
+ + HelpExampleCli("signrawtransaction", "\"fundedtransactionhex\"") +
+ "\nSend the transaction\n"
+ + HelpExampleCli("sendrawtransaction", "\"signedtransactionhex\"")
+ );
+
+ RPCTypeCheck(params, boost::assign::list_of(UniValue::VSTR));
+
+ // parse hex string from parameter
+ CTransaction origTx;
+ if (!DecodeHexTx(origTx, params[0].get_str()))
+ throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
+
+ CMutableTransaction tx(origTx);
+ CAmount nFee;
+ string strFailReason;
+ int nChangePos = -1;
+ if(!pwalletMain->FundTransaction(tx, nFee, nChangePos, strFailReason))
+ throw JSONRPCError(RPC_INTERNAL_ERROR, strFailReason);
+
+ UniValue result(UniValue::VOBJ);
+ result.push_back(Pair("hex", EncodeHexTx(tx)));
+ result.push_back(Pair("changepos", nChangePos));
+ result.push_back(Pair("fee", ValueFromAmount(nFee)));
+
+ return result;
+}
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
index 92bb972cf3..44e28de0cd 100644
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -8,6 +8,8 @@
#include "base58.h"
#include "checkpoints.h"
#include "coincontrol.h"
+#include "consensus/consensus.h"
+#include "consensus/validation.h"
#include "main.h"
#include "net.h"
#include "script/script.h"
@@ -29,13 +31,13 @@ using namespace std;
*/
CFeeRate payTxFee(DEFAULT_TRANSACTION_FEE);
CAmount maxTxFee = DEFAULT_TRANSACTION_MAXFEE;
-unsigned int nTxConfirmTarget = 1;
+unsigned int nTxConfirmTarget = DEFAULT_TX_CONFIRM_TARGET;
bool bSpendZeroConfChange = true;
bool fSendFreeTransactions = false;
bool fPayAtLeastCustomFee = true;
-/**
- * Fees smaller than this (in satoshi) are considered zero fee (for transaction creation)
+/**
+ * Fees smaller than this (in satoshi) are considered zero fee (for transaction creation)
* Override with -mintxfee
*/
CFeeRate CWallet::minTxFee = CFeeRate(1000);
@@ -529,7 +531,7 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
delete pwalletdbEncryption;
}
// We now probably have half of our keys encrypted in memory, and half not...
- // die and let the user reload their unencrypted wallet.
+ // die and let the user reload the unencrypted wallet.
assert(false);
}
@@ -541,7 +543,7 @@ bool CWallet::EncryptWallet(const SecureString& strWalletPassphrase)
if (!pwalletdbEncryption->TxnCommit()) {
delete pwalletdbEncryption;
// We now have keys encrypted in memory, but not on disk...
- // die to avoid confusion and let the user reload their unencrypted wallet.
+ // die to avoid confusion and let the user reload the unencrypted wallet.
assert(false);
}
@@ -775,18 +777,6 @@ void CWallet::SyncTransaction(const CTransaction& tx, const CBlock* pblock)
}
}
-void CWallet::EraseFromWallet(const uint256 &hash)
-{
- if (!fFileBacked)
- return;
- {
- LOCK(cs_wallet);
- if (mapWallet.erase(hash))
- CWalletDB(strWalletFile).EraseTx(hash);
- }
- return;
-}
-
isminetype CWallet::IsMine(const CTxIn &txin) const
{
@@ -1059,6 +1049,7 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
{
int ret = 0;
int64_t nNow = GetTime();
+ const CChainParams& chainParams = Params();
CBlockIndex* pindex = pindexStart;
{
@@ -1070,12 +1061,12 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
pindex = chainActive.Next(pindex);
ShowProgress(_("Rescanning..."), 0); // show rescan progress in GUI as dialog or on splashscreen, if -rescan on startup
- double dProgressStart = Checkpoints::GuessVerificationProgress(pindex, false);
- double dProgressTip = Checkpoints::GuessVerificationProgress(chainActive.Tip(), false);
+ double dProgressStart = Checkpoints::GuessVerificationProgress(chainParams.Checkpoints(), pindex, false);
+ double dProgressTip = Checkpoints::GuessVerificationProgress(chainParams.Checkpoints(), chainActive.Tip(), false);
while (pindex)
{
if (pindex->nHeight % 100 == 0 && dProgressTip - dProgressStart > 0.0)
- ShowProgress(_("Rescanning..."), std::max(1, std::min(99, (int)((Checkpoints::GuessVerificationProgress(pindex, false) - dProgressStart) / (dProgressTip - dProgressStart) * 100))));
+ ShowProgress(_("Rescanning..."), std::max(1, std::min(99, (int)((Checkpoints::GuessVerificationProgress(chainParams.Checkpoints(), pindex, false) - dProgressStart) / (dProgressTip - dProgressStart) * 100))));
CBlock block;
ReadBlockFromDisk(block, pindex);
@@ -1087,7 +1078,7 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
pindex = chainActive.Next(pindex);
if (GetTime() >= nNow + 60) {
nNow = GetTime();
- LogPrintf("Still rescanning. At block %d. Progress=%f\n", pindex->nHeight, Checkpoints::GuessVerificationProgress(pindex));
+ LogPrintf("Still rescanning. At block %d. Progress=%f\n", pindex->nHeight, Checkpoints::GuessVerificationProgress(chainParams.Checkpoints(), pindex));
}
}
ShowProgress(_("Rescanning..."), 100); // hide progress dialog in GUI
@@ -1097,10 +1088,13 @@ int CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate)
void CWallet::ReacceptWalletTransactions()
{
- // If transcations aren't broadcasted, don't let them into local mempool either
+ // If transactions aren't being broadcasted, don't let them into local mempool either
if (!fBroadcastTransactions)
return;
LOCK2(cs_main, cs_wallet);
+ std::map<int64_t, CWalletTx*> mapSorted;
+
+ // Sort pending wallet transactions based on their initial wallet insertion order
BOOST_FOREACH(PAIRTYPE(const uint256, CWalletTx)& item, mapWallet)
{
const uint256& wtxid = item.first;
@@ -1109,13 +1103,19 @@ void CWallet::ReacceptWalletTransactions()
int nDepth = wtx.GetDepthInMainChain();
- if (!wtx.IsCoinBase() && nDepth < 0)
- {
- // Try to add to memory pool
- LOCK(mempool.cs);
- wtx.AcceptToMemoryPool(false);
+ if (!wtx.IsCoinBase() && nDepth < 0) {
+ mapSorted.insert(std::make_pair(wtx.nOrderPos, &wtx));
}
}
+
+ // Try to add wallet transactions to memory pool
+ BOOST_FOREACH(PAIRTYPE(const int64_t, CWalletTx*)& item, mapSorted)
+ {
+ CWalletTx& wtx = *(item.second);
+
+ LOCK(mempool.cs);
+ wtx.AcceptToMemoryPool(false);
+ }
}
bool CWalletTx::RelayWalletTransaction()
@@ -1307,7 +1307,7 @@ CAmount CWalletTx::GetChange() const
bool CWalletTx::IsTrusted() const
{
// Quick answer in most cases
- if (!IsFinalTx(*this))
+ if (!CheckFinalTx(*this))
return false;
int nDepth = GetDepthInMainChain();
if (nDepth >= 1)
@@ -1413,7 +1413,7 @@ CAmount CWallet::GetUnconfirmedBalance() const
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
{
const CWalletTx* pcoin = &(*it).second;
- if (!IsFinalTx(*pcoin) || (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0))
+ if (!CheckFinalTx(*pcoin) || (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0))
nTotal += pcoin->GetAvailableCredit();
}
}
@@ -1458,7 +1458,7 @@ CAmount CWallet::GetUnconfirmedWatchOnlyBalance() const
for (map<uint256, CWalletTx>::const_iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)
{
const CWalletTx* pcoin = &(*it).second;
- if (!IsFinalTx(*pcoin) || (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0))
+ if (!CheckFinalTx(*pcoin) || (!pcoin->IsTrusted() && pcoin->GetDepthInMainChain() == 0))
nTotal += pcoin->GetAvailableWatchOnlyCredit();
}
}
@@ -1482,7 +1482,7 @@ CAmount CWallet::GetImmatureWatchOnlyBalance() const
/**
* populate vCoins with vector of available COutputs.
*/
-void CWallet::AvailableCoins(vector<COutput>& vCoins, bool fOnlyConfirmed, const CCoinControl *coinControl) const
+void CWallet::AvailableCoins(vector<COutput>& vCoins, bool fOnlyConfirmed, const CCoinControl *coinControl, bool fIncludeZeroValue) const
{
vCoins.clear();
@@ -1493,7 +1493,7 @@ void CWallet::AvailableCoins(vector<COutput>& vCoins, bool fOnlyConfirmed, const
const uint256& wtxid = it->first;
const CWalletTx* pcoin = &(*it).second;
- if (!IsFinalTx(*pcoin))
+ if (!CheckFinalTx(*pcoin))
continue;
if (fOnlyConfirmed && !pcoin->IsTrusted())
@@ -1509,8 +1509,8 @@ void CWallet::AvailableCoins(vector<COutput>& vCoins, bool fOnlyConfirmed, const
for (unsigned int i = 0; i < pcoin->vout.size(); i++) {
isminetype mine = IsMine(pcoin->vout[i]);
if (!(IsSpent(wtxid, i)) && mine != ISMINE_NO &&
- !IsLockedCoin((*it).first, i) && pcoin->vout[i].nValue > 0 &&
- (!coinControl || !coinControl->HasSelected() || coinControl->IsSelected((*it).first, i)))
+ !IsLockedCoin((*it).first, i) && (pcoin->vout[i].nValue > 0 || fIncludeZeroValue) &&
+ (!coinControl || !coinControl->HasSelected() || coinControl->fAllowOtherInputs || coinControl->IsSelected((*it).first, i)))
vCoins.push_back(COutput(pcoin, i, nDepth, (mine & ISMINE_SPENDABLE) != ISMINE_NO));
}
}
@@ -1670,25 +1670,108 @@ bool CWallet::SelectCoins(const CAmount& nTargetValue, set<pair<const CWalletTx*
AvailableCoins(vCoins, true, coinControl);
// coin control -> return all selected outputs (we want all selected to go into the transaction for sure)
- if (coinControl && coinControl->HasSelected())
+ if (coinControl && coinControl->HasSelected() && !coinControl->fAllowOtherInputs)
{
BOOST_FOREACH(const COutput& out, vCoins)
{
- if(!out.fSpendable)
- continue;
+ if (!out.fSpendable)
+ continue;
nValueRet += out.tx->vout[out.i].nValue;
setCoinsRet.insert(make_pair(out.tx, out.i));
}
return (nValueRet >= nTargetValue);
}
- return (SelectCoinsMinConf(nTargetValue, 1, 6, vCoins, setCoinsRet, nValueRet) ||
- SelectCoinsMinConf(nTargetValue, 1, 1, vCoins, setCoinsRet, nValueRet) ||
- (bSpendZeroConfChange && SelectCoinsMinConf(nTargetValue, 0, 1, vCoins, setCoinsRet, nValueRet)));
+ // calculate value from preset inputs and store them
+ set<pair<const CWalletTx*, uint32_t> > setPresetCoins;
+ CAmount nValueFromPresetInputs = 0;
+
+ std::vector<COutPoint> vPresetInputs;
+ if (coinControl)
+ coinControl->ListSelected(vPresetInputs);
+ BOOST_FOREACH(const COutPoint& outpoint, vPresetInputs)
+ {
+ map<uint256, CWalletTx>::const_iterator it = mapWallet.find(outpoint.hash);
+ if (it != mapWallet.end())
+ {
+ const CWalletTx* pcoin = &it->second;
+ // Clearly invalid input, fail
+ if (pcoin->vout.size() <= outpoint.n)
+ return false;
+ nValueFromPresetInputs += pcoin->vout[outpoint.n].nValue;
+ setPresetCoins.insert(make_pair(pcoin, outpoint.n));
+ } else
+ return false; // TODO: Allow non-wallet inputs
+ }
+
+ // remove preset inputs from vCoins
+ for (vector<COutput>::iterator it = vCoins.begin(); it != vCoins.end() && coinControl && coinControl->HasSelected();)
+ {
+ if (setPresetCoins.count(make_pair(it->tx, it->i)))
+ it = vCoins.erase(it);
+ else
+ ++it;
+ }
+
+ bool res = nTargetValue <= nValueFromPresetInputs ||
+ SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 1, 6, vCoins, setCoinsRet, nValueRet) ||
+ SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 1, 1, vCoins, setCoinsRet, nValueRet) ||
+ (bSpendZeroConfChange && SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, vCoins, setCoinsRet, nValueRet));
+
+ // because SelectCoinsMinConf clears the setCoinsRet, we now add the possible inputs to the coinset
+ setCoinsRet.insert(setPresetCoins.begin(), setPresetCoins.end());
+
+ // add preset inputs to the total value selected
+ nValueRet += nValueFromPresetInputs;
+
+ return res;
+}
+
+bool CWallet::FundTransaction(CMutableTransaction& tx, CAmount &nFeeRet, int& nChangePosRet, std::string& strFailReason)
+{
+ vector<CRecipient> vecSend;
+
+ // Turn the txout set into a CRecipient vector
+ BOOST_FOREACH(const CTxOut& txOut, tx.vout)
+ {
+ CRecipient recipient = {txOut.scriptPubKey, txOut.nValue, false};
+ vecSend.push_back(recipient);
+ }
+
+ CCoinControl coinControl;
+ coinControl.fAllowOtherInputs = true;
+ BOOST_FOREACH(const CTxIn& txin, tx.vin)
+ coinControl.Select(txin.prevout);
+
+ CReserveKey reservekey(this);
+ CWalletTx wtx;
+ if (!CreateTransaction(vecSend, wtx, reservekey, nFeeRet, nChangePosRet, strFailReason, &coinControl, false))
+ return false;
+
+ if (nChangePosRet != -1)
+ tx.vout.insert(tx.vout.begin() + nChangePosRet, wtx.vout[nChangePosRet]);
+
+ // Add new txins (keeping original txin scriptSig/order)
+ BOOST_FOREACH(const CTxIn& txin, wtx.vin)
+ {
+ bool found = false;
+ BOOST_FOREACH(const CTxIn& origTxIn, tx.vin)
+ {
+ if (txin.prevout.hash == origTxIn.prevout.hash && txin.prevout.n == origTxIn.prevout.n)
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ tx.vin.push_back(txin);
+ }
+
+ return true;
}
-bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend,
- CWalletTx& wtxNew, CReserveKey& reservekey, CAmount& nFeeRet, int& nChangePosRet, std::string& strFailReason, const CCoinControl* coinControl)
+bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, CAmount& nFeeRet,
+ int& nChangePosRet, std::string& strFailReason, const CCoinControl* coinControl, bool sign)
{
CAmount nValue = 0;
unsigned int nSubtractFeeFromAmount = 0;
@@ -1891,23 +1974,43 @@ bool CWallet::CreateTransaction(const vector<CRecipient>& vecSend,
// Sign
int nIn = 0;
+ CTransaction txNewConst(txNew);
BOOST_FOREACH(const PAIRTYPE(const CWalletTx*,unsigned int)& coin, setCoins)
- if (!SignSignature(*this, *coin.first, txNew, nIn++))
+ {
+ bool signSuccess;
+ const CScript& scriptPubKey = coin.first->vout[coin.second].scriptPubKey;
+ CScript& scriptSigRes = txNew.vin[nIn].scriptSig;
+ if (sign)
+ signSuccess = ProduceSignature(TransactionSignatureCreator(this, &txNewConst, nIn, SIGHASH_ALL), scriptPubKey, scriptSigRes);
+ else
+ signSuccess = ProduceSignature(DummySignatureCreator(this), scriptPubKey, scriptSigRes);
+
+ if (!signSuccess)
{
strFailReason = _("Signing transaction failed");
return false;
}
+ nIn++;
+ }
+
+ unsigned int nBytes = ::GetSerializeSize(txNew, SER_NETWORK, PROTOCOL_VERSION);
+
+ // Remove scriptSigs if we used dummy signatures for fee calculation
+ if (!sign) {
+ BOOST_FOREACH (CTxIn& vin, txNew.vin)
+ vin.scriptSig = CScript();
+ }
// Embed the constructed transaction data in wtxNew.
*static_cast<CTransaction*>(&wtxNew) = CTransaction(txNew);
// Limit size
- unsigned int nBytes = ::GetSerializeSize(*(CTransaction*)&wtxNew, SER_NETWORK, PROTOCOL_VERSION);
if (nBytes >= MAX_STANDARD_TX_SIZE)
{
strFailReason = _("Transaction too large");
return false;
}
+
dPriority = wtxNew.ComputePriority(dPriority, nBytes);
// Can we complete this as a free transaction?
@@ -2039,7 +2142,7 @@ DBErrors CWallet::LoadWallet(bool& fFirstRunRet)
setKeyPool.clear();
// Note: can't top-up keypool here, because wallet is locked.
// User will be prompted to unlock wallet the next operation
- // the requires a new key.
+ // that requires a new key.
}
}
@@ -2280,7 +2383,7 @@ std::map<CTxDestination, CAmount> CWallet::GetAddressBalances()
{
CWalletTx *pcoin = &walletEntry.second;
- if (!IsFinalTx(*pcoin) || !pcoin->IsTrusted())
+ if (!CheckFinalTx(*pcoin) || !pcoin->IsTrusted())
continue;
if (pcoin->IsCoinBase() && pcoin->GetBlocksToMaturity() > 0)
@@ -2403,7 +2506,7 @@ set< set<CTxDestination> > CWallet::GetAddressGroupings()
return ret;
}
-set<CTxDestination> CWallet::GetAccountAddresses(string strAccount) const
+std::set<CTxDestination> CWallet::GetAccountAddresses(const std::string& strAccount) const
{
LOCK(cs_wallet);
set<CTxDestination> result;
@@ -2481,6 +2584,17 @@ void CWallet::UpdatedTransaction(const uint256 &hashTx)
}
}
+void CWallet::GetScriptForMining(boost::shared_ptr<CReserveScript> &script)
+{
+ boost::shared_ptr<CReserveKey> rKey(new CReserveKey(this));
+ CPubKey pubkey;
+ if (!rKey->GetReservedKey(pubkey))
+ return;
+
+ script = rKey;
+ script->reserveScript = CScript() << ToByteVector(pubkey) << OP_CHECKSIG;
+}
+
void CWallet::LockCoin(COutPoint& output)
{
AssertLockHeld(cs_wallet); // setLockedCoins
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
index 4dbb0e2e57..f36c98e9fc 100644
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -3,8 +3,8 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_WALLET_H
-#define BITCOIN_WALLET_H
+#ifndef BITCOIN_WALLET_WALLET_H
+#define BITCOIN_WALLET_WALLET_H
#include "amount.h"
#include "key.h"
@@ -28,6 +28,8 @@
#include <utility>
#include <vector>
+#include <boost/shared_ptr.hpp>
+
/**
* Settings
*/
@@ -44,6 +46,8 @@ static const CAmount DEFAULT_TRANSACTION_FEE = 0;
static const CAmount nHighTransactionFeeWarning = 0.01 * COIN;
//! -maxtxfee default
static const CAmount DEFAULT_TRANSACTION_MAXFEE = 0.1 * COIN;
+//! -txconfirmtarget default
+static const unsigned int DEFAULT_TX_CONFIRM_TARGET = 2;
//! -maxtxfee will warn if called with a higher fee than this amount (in satoshis)
static const CAmount nHighTransactionMaxFeeWarning = 100 * nHighTransactionFeeWarning;
//! Largest (in bytes) free transaction we're willing to create
@@ -494,7 +498,7 @@ public:
SetNull();
}
- CWallet(std::string strWalletFileIn)
+ CWallet(const std::string& strWalletFileIn)
{
SetNull();
@@ -540,7 +544,7 @@ public:
//! check whether we are allowed to upgrade (or already support) to the named feature
bool CanSupportFeature(enum WalletFeature wf) { AssertLockHeld(cs_wallet); return nWalletMaxVersion >= wf; }
- void AvailableCoins(std::vector<COutput>& vCoins, bool fOnlyConfirmed=true, const CCoinControl *coinControl = NULL) const;
+ void AvailableCoins(std::vector<COutput>& vCoins, bool fOnlyConfirmed=true, const CCoinControl *coinControl = NULL, bool fIncludeZeroValue=false) const;
bool SelectCoinsMinConf(const CAmount& nTargetValue, int nConfMine, int nConfTheirs, std::vector<COutput> vCoins, std::set<std::pair<const CWalletTx*,unsigned int> >& setCoinsRet, CAmount& nValueRet) const;
bool IsSpent(const uint256& hash, unsigned int n) const;
@@ -613,7 +617,6 @@ public:
bool AddToWallet(const CWalletTx& wtxIn, bool fFromLoadWallet, CWalletDB* pwalletdb);
void SyncTransaction(const CTransaction& tx, const CBlock* pblock);
bool AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pblock, bool fUpdate);
- void EraseFromWallet(const uint256 &hash);
int ScanForWalletTransactions(CBlockIndex* pindexStart, bool fUpdate = false);
void ReacceptWalletTransactions();
void ResendWalletTransactions(int64_t nBestBlockTime);
@@ -624,8 +627,9 @@ public:
CAmount GetWatchOnlyBalance() const;
CAmount GetUnconfirmedWatchOnlyBalance() const;
CAmount GetImmatureWatchOnlyBalance() const;
- bool CreateTransaction(const std::vector<CRecipient>& vecSend,
- CWalletTx& wtxNew, CReserveKey& reservekey, CAmount& nFeeRet, int& nChangePosRet, std::string& strFailReason, const CCoinControl *coinControl = NULL);
+ bool FundTransaction(CMutableTransaction& tx, CAmount& nFeeRet, int& nChangePosRet, std::string& strFailReason);
+ bool CreateTransaction(const std::vector<CRecipient>& vecSend, CWalletTx& wtxNew, CReserveKey& reservekey, CAmount& nFeeRet, int& nChangePosRet,
+ std::string& strFailReason, const CCoinControl *coinControl = NULL, bool sign = true);
bool CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey);
static CFeeRate minTxFee;
@@ -643,7 +647,7 @@ public:
std::set< std::set<CTxDestination> > GetAddressGroupings();
std::map<CTxDestination, CAmount> GetAddressBalances();
- std::set<CTxDestination> GetAccountAddresses(std::string strAccount) const;
+ std::set<CTxDestination> GetAccountAddresses(const std::string& strAccount) const;
isminetype IsMine(const CTxIn& txin) const;
CAmount GetDebit(const CTxIn& txin, const isminefilter& filter) const;
@@ -678,6 +682,13 @@ public:
}
}
+ void GetScriptForMining(boost::shared_ptr<CReserveScript> &script);
+ void ResetRequestCount(const uint256 &hash)
+ {
+ LOCK(cs_wallet);
+ mapRequestCount[hash] = 0;
+ };
+
unsigned int GetKeyPoolSize()
{
AssertLockHeld(cs_wallet); // setKeyPool
@@ -733,7 +744,7 @@ public:
};
/** A key allocated from the key pool. */
-class CReserveKey
+class CReserveKey : public CReserveScript
{
protected:
CWallet* pwallet;
@@ -754,6 +765,7 @@ public:
void ReturnKey();
bool GetReservedKey(CPubKey &pubkey);
void KeepKey();
+ void KeepScript() { KeepKey(); }
};
@@ -869,4 +881,4 @@ private:
std::vector<char> _ssExtra;
};
-#endif // BITCOIN_WALLET_H
+#endif // BITCOIN_WALLET_WALLET_H
diff --git a/src/wallet/wallet_ismine.h b/src/wallet/wallet_ismine.h
index 6293df8b10..5b9b0e0841 100644
--- a/src/wallet/wallet_ismine.h
+++ b/src/wallet/wallet_ismine.h
@@ -3,8 +3,8 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_WALLET_ISMINE_H
-#define BITCOIN_WALLET_ISMINE_H
+#ifndef BITCOIN_WALLET_WALLET_ISMINE_H
+#define BITCOIN_WALLET_WALLET_ISMINE_H
#include "key.h"
#include "script/standard.h"
@@ -26,4 +26,4 @@ typedef uint8_t isminefilter;
isminetype IsMine(const CKeyStore& keystore, const CScript& scriptPubKey);
isminetype IsMine(const CKeyStore& keystore, const CTxDestination& dest);
-#endif // BITCOIN_WALLET_ISMINE_H
+#endif // BITCOIN_WALLET_WALLET_ISMINE_H
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp
index de56a2d1af..f777926e72 100644
--- a/src/wallet/walletdb.cpp
+++ b/src/wallet/walletdb.cpp
@@ -6,6 +6,7 @@
#include "wallet/walletdb.h"
#include "base58.h"
+#include "consensus/validation.h"
#include "main.h"
#include "protocol.h"
#include "serialize.h"
@@ -915,7 +916,7 @@ bool CWalletDB::Recover(CDBEnv& dbenv, const std::string& filename, bool fOnlyKe
}
std::vector<CDBEnv::KeyValPair> salvagedData;
- bool allOK = dbenv.Salvage(newFilename, true, salvagedData);
+ bool fSuccess = dbenv.Salvage(newFilename, true, salvagedData);
if (salvagedData.empty())
{
LogPrintf("Salvage(aggressive) found no records in %s.\n", newFilename);
@@ -923,7 +924,6 @@ bool CWalletDB::Recover(CDBEnv& dbenv, const std::string& filename, bool fOnlyKe
}
LogPrintf("Salvage(aggressive) found %u records\n", salvagedData.size());
- bool fSuccess = allOK;
boost::scoped_ptr<Db> pdbCopy(new Db(dbenv.dbenv, 0));
int ret = pdbCopy->open(NULL, // Txn pointer
filename.c_str(), // Filename
diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h
index a1c38b9d3d..bc1a104b5b 100644
--- a/src/wallet/walletdb.h
+++ b/src/wallet/walletdb.h
@@ -3,8 +3,8 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifndef BITCOIN_WALLETDB_H
-#define BITCOIN_WALLETDB_H
+#ifndef BITCOIN_WALLET_WALLETDB_H
+#define BITCOIN_WALLET_WALLETDB_H
#include "amount.h"
#include "wallet/db.h"
@@ -138,5 +138,6 @@ private:
};
bool BackupWallet(const CWallet& wallet, const std::string& strDest);
+void ThreadFlushWalletDB(const std::string& strFile);
-#endif // BITCOIN_WALLETDB_H
+#endif // BITCOIN_WALLET_WALLETDB_H